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的值,後者則是代表在函式中不允許改變這個物件的值