關鍵字const多才多藝,你可以用它在class外部修飾global或namespace作用域中的常量,或修飾檔案、函式、或區塊作用域(block scope)中被宣告為static的物件,也可以修飾class內部的static和non-static成員變數。
面對指標,也可以指向指標本身、指標指向物,或兩者都(或都不)是const。
規則:如果const出現在星號左邊,表示被指物是常量;如果出現在星號右邊,表示指標自身是常量;如果出現在星號兩邊,表示被指物和指標兩者都是常量。
如果被指物是常量(const出現在星號左邊),有些習慣將const寫在型別之前,有些習慣會把它寫在型別之後,星號之前,兩者寫法意義相同:
voidf1(
const widget* pw)
;//f1獲得乙個指標,指向乙個常量的(不變的)widget物件
void
f2(widget const
* pw )
;//f2也是
好吧,我承認我喜歡第一種寫法,但是都要懂得這些寫法。
const_iterator這個迭代器不得指向不同的東西,但它所指的東西的值是可以改動的。
注意下面的案例,自己經常弄混。
using
namespace std;
vector<
int> vec;..
.const vevtor<
int>
::iterator iter = vec.
begin()
;*iter =10;
//沒問題,改變iter所指物
++iter;
//錯誤,iter是指標
vector<
int>
::const_iterator citer = vec.
begin()
;*citer =10;
//錯誤,*citer是const
++citer;
//沒問題,改變citer
令函式返回一直常量值,往往可以降低因客戶錯誤而造成的意外,而又不至於放棄安全性和高效性。
舉例:
rational a,b,c;..
.(a * b)
= c;
//在a * b的成果上呼叫operator=
因為此允許對兩值乘積做賦值動物也就沒什麼意思了。將operator*的回傳值宣告為const可以預防這個"沒意思的賦值動作",這就是該那麼做的原因。
將const實施於成員函式的目的,是為了確認該成員函式可作用於const物件身上。
這一類成員函式的重要性在於:
它們使得class介面比較容易被理解。這是因為,得知哪個函式可以改動物件內容而哪個函式不行,很是重要;
它們使"操作const物件"成為可能。而此技術可行的前提是,我們有const成員函式可用於處理取得(並經修飾而成)的const物件。
好吧,我承認我對於原因2難以理解,先說明記錄一下。
對於const成員函式,主要有兩個流行概念:bitwise constness(又稱physical constness)和logical constness。
bitwise constness:指成員函式只是在不更改物件之任何成員變數(除外)時才可以說是const。也就是說它不更改物件內
的任何乙個bit。
這種概念會有時候導致反直觀結果。如果乙個更改了"指標所指物"的成員函式雖然不能算是const,但如果只有指標(而非其所指物)隸屬於物件,那麼稱此函式為bitwise const不會引發編譯器異議。例如:
class
ctextblock
private
:char
* ptext;
}const ctextblock cctb
("hello");
//宣告乙個常量物件。
char
* pc =
&cctb[0]
;//呼叫const operator取得乙個指標,指向cctb的資料
*pc =
'j';
//cctb現在有了"jellp"這樣的內容
如果在const成員函式裡面需要更改某個資料怎麼辦?解決辦法就是利用c++的乙個與const相關的擺動場:mutable
(可變的)。mutable釋放掉non-static成員變數的bitwise constness約束。具體使用如下:
class
ctextblock
;std::size_t ctextblock
::length()
const
}
如果const成員函式和non-const成員函式**等價時,為避免**重複的安全做法,我們可以使用轉型來處理這一問題。
class
textblock
char
&operator
(std::size_t position)
//現在只呼叫const op..
.};
此處進行了兩次轉型:
將*this
從其原始型別textblock&
轉型為const textblock&
。
使用const_cast
從const operator的返回值中移除const。
需要注意的是,"使用const成員函式呼叫non-const成員函式"是一種錯誤行為,因為物件有可能因為被改動了,這導致使用const修飾的不改動的那個物件被改動了。
目前知識看到這裡,之後繼續更新。
《effective c++》改善程式與設計的55個具體做法——條款03
《c++ primer》第5版
const關鍵字用法
1 const常量 如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 邊際效應 2 const修飾類的資料成員 class a const...
關鍵字const詳解
關鍵字const 1 用關鍵字const定義變數指所定義的常量。即恆定的變數,即不可改變的變數。例 const int i 10 此時 i 就是乙個整型的常量,其值不能改變。在c 中如果用const定義乙個物件,那麼物件中的成員變數就是常數,不能改變 只能為初始化的值 如果用const定義類中的成員...
const關鍵字用法
const修飾符表示該變數的值不能被改變。但得分兩種情況討論 修飾普通變數和修飾指標變數。1.普通常量 const int foo 5 表示foo不能再被賦值 foo 8 錯誤,因為foo是const修飾為不可變常量了 2.修飾指標 const char p test 表示p指向 的記憶體不可改變,...