const用法總結 Cby K

2021-11-07 12:18:52 字數 2618 閱讀 2678

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,無論怎麼寫...