本文總結了靜態成員的使用、單例的實現、常量對象與常量方法,以及如何將常量方法重載爲普通方法。
靜態成員
對象成員的聲明前加 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;
- 只有靜態常量整型纔可以在類的聲明中,直接初始化。
- sizeof運算符不會計算靜態常量。
- 靜態方法不可訪問非靜態成員、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];
);
}
- *this的類型是TextBlock,先把它強制隱式轉換爲const TextBlock,這樣我們才能調用那個常量方法。
- 調用operator const,得到的返回值類型爲const char&。
- 把返回值去掉const屬性,得到類型爲char&的返回值。
轉載文章,原地址