const 修飾普通變數
表示變數的值不能被改變。下面兩條語句(第2
行和第3
行)表示的意思一致。
int a;
const int ca = 42;
//int const ca = 42;
const 修飾指標
指向常量的指標不能改變其指物件的值。第 5
行程式碼是錯誤的。
int a = 42;
const int * ip = &a;
int const * ipp = &a;
//*ip = 42;
常量指標不能改變其指向,也就意味著它必須要初始化。但是,可以透過常量指標改變其所指物件的值,如第 6
行程式碼,最終列印結果會是 56
。
int a = 42;
int b = 25;
int * const p = &a;
//p = &b;
*p = 56;
cout << "a: " << a << endl;
常量指標,同時它指向一個常量
const int a = 42;
const int * const p = &a;
const 與引用
臨時物件的常引用。第2
行程式碼會報錯,不能將double
型別引用繫結到int
型別變數上。但是,加了const
修飾後,就沒有問題了。
int a = 42;
//double &f = a;
const double &f = a;
本質上,const
引用,引用了一個不可改變的臨時變數。編譯器把程式碼處理成了如下形式
const double temp = a;
const double &f = temp;
const 修飾函式引數
如果第1
行程式碼引數中沒有const
,則會報錯,不能將一個非const
左值引用型別繫結到一個右值(臨時物件)上。故將引數修改為常引用
void foo(const std::string &str)
{
cout << str << endl;
}
int main()
{
foo("abcd");
return 0;
}
const 修飾類資料成員
const
修飾資料成員,稱為常資料成員,可能被普通成員函式和常成員函式來使用,不可以更改。
必須初始化,可以在類中(不推薦),或者初始化列表中(這是在類物件生成之前唯一一次改變const
成員的機會了)。
class A
{
public:
A(int i)
:_ci(i)
{
cout << "A(int i)" << endl;
}
~A()
{
cout << "~A()" << endl;
}
void dis()
{
cout << _ci << endl;
}
private:
//const int _ci = 100; // 不推薦
const int _ci;
};
int main()
{
A a(42);
a.dis();
return 0;
}
const 修飾類成員函式
-
const
修飾成員函式,承諾在本函式內部不會改變類內的資料成員,因此,也只能呼叫承諾不會改變成員的其它const
成員函式,而不能呼叫其它非const
成員函式。 -
const
修飾成員函式,放在宣告之後,實現體之前。 -
第
23
行程式碼,它只能呼叫const
成員函式,如果函式dis()
是沒有const
修飾的話,第23
行程式碼將會報錯。
class A
{
public:
A(int i, double d, float f)
:_ci(i), _cd(d), _fe(f)
{
cout << "A()" << endl;
}
~A()
{
cout << "~A()" << endl;
}
void dis() const
{
cout << _fe << endl;
}
void foo() const
{
//_fe = 4.56;
dis();
}
private:
const int _ci;
const double _cd;
float _fe;
};
int main()
{
A a(42, 25, 3.14);
a.foo();
return 0;
}
const 修飾物件
const
修飾物件,保證在物件層面,不會修改資料成員。所以const
物件,只能呼叫const
成員函式。
參考資料
Stanley等《C++ Primer e5》
王桂林《C++基礎與提高》