int i = 10;
const int & ref = 42;
const int & ref1 = r + i;
double d = 3.14;
const int &ref2 = d;
以繫結到不同型別的ref2為例解釋原因,編譯器會把ref2相關的**轉換如下:
int temp = d;
const int &ref2 = temp; // bind ref2 to temporary
ref2實際上是繫結到乙個臨時變數上。
4.關於指標
·指向const物件的指標(指標所指向的內容為常量)
宣告或定義的格式如下(定義時可以不初始化):
const 《型別說明符》 *《變數名》 …… [1]
《型別說明符》 const *《變數名》 …… [2]
[1]和[2]的定義是完全等價的。
例如:const int i = 100;
const int *cptr = &i;
或者int const *cptr = &i;
允許把非const 物件的位址賦給指向const 物件的指標,例如:
double dval = 3.14;
const double *cdptr = &dval; 但不能修改dval的值
不允許把乙個const物件的位址賦給乙個普通的非指向const物件的指標,例如:
const double dval = 3.14;
double *ptr = &dval; // error
·const指標(指標本身為常量)
宣告或定義的格式如下(定義時必須初始化):
《型別說明符》 *const 《變數名》 = ……
例如:int errnumb = 0;
int ival = 10;
int *const curerr = &errnumb;
curerr = &ival; // error
*curerr = 1; // ok
·指向const物件的const指標(指標本身和指向的內容均為常量)
宣告或定義的格式如下(定義時必須初始化):
const 《型別說明符》 *const 《變數名》 = ……
例如:const double pi = 3.14159;
const double dval = 3.14;
const double *const pi_ptr = π
pi_ptr = &dval; // error
*pi_ptr = dval; // error
5.關於一般函式
·修飾函式的引數
class a;
void func1(const int ii不能被修改
void func3 (const a &ra);// ra所引用的物件不能被修改
void func2 (const char *pstr); // pstr所指向的內容不能被修改
·修飾函式的返回值
如果函式返回值採用「值傳遞方式」,由於函式會把返回值複製到外部臨時的儲存單元中,加const 修飾沒有任何價值。
例如不要把函式int getint(void) 寫成const int getint(void)。
如果給以「指標傳遞」方式的函式返回值加const 修飾,那麼函式返回值(即指標)的內容不能被修改,該返回值只能被賦給加const 修飾的同型別指標。例如函式
const char * getstring(void);
如下語句將出現編譯錯誤:
char *str = getstring();
正確的用法是
const char *str = getstring();
返回引用:const int &func2(); // 注意千萬不要返回區域性物件的引用,否則會報執行時錯誤:因為一旦函式結束,區域性物件被釋放,函式返回值指向了乙個對程式來說不再有效的記憶體空間。
返回指標:const int *func3(); // 注意千萬不要返回指向區域性物件的指標,因為一旦函式結束,區域性物件被釋放,返回的指標變成了指向乙個不再存在的物件的懸垂指標。
6.關於類
class a
;·修飾成員變數
const int size; // 對於const的成員變數,[1]必須在建構函式裡面進行初始化;[2]只能通過初始化成員列表來初始化;[3]試圖在建構函式體內對const成員變數進行初始化會引起編譯錯誤。
·修飾類成員函式
void func() const; // const成員函式中不允許對資料成員進行修改,如果修改,編譯器將報錯。如果某成員函式不需要對資料成員進行修改,最好將其宣告為const 成員函式,這將大大提高程式的健壯性。
·修飾類物件
const a a; // 類物件a 只能呼叫const 成員函式,否則編譯器報錯。
·修飾類成員函式的返回值
const a operator+(const a &) const; // 前乙個const 用來修飾過載函式operator+的返回值,可防止返回值作為左值進行賦值操作。
例如:a a;
a b;
a c;
a + b = c; // errro: 如果在沒有const 修飾返回值的情況下,編譯器不會報錯。
const用法總結
看到const 關鍵字,很多程式設計師想到的可能是const 常量,這可有點象踩到陷井上還不知道自己危險了。讀讀以下文字會使你對c 中的const有乙個全面的認識。const 是c 中常用的型別修飾符,有某些微妙的應用場合,如果沒有搞清本源,則錯誤在所難免。本篇中將對const進行辨析。溯其本源,究...
Const用法小結
常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 邊際效應 修飾類的資料成員。如 class a const資料成員只在某個物件生存...
C 中const用法總結
c 中const用法總結 月光林地 部落格園 修飾普通變數和指標 const修飾變數,一般有兩種寫法 consttypevalue typeconstvalue 這兩種寫法在本質上是一樣的。它的含義是 const修飾的型別為type的變數value是不可變的。對於乙個非指標的型別type,無論怎麼寫...