【C++自我精讲】基础系列二 const
【C++自我精講】基礎系列二 const
0 前言
分三部分:const用法、const和#define比較、const作用。
1 const用法
const常量:const可以用來定義常量,不可改變,const常量在定義時必須初始化(extern修飾時是特例)。
//const常量 const int Number = 100; extern const int Number;
?const指針:
? 1)const出現在*號左邊,表示被指物是常量(不可以改變);注意:const寫在類型之前和寫在類型之后且*號之前是一樣的。
? 2)const出現在*號右邊,表示指針自身是常量(不可以改變);
? 3)const出現在*號兩邊,表示被指物和指針兩者都是常量(不可以改變)。
//const指針 char name[] = "joinclear"; char* pName = name; //指針和所指物都可以改變 const char* pName = name; //指針可以改變,指針所指物不可以改變 char const* pName = name; //同上 char* const pName = name; //指針不可以改變,指針所指物可以改變 const char* const pName = name; //指針和所指物都不可以改變
?const引用:初始化右值一般只是個常量,所以只有常量引用可以有初始化右值。
//const引用 int i = 100; int &j = i; //引用 int &j = 200; //錯誤,引用不能改變右值 const int &k = 200; //const引用可以改變右值
const函數形參:const只能修飾輸入參數,不能修飾輸出參數。
? 1)對于內部數據類型的輸入參數,沒必要將“值傳遞”方式改為“const引用傳遞”,因為“值傳遞”是,函數會自動產生臨時變量用于復制該參數,無需const。
void Fun(int i) //OK void Fun(const int i) //沒必要
? 2)當輸入參數是“指針傳遞”是,為了防止函數體內改變此指針指向的值,可以加const修飾。
void StringCopy(const char *strSource); //strSource不能改變
? 3)對于非內部數據類型的輸入參數,應將“值傳遞”方式改為“const引用傳遞“。
void Func(CTest a); //函數體內會產生CTest的臨時對象用于復制a,臨時對象又會經過構造、復制、析構,很耗時 void Func(CTest &a); //引用,不產生臨時對象,但"引用傳遞"有可能改變a void Func(const CTest &a); //加const不會改變a
const函數返回值:const修飾函數返回值。
? 1)返回值是“值傳遞”方式,不用加const修飾。因為函數會把返回值復制到外部臨時的存儲單元,加const修飾沒必要。
int Fun(int i) //OK const int Fun(int i) //沒必要
? 2)返回值是“指針傳遞”方式,可以加const修飾。意思為函數返回值指針所指內容不能改變,此時此返回值也只能賦給const修飾的同類型指針。
const char * GetString(void); const char *str = GetString();
const類成員變量:只在某個對象生存期內是常量,對于整個類是可變的,因為類可以創建多個對象,不同的對象其const類成員變量的值是可以不同。
? 1)const類成員變量,不能在類聲明中初始化。
class A {const int size = 100; //錯誤 };
? 2)const類成員變量,只能在類構造函數的初始化表中進行初始化。
class A {A(int size); const int size ; }; A::A(int i) : size(i) //構造函數初始化列表 {... }
const類成員函數:當類成員函數,不會修改數據成員時應該聲明為const成員函數。
class A { public:int GetNum() const; //const成員函數 private:int num_; };int A::GetNum() const {num_ = 100;; // 錯誤,num_不能改變return num_; }
2 const和#define比較
? 1)const常量有數據類型,編譯器可以對前者進行類型安全檢查;而#define常量沒有數據類型,編譯器只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產生意料不到的錯誤(邊際效應)。
? 2)const可定義局部變量,作用域僅限于函數體內;#define常量,即使在函數體內,作用域也是全局的,為從定義處到文件結束,除非用#undef取消定義。
3 const作用
? 1)定義const常量,不可改變,能夠節省內存空間,代替#define。
? 2)編譯器能進行類型安全性檢查,消除部分隱患。
? 3)可以保護被修飾的內容,防止意外修改,能夠增強程序的健壯性。
? 4)能夠提高效率,安全。
轉載于:https://www.cnblogs.com/snake-hand/p/3180352.html
總結
以上是生活随笔為你收集整理的【C++自我精讲】基础系列二 const的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海皇满级需要多少经验
- 下一篇: poj 1679 次小生成树