c++常量方法相關內容(轉載)

本文總結了靜態成員的使用、單例的實現、常量對象與常量方法,以及如何將常量方法重載爲普通方法。

靜態成員


對象成員的聲明前加 static 即可定義爲靜態成員,靜態成員必須在聲明類的文件中進行聲明(通常會初始化),否則鏈接錯。 訪問靜態成員可以通過類名,也可以通過對象名。

class CPerson{
    static int count;
};
int CPerson::count = 0;

CPerson p1, &p2 = p1, *p3 = new CPerson();

cout<<CPerson::count<<endl;
cout<<p1.count<<endl;
cout<<p2.count<<endl;
cout<<p3->count<<endl;
  1. 只有靜態常量整型纔可以在類的聲明中,直接初始化。
  2. sizeof運算符不會計算靜態常量。
  3. 靜態方法不可訪問非靜態成員、this指針。

單例的實現


在C++中,藉由靜態成員變量,可以實現單例模式。首先需要將構造函數私有化,並提供獲取單例的方法。 此後還需禁止複製構造函數、禁止賦值運算符。

class CPerson{
private:
    static CPerson* p;
    CPerson(){};
    CPerson(CPerson&);
    const CPerson& operator= (const CPerson&);
public:
    static Person* instance(){
        return p ? p : (p = new P());
    }
};
CPerson* CPerson::p = NULL;

常量對象與常量方法


C++類是用戶定義的數據類型,也可以聲明爲常量。因爲方法調用可能會改變對象屬性, 所以常量對象只能調用構造函數、析構函數以及常量方法。

常量方法是不改變對象屬性的方法,在常量方法中所有屬性賦值都會產生編譯錯誤。 常量成員函數也可以在類聲明外定義,但聲明和定義都需要指定const關鍵字。

class CPerson{
    public:
        void Print() const{
            cout<<"const";
        }
        void Print(){
            cout<<"normal";
        }
};

CPerson p1;
const CPerson p2;
p1.Print();       // normal
p2.Print();       // const

常量方法重載


常量方法可以是普通方法的重載,它們擁有不同的函數簽名。常量對象只能調用常量方法, 而普通對象會優先調用普通方法,如果不存在,則調用同名的常量方法。

通常我們需要定義相同返回值的常量方法以及普通方法。這時我們不希望重新編寫方法的邏輯。 最先想到的方法是常量方法調用普通方法,然而這是C++語法不允許的。 於是我們只能用普通方法調用常量方法,並做相應的類型轉換:

const char& operator[](size_t pos) const{
    ...
}

char& operator[](size_t pos){
    return const_cast<char&>(
        static_cast<const TextBlock&>(*this)[pos];
    );
}


  1. *this的類型是TextBlock,先把它強制隱式轉換爲const TextBlock,這樣我們才能調用那個常量方法。
  2. 調用operator const,得到的返回值類型爲const char&。
  3. 把返回值去掉const屬性,得到類型爲char&的返回值。

轉載文章,原地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章