【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指針:spa

  1)const出如今*號左邊,表示被指物是常量(不能夠改變);注意:const寫在類型以前和寫在類型以後且*號以前是同樣的。指針

  2)const出如今*號右邊,表示指針自身是常量(不能夠改變);code

  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引用:初始化右值通常只是個常量,因此只有常量引用能夠有初始化右值。blog

//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)可以提升效率,安全。

相關文章
相關標籤/搜索