C++ 中const的總結
const宣告一個只讀變數
與其他變數不同,除非特別說明,在全域性作用域宣告的const變數是定義該物件的檔案的區域性變數,非const變數預設為extern。要是const變數能夠在其他的檔案中訪問,必須顯示地指定它為extern。
const引用能指向const變數或非const變數,非const引用只能指向非const物件
const引用可以初始化為不同型別的物件或者初始化為右值同樣的初始化對於非const引用卻是不合法的,而且導致編譯錯誤
int i = 42;
double dval = 3.14;
const int &ref1 = 42; //右值
const int &ref2 = dval ; (這裡編譯器會轉換為 int temp = dval; const int &ref2 = temp)如果這裡ref2不是const,那麼可以給ref2賦值,但實際上修改的是temp,所以不允許將非const引用初始化為不同型別的物件在const成員函式中,this指標是一個const型別的const指標,非const成員函式的中this位指向類型別的const指標。因此下面的例子不合法
class A
{
public:
A():x(32){}
A &display_x() const //Error:無法將const A& 轉換為 A&
{
cout << x;
return *this;
}
void set_x(int val)
{
x = val;
}
private:
int x;
};
如果在前面加上const 的話就不能這樣使用
A a = A();
a.diaplay_x().set_x();
一個解決方法是覆蓋display_x()函式,則正確的定義如下
class A
{
public:
A():x(32){}
const A &display_x() const
{
cout << x;
return *this;
}
A &display_x()
{
cout << x;
return *this;
}
void set_x(int val)
{
x = val;
}
private:
int x;
};const 物件只能只能使用const 成員(資料成員和函式成員)。非const物件可以使用任意成員。
如果要在const修改資料成員,則資料成員必須用mutable 宣告
建構函式或解構函式不可以使用型別限定符,也就不可以宣告為const。
成員函式如果宣告為const,則在定義時也需要加上const
對於const的資料成員必須在初始化列表初始化。唯一例外的是static const int變數可以在類中定義初始化(注意這裡限定為整形,這裡包括char、int、 long、列舉,不包括double,至於為什麼目前不清楚)這裡不同編譯器處理並不同,VS2010上double型的報錯,而在codeblock 編譯卻是合法的