靜態(tài)類成員
比如下面這個(gè)類:
class StringBad
{
private:
static int num_strings;
public:
StringBad(const char* s);
StringBad();
~StringBad();
};
其中的num_strings為靜態(tài)類成員,它的特點(diǎn)是,無論創(chuàng)建多少對象拖叙,程序都只創(chuàng)建一個(gè)靜態(tài)類變量副本,即類的所有對象共享同一個(gè)靜態(tài)成員赂乐。
同時(shí)在實(shí)現(xiàn)文件中需要初始化這個(gè)靜態(tài)類成員:
int StringBad::num_strings = 0;
注意薯鳍,不能在類聲明中初始化靜態(tài)成員變量,因?yàn)槁暶髦皇敲枋隽巳绾畏峙鋬?nèi)存挨措,但并不分配內(nèi)存挖滤。不過如果靜態(tài)成員是const整型類型或枚舉型的話,就可以在類聲明中初始化浅役。
特殊成員函數(shù)
C++自動(dòng)提供了下面的成員函數(shù):
- 默認(rèn)構(gòu)造函數(shù)斩松,如果沒有定義
- 默認(rèn)析構(gòu)函數(shù),如果沒有定義
- 復(fù)制構(gòu)造函數(shù)觉既,如果沒有定義
- 賦值運(yùn)算符惧盹,如果沒有定義
- 地址運(yùn)算符,如果沒有定義
復(fù)制構(gòu)造函數(shù):
Class_name(const Class_name&);
如果用一個(gè)已有的對象來初始化一個(gè)新建的同類對象瞪讼,就會(huì)調(diào)用復(fù)制構(gòu)造函數(shù):
// if existed StringBad motto
StringBad ditto = motto; // calls StringBad(const StringBad&);
默認(rèn)的復(fù)制構(gòu)造函數(shù)逐個(gè)復(fù)制非靜態(tài)成員钧椰,復(fù)制的是成員的值,如果類中包含靜態(tài)成員的話符欠,最好是顯示建立一個(gè)復(fù)制構(gòu)造函數(shù)來處理嫡霞。
靜態(tài)類成員函數(shù)
使用static關(guān)鍵字聲明:
static int HowMany(){return num_strings;} //in String class
調(diào)用的話:
int count = String::HowMany();
靜態(tài)成員函數(shù)不與特定的對象相關(guān)聯(lián),因此只能使用靜態(tài)數(shù)據(jù)成員希柿。
構(gòu)造函數(shù)中使用new
構(gòu)造函數(shù)中使用new來初始化指針诊沪,就必須在析構(gòu)函數(shù)中使用delete。如果有多個(gè)構(gòu)造函數(shù)曾撤,則要么都是用new娄徊,要么都是用new[],因?yàn)槲鰳?gòu)函數(shù)只有一個(gè)盾戴。
同時(shí)要定義一個(gè)復(fù)制構(gòu)造函數(shù)寄锐,通過深度復(fù)制將一個(gè)對象初始化為另一個(gè)對象。具體說是要分配足夠的空間來存儲(chǔ)復(fù)制的數(shù)據(jù),并復(fù)制數(shù)據(jù)橄仆,而不僅僅是數(shù)據(jù)的地址剩膘,另外,還要更新所有受影響的靜態(tài)類成員盆顾。
還應(yīng)定義一個(gè)賦值運(yùn)算符怠褐,具體說是檢查自我賦值的情況,釋放成員指針以前指向的內(nèi)存您宪,復(fù)制數(shù)據(jù)而不僅僅是數(shù)據(jù)的地址奈懒,并返回是一個(gè)指向調(diào)用對象的引用。
指向?qū)ο蟮闹羔?/h1>
比如:
String* favorite = new String(sayings[choice]);
使用new創(chuàng)建的話宪巨,只有使用delete的話磷杏,析構(gòu)函數(shù)才會(huì)被調(diào)用。動(dòng)態(tài)變量對象會(huì)在執(zhí)行完對象的程序塊后調(diào)用該對象的析構(gòu)函數(shù)捏卓,而靜態(tài)變量對象會(huì)在程序結(jié)束后調(diào)用對象的析構(gòu)函數(shù)极祸。
聲明指向?qū)ο蟮闹羔樣邢旅鎺追N方式:
String* glamour;
String* first = &sayings[0];
String* favorite = new String(sayings[choice]);
C++11有一種更直觀的類內(nèi)初始化方法,在構(gòu)造函數(shù)中使用:
:
class Classy
{
...
private:
int meml;
const int mem2;
};
Classy::Classy()
:meml(10), mem2(20)
{}