建構函式 拷貝建構函式 賦值建構函式

2021-07-11 12:00:19 字數 1865 閱讀 4629

class和struct很大乙個區別在於,c除了成員的訪問控制許可權,struct中的成員預設是public,而class中的field預設是private;class還有乙個special的地方是它有建構函式:constructor。

建構函式是class中的一員,和成員變數、其他成員函式一起構成乙個完整的class。

建構函式用來在memory中開闢乙個記憶體空間,並返回乙個類例項的引用。建構函式包括:初始化建構函式、拷貝建構函式、賦值建構函式。

初始化建構函式顧名思義就是用來建立乙個類例項,並對它的成員進行初始化的。下面是個栗子:

class data

;data::data(int x, int y, int z)

上面的data(int,int,int)就是乙個初始化建構函式,使用的時候可以這樣:
data today(2016,4,28);

這樣我們就通過初始化建構函式建立了乙個叫做today的data物件,並對它的成員變數year、month、day進行了初始化。

接著我們來看拷貝建構函式。什麼是拷貝建構函式?推斷沒錯的話應該是去年4月底瑤哥電面的時候問過我的乙個問題。拷貝建構函式目的也是建立乙個新物件,開闢屬於它的記憶體空間,返回它的乙個reference。和初始化建構函式不同,它需要乙個已經存在的例項來進行這個建立過程。繼續上面的例子,假設有了上面建立的today,現在建立物件night:

data night(today);

也可以這樣:

data night = today;
需要說的是,拷貝建構函式的拷貝是一種淺拷貝,這意味著上面建立的night和today引用的是同一塊記憶體空間,如果對night中的成員變數進行了修改,那麼也會同步到today。

然後是賦值建構函式。從使用上賦值建構函式應該是最簡單的。但是從實現角度,因為它要用到運算子的過載就不簡單廖。上面的data的賦值建構函式的宣告可以like this:

data & operate = (const data &data);

如果這個時候有乙個tomorrow物件,用today對它進行賦值,那麼將會呼叫賦值建構函式:

data tomorrow(2016,4,29);

tomorrow = today;

如果出現=,例如上面的tomorrow = night,調的是賦值建構函式還是拷貝建構函式?如果在進行=之前tomorrow已經建立完成了,比如上面的實現,這個時候就是呼叫的賦值建構函式。如果一邊進行=,一邊進行建立,就像data tomorrow = night,那麼就是呼叫的拷貝建構函式,為了增強**的可讀性,最好這麼寫:data tomorrow(night);

最後來一道很常見的考察建構函式的筆試題:「實現乙個string類,至少要能實現以下:建構函式,析構函式,拷貝建構函式,過載賦值操作符。」

來乙個參考:

class string

;string::string(const char *content)

int lenght = strlen(content);

this->mcontent = new char[lenght+1];

strcpy(this->mcontent, string);

}string::string(const string &string)

string::string& operate = (const string &string)

string::~string()

建構函式 拷貝函式 賦值建構函式

ifndef sample h define sample h include include struct qq int qqnum std string qqpassword 以下a,b,c,d分別為 a 沒有實現拷貝建構函式和賦值建構函式,所以會自動生成預設的拷貝建構函式和賦值建構函式 b 與...

拷貝建構函式與賦值建構函式

include stdafx.h include include using namespace std class a a a a 過載拷貝函式 a int id,char t name a char name a operator a a 注意 此處一定要返回物件的引用,否則返回後其值立即消失!...

拷貝建構函式和賦值建構函式

class cmystring 賦值建構函式 cmystring cmystring operator const cmystring str 新分配記憶體,將str的m pdata記憶體拷貝到m pdata中 m pdata new char strlen str.m pdata 1 strcpy...