C++ const關鍵詞用法
【轉載】轉自 https://www.cnblogs.com/chogen/p/4574118.html
const是一個C++語言的限定符,它限定一個變量不允許被改變。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在觀看別人代碼的時候,清晰理解const所起的作用,對理解對方的程序也有一些幫助。
1. 修飾常量
用const修飾的變量是不可變的,以下兩種定義形式在本質上是一樣的:
const int a = 10; int const a = 10;
2. 修飾指針
如果const位於*的左側,則const就是用來修飾指針所指向的變量,即指針指向為常量;
如果const位於*的右側,const就是修飾指針本身,即指針本身是常量。
因此,推薦使用int const* p,而不是使用const int* p(雖然兩者意義完全一樣),這樣更容易理解。
int a = 10; const int* p = &a; // 指針指向的內容不能變 int const* p = &a; // 同上 int* const p = &a; // 指針本身不能變 const int* const p = &a; // 兩者都不能變 int const* const p = &a; // 同上
3. 修飾引用
以下兩種定義形式在本質上是一樣的:
int a = 10; const int& b = a; int const& b = a;
4. 修飾函數參數
用const修飾函數參數,傳遞過來的參數在函數內不可以改變。
void func (const int& n) { n = 10; // 編譯錯誤 }
5. 修飾函數返回值
用const修飾函數返回值的含義和用const修飾普通變量以及指針的含義基本相同。
const int* func() // 返回的指針所指向的內容不能修改 { // return p; }
6. 修飾類成員變量
用const修飾的類成員變量,只能在類的構造函數初始化列表中賦值,不能在類構造函數體內賦值。
class A { public: A(int x) : a(x) // 正確 { //a = x; // 錯誤 }
private: const int a; };
7. 修飾類成員函數
用const修飾的類成員函數,在該函數體內不能改變該類對象的任何成員變量, 也不能調用類中任何非const成員函數。
class A { public: int& getValue() const { // a = 10; // 錯誤 return a; } private: int a; // 非const成員變量 };
8. 修飾類對象
用const修飾的類對象,該對象內的任何成員變量都不能被修改。
因此不能調用該對象的任何非const成員函數,因為對非const成員函數的調用會有修改成員變量的企圖。
class A { public: void funcA() {} void funcB() const {} }; int main { const A a; a.funcB(); // 可以 a.funcA(); // 錯誤 const A* b = new A(); b->funcB(); // 可以 b->funcA(); // 錯誤 }
9. 在類內重載成員函數
class A { public: void func() {} void func() const {} // 重載 };
10. const與宏定義的區別
const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查,而對後者只進行字符替換,沒有類型安全檢查,並且在字符替換時可能會產生意料不到的錯誤。
const常量從匯編的角度來看,只是給出了對應的內存地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而#define定義的常量在內存中有若幹個拷貝。
另外,編譯器通常不為const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。
#define PI 3.1415926535 const double PI = 3.1415926535;
11. const_cast
const_cast運算符用來修改類型的const或volatile屬性。
一、常量指針被轉化成非常量的指針,並且仍然指向原來的對象;
二、常量引用被轉換成非常量的引用,並且仍然指向原來的對象。
void func() { const int a = 10; int* p = const_cast<int*> (&a); *p = 20; std::cout<<*p; // 20 std::cout<<a; // 10, 原因見第10部分 }
C++ const關鍵詞用法