1. 程式人生 > >const總結大全,不斷更新,面試必備

const總結大全,不斷更新,面試必備

一.const型別的變數在宣告的時候一定要進行初始化,否則會報錯。

二.在全域性作用域中定義非const物件,它在整個程式中都可以訪問
例如:
//file1.cc
int counter;
//file2.cc
extern int counter;
++counter;

在全域性作用域中定義const變數意味著這個變數是該檔案的區域性變數,需要通過制定變數型別為extern,才可以在整個程式中使用該變數。
例如:
//file1.cc
extern const int counter=0;
//file2.cc
extern const int counter;
++counter;

三.const應用和非const引用
非const引用只能繫結到與該引用型別一致的變數上,並且不可以初始化為右值。
例如:
double a=1.22;
int &b=a;  //錯誤
double &c=a; //正確
int r=10;
int &d=r+55; //錯誤 
因為編譯器會把程式碼進行轉化:
int temp=a;
int &b=temp;
也就是說b繫結的不是a,而是temp,這樣嘗試通過b來改變a是不可能成功的,所以這樣是不合法的。

const引用則可以繫結到不同的型別上或者繫結右值。
例如:
double a=1.22;
const int &b=a;  //正確
const double &c=a; //正確
int r=10;
const int &d=r+55; //正確

四.指向const的指標
例如:
double a=1.01;
const double * b=&a;
*b=2.1; //這顯然是錯誤的
a=2.1; //這是正確的,a和*b的值都會變成2.01,有些人將之稱為自以為指向const的指標

五.const指標
例如:
int a=10;
int * const b=&a; //這意味著b只能指向a
a=20;
*b=30; //上面兩句均可以改變變數的值。

另外和第四條有關係,並且比較有意思的是:
typedef int * pint;
int value=10;
const pint a=&value;
pint const b=&value;
int * const c=&value; //3句話的效果是一致的

六,  如函式接受非引用/指標型別,形參型別/實參都忽略const. 即無論傳遞const或非const物件給授受非引用型別的函式,都使用相同的例項化.

七.在類型別中,類成員函式,前置const與後置const不同,前置const代表返回值為const型別,後置const代表,函式中不允許修改物件。

const int getvalue()
{return val;}

int getvalue() const
{return val;}

前者需要返回一個const int的值,後者則是代表在函式中不允許改變這個物件的值