//宣告乙個data類
class data
data(const data&d)//拷貝建構函式
data(const data&d) = delete;//阻止拷貝
/*data(int y=10, int m=10, int d=10);在宣告建構函式時指定預設引數值
建構函式中引數的值既可以通過實參傳遞,也可以指定為某些預設值,
如果使用者不指定實參值,編譯系統就使形參取預設值
注意:應在宣告函式時指定預設值,而不能只在定義建構函式時指定預設值*/
~data(){}//析構函式
private:
int year;
int month;
int day;
};/*
建構函式:
1.定義:是乙個特殊的成員函式,對物件進行初始化,建構函式名字必須與類名同名,無型別,無返回值,
不需要使用者呼叫,也不能被使用者呼叫,在建立物件時自動執行,在物件的生命週期內只呼叫一次
2.可以在宣告建構函式時指定預設引數
例如:data(int y=10, int m=10, int d=10);
//如果使用者不指定實參值,編譯系統就使形參取預設值
注意:應在宣告函式時指定預設值,而不能只在定義建構函式時指定預設值
3.初始化:
1)初始化列表用於初始化資料成員,並不指定這些資料成員的初始化順序,
資料在類中定義順序就是在引數列表中初始順序。
2)盡量避免使用成員初始化成員,成員的初始化順序最好和成員定義的順序保持一致
4.特性:
1)函式名與類名相同
2)沒有返回值
3)有初始化列表(可以不用)
4)新物件被建立,由編譯器自動呼叫,且在物件的生命週期內只呼叫一次。
5)建構函式可以過載,實參決定了呼叫哪乙個建構函式
6)無參的建構函式和帶有預設值(預設值不能隨便給,預設值的個數可以是任意的,
但是應從右向左給定)的建構函式都認為是預設建構函式,並且預設建構函式只能有乙個。
7)如果沒有顯示定義時,編譯器會提供乙個預設建構函式(不一定,看程式是否需要建構函式,
詳細解釋見上篇部落格「c++合成預設建構函式的真相」)。
5.作用:構建物件,初始化物件,型別轉換
拷貝建構函式:
1.定義:只有單個形參,而且該形參必須是本類物件的const引用(請思考為什麼?),它是特殊的建構函式
建立物件時使用已經存在的同類物件來進行初始化,由編譯器自動呼叫。
2.特徵:
1)它是建構函式的過載
2)如果沒有顯式定義,系統會自動合成乙個預設的拷貝建構函式,預設的建構函式
會將其引數的成員逐個拷貝到正在建立的物件中。
3)用途:
a.物件例項化物件
例如:data d1(2016,2,14);
data d2(d1);
b.將乙個物件作為實參傳遞非引用型別的形參
例如:void fun(const data d2){}
c.從乙個返回型別為非引用型別的函式返回乙個物件
data fun1()
解答:為什麼拷貝建構函式形參必須是本類物件的const引用?
若定義為:data(const data d)
因為引數的傳遞本身就是複製,而複製乙個臨時的data物件的時候要呼叫拷貝建構函式。
(也就是自己,呼叫自己的時候又是一次引數傳遞,所以又要呼叫一次自己(即:
調建構函式)),這樣會一直惡性迴圈下去,造成無休止遞迴呼叫。
4.阻止拷貝:
在新標準下,我們可以將拷貝建構函式和拷貝賦值運算子定義為刪除的函式
(delete)來阻止拷貝,雖然我們宣告了刪除的函式,但是不能以任何方式
使用它們,格式為:在引數列表後面加上「=delete」來指出我們希望將它定
義為刪除的。
例如:data(const data&d) = delete;//阻止拷貝
data &operator=(const data&)=delete//阻止賦值
注意:=delete必須出現在第一次宣告的地方,我們可以對任何函式指定=delete,
雖然刪除函式主要作用是禁止拷貝控制成員,但當我們希望引導函式匹配過程時,
刪除函式有時也是有用的。
析構函式:
1.定義:是類的乙個成員函式,與建構函式功能相反,
在物件被銷毀時,編譯器自動呼叫,釋放物件使用的資源(不是刪除物件),並銷
毀物件的非static資料成員(static區域性物件在函式呼叫結束時物件並不釋放,因此
也不用呼叫析構函式,只有在main函式結束或呼叫exit函式結束程式時候,才呼叫static
區域性物件的析構函式)。
2.先構造的後析構,後構造的先析構(他相當於乙個棧,先進後出)。
3.析構函式沒有返回值,沒有函式型別,也沒有函式引數。因此,它不能被過載,
乙個類可以有多個建構函式,但只有乙個析構函式。
*/
C 建構函式與預設建構函式
建構函式 c 用於構建類的新物件時需要呼叫的函式,該函式無返回型別!注意 是 無 不是空!void 預設建構函式 未提供顯式初始值時,用來穿件物件的建構函式。以上是二者的定義,但是單從定義很難對二者進行區別,下面依然看 1 class testclass 2 上面的注釋中已標出了預設建構函式和建構函...
C 的預設建構函式與建構函式
今天看書,忽然發現自己對預設建構函式 建構函式的理解很模糊,在實際專案中寫類時,這些細節問題並沒有涉及到。因此,就專門對著 c primer plus 將預設建構函式 構 造函式這一塊簡單總結一下。建構函式 c 用於構建類的新物件時需要呼叫的函式,該函式無返回型別!注意 是 無 不是空!void 預...
C 建構函式之預設建構函式
參考部落格 以下內容是在上述博主的部落格中提煉出來的 一 預設建構函式的含義是啥 主要就是 預設建構函式在呼叫的時候不需要顯示傳入實參的建構函式 二 預設的建構函式的分類 1 無參建構函式 就是沒有引數的建構函式 class sample 2 帶有形參,並且帶有預設值的建構函式 class samp...