命名空間+缺省參數+const總結+引用總結+內聯函數+auto關鍵字 C++初階( 四 )

拷貝與頂層和底層 const
int i = 0;int *const p1 = &i;     //  不能改變 p1 的值,這是一個頂層const int ci = 42;      //  不能改變 ci 的值,這是一個頂層const int *p2 = &ci;    //  允許改變 p2 的值,這是一個底層const int *const p3 = p2;   //  靠右的 const 是頂層 const,靠左的是底層 constconst int &r = ci;      //  所有的引用本身都是頂層 const,因為引用一旦初始化就不能再改為其他對象的引用 , 這里用于聲明引用的 const 都是底層 constconst修飾引用常引用所引用的對象不能更新,使用方法為:const 類型說明符 &引用名
非const引用只能綁定非const對象,const引用可以綁定任意對象,并且都當做常對象
常引用經常用作形參,防止函數內對象被意外修改 。對于在函數中不會修改其值的參數,最好都聲明為常引用 。復制構造函數的參數一般均為常引用
class Example{public:    Example(int x, int y):a(x),b(y){}    Example(const Example &e):a(e.a),b(e.b){} //復制構造函數    void print();    void print() const;private:    const int a,b;    static const int c = 10;};void Example::print() {cout<<"print():"<<a<<ends<<b<<endl;}void Example::print() const {cout<<"print() const:"<<a<<ends<<b<<endl;}const修飾函數參數const修飾參數是為了防止函數體內可能會修改參數原始對象 。因此,有三種情況可討論:

  • 1、函數參數為值傳遞:值傳遞(pass-by-value)是傳遞一份參數的拷貝給函數,因此不論函數體代碼如何運行,也只會修改拷貝而無法修改原始對象,這種情況不需要將參數聲明為const 。
  • 2、函數參數為指針:指針傳遞(pass-by-pointer)只會進行淺拷貝,拷貝一份指針給函數,而不會拷貝一份原始對象 。因此,給指針參數加上頂層const可以防止指針指向被篡改,加上底層const可以防止指向對象被篡改 。
  • 3、函數參數為引用:引用傳遞(pass-by-reference)有一個很重要的作用,由于引用就是對象的一個別名,因此不需要拷貝對象,減小了開銷 。這同時也導致可以通過修改引用直接修改原始對象(畢竟引用和原始對象其實是同一個東西),因此,大多數時候 , 推薦函數參數設置為pass-by-reference-to-const 。給引用加上底層const,既可以減小拷貝開銷,又可以防止修改底層所引用的對象 。
void Fun(const A *in); //修飾指針型傳入參數void Fun(const A &in); //修飾引用型傳入參數void func (const int& n){     n = 10;        // 編譯錯誤}const修飾函數返回值const修飾函數返回值的含義和用const修飾普通變量以及指針的含義基本相同 。這樣可以防止外部對 object 的內部成員進行修改 。
const int* func()   // 返回的指針所指向的內容不能修改{    // return p;}const成員函數和數據成員類的常成員函數由于C++會保護const對象不被更新,為了防止類的對象出現意外更新,禁止const對象調用類的非常成員函數 。因此,常成員函數為常對象的唯一對外接口 。
常成員函數的聲明方式:類型說明符 函數名(參數表) const
  • const對象只能訪問const成員函數,而非const對象可以訪問任意的成員函數 , 包括const成員函數
  • const對象的成員是不能修改的 , 而通過指針維護的對象卻是可以修改的
  • const成員函數不可以修改對象的數據,不管對象是否具有const性質 。編譯時以是否修改成員數據為依據進行檢查
class A{public: //返回值的類型是int &類型    int& getValue() const    {        // a = 10;    // 錯誤        return a;    }private:    int a;            // 非const成員變量};

推薦閱讀