https://leetcode.cn/problems/trapping-rain-water/description/?envType=study-plan-v2&envId=top-interview-150 對於一個可以構成“碗”的序列,最後裝滿水的話應該和最短的一邊齊平,那麼可以左右各遍歷 ...
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++基礎與提高》