面試前必須要知道的C++ const用法


本文主要介紹const修飾符在C++中的主要用法,下面會從兩個方面進行介紹:類定義中使用const非類定義中使用const

1. 非類定義中使用const

非類定義中使用const是指:在除了類定義以外的場景中使用const。

1.1 變量
const int a = 1;  //定義一個常量,不可以修改
int b = 2;  //定義一個普通變量,可以修改
const int &b = a;  //定義一個常量引用,不可以通過引用b修改a,底層const
const int *p = &a;  //定義一個普通變量,p可以修改,但是不可以通過p修改所指向的對象a,底層const
int * const q = &b;  //定義一個常量指針,q不可以修改,但是可以通過q修改所指向的對象b,頂層const
const int * const s = &a;  //定義一個常量指針,s不可以修改,同時不可以通過s修改所指向的對象a,靠右的是頂層const,靠左的是底層const

頂層const:變量本身是個常量
底層const:變量所指向的對象是個常量
用於聲明引用的const都是底層const

1.2 函數
int fun1(const int a);  //定義一個常量形參
const int fun2(int a);  //等同於'int fun1(const int a);'因為函數返回的是返回值的副本
const int& fun3(int &a);  //返回常量引用,不會進行對象的拷貝(注意:不要返回局部對象的引用或者指針)
const int& fun4(int a);  //這實際上是一種錯誤的聲明方式,該函數可能會返回局部對象的引用或者指針

Tips:

  1. 引用只是一個變量的別名不是對象,因此引用不會占用存儲空間
  2. 調用一個返回引用的函數得到左值,其他返回類型得到右值

2. 類定義中使用const

2.1 類成員
class Test{
public:
    Test():a(10){}
    void display();
private:
    const int a;
};
  1. 類定義中不能進行初始化,因為在頭文件中定義只是一個聲明,並沒有分配真正空間,因此變量是不存在的,因此是不能賦值的。
  2. 在類定義外部,const定義的變量是不能被賦值

問題:
類定義中不能賦值,類定義外部也不能賦值,但是又必須賦值,這可如何是好?

解決方案:

  1. 在構造函數后的參數初始化列表中初始化
  2. 將const變量同時聲明為 static 類型進行初始化
class Test{
public:
    Test():a(10){}
    void display();
private:
    const int a;
    //static const int a;
};
//const int Test::a = 5;
2.2 類成員函數
class Test{
public:
    //下面是display函數的兩個重載版本
    void display(); //一個普通成員函
    void display() const; //一個const成員函數。
private:
    const int a;
};

Tips:
成員函數都有一個額外的隱式參數this,this的值是調用該函數的對象地址,因此this是一個指針
普通成員函數的this指針類型是:Test* const this
const成員函數的this指針類型是:const Test* const this

Test t1;
const Test t2;
t1.display(); //調用void display()
t2.display(); //調用void display() const

因為兩個函數的this指針類型不同,所以display有兩個重載函數。

作用:
為了在函數體內禁止修改對象,可以通過定義const成員函數來實現。

Others:
下圖是截自C++ primer中的片段,請重點關注兩個display函數的返回值:
display 普通成員函數的返回值是:普通引用
display const成員函數的返回值是:常量引用
造成返回值不同的原因就是:this指針類型不同
返回*this

3. 參考資料

  1. C++ primer 第五版-P57、P201、P231、P247
  2. C++ non-const lvalue reference cannot bind to a temporary


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM