//舉例
class myclass
{
public:
int get_x() const;
myclass &get_me() const;
private:
int x;
double y;
}
關(guān)于const
建議盡可能使用const來定義方法, 這樣這個方法可以用于const對象
int get_x () const
{
return x;
}
其中的const代表this指針是const類型, 聲明之后代表本函數(shù)不會對任何私有變量修改.
但是出現(xiàn)了額外的一種情況, 對于get_me()函數(shù), 返回的是對自己的引用, 但是const限制了后續(xù)作為左值不能修改了, 于是我們考慮重載此函數(shù), 對于const的調(diào)用和非const 的調(diào)用使用不同的方法.
myclass &get_me() const;
myclass &get_me;
//這兩種方法調(diào)用do_get_me(), 在這個函數(shù)里進(jìn)行具體操作
void do_get_me() const;
將一個成員設(shè)置為mutable類型, 那么即使對象是const類型, 這個成員也可以修改.
constexpr對象
為了將一個對象聲明稱constexpr類型, 類必須至少有constexpr的構(gòu)造方法, 并且構(gòu)造賦值必須都是字面值常量
構(gòu)造函數(shù)
構(gòu)造函數(shù)的正確聲明方法
myclass::myclass(int a, int b):x(a),y(b){/* .....*/}
而不是將賦值寫在函數(shù)里, 那樣會先讓x, y被默缺省初始化, 然后進(jìn)行賦值(你懂的,有時候缺省初始化會有一些事故)
myclass() = default
使用缺省方法構(gòu)造(即保留缺省構(gòu)造函數(shù))
explicit修飾的構(gòu)造函數(shù)可以防止隱形轉(zhuǎn)換, 但是explicit也阻止了構(gòu)造函數(shù)內(nèi)語句的拷貝賦值
構(gòu)造函數(shù)的成員初始化順序和構(gòu)造函數(shù)無關(guān), 和在類中的聲明順序有關(guān)
委托構(gòu)造函數(shù)
即,構(gòu)造函數(shù)提供的參數(shù)是缺少的, 會再調(diào)用其他構(gòu)造函數(shù)
myclass::myclass(int a):myclass(a, 4.4)
不完全類
為了實現(xiàn)類似鏈表的*next效果, 我們可以先聲明一個類而不去定義它(可以用于指針, 引用,static)
class your_class;
class myclass
{
your_class *next;
}
static
static成員不屬于對象, 而是屬于類, 因此與static單獨相關(guān)的方法應(yīng)該被聲明未static類型(如他的構(gòu)造方法, get方法). static函數(shù)體內(nèi)沒有this指針, 也不應(yīng)該聲明為const類型
如果static成員函數(shù)是在類外部定義的, 那么外部定義時不能再寫static關(guān)鍵字.
如果static變量是在類外部定義類似于全局變量, static成員的定義應(yīng)該在所有函數(shù)之外.int myclass::mystatic = initialStatic();
如果static變量是在類內(nèi)部定義, 則必須用constexpr進(jìn)行. 即使在類內(nèi)定義, 推薦同時在類外定義一下.constexpr int myclass::mystatic
static的特殊作用
- static成員可以是不完全類型, 即本類可以有static本類
- static成員可以作為構(gòu)造函數(shù)的默認(rèn)實參