3. 建構函式的過載
4. 帶預設引數的建構函式
5. 預設建構函式
6. 複製建構函式與合成複製建構函式
7. 深複製和淺複製
1. 什麼是建構函式
建立乙個物件時通常最需要立即做的就是初始化物件,如對資料成員賦初值,建構函式就是用來在建立物件時初始化物件,為物件賦初值的
2. 建構函式的定義
定義建構函式
說明:建構函式初始化列表 示例建構函式是建立物件時自動執行的,而且只執行一次,並先於其他成員函式執行,建構函式不需要也不能人為呼叫
建構函式一般宣告為公有的
在建構函式的函式體中不僅可以對資料成員初始化,而且可以包含任意其他功能的語句,但不提倡在建構函式中做與初始化無關的事
每個建構函式應該為每個資料成員提供初始化
帶引數的建構函式中的形參,是在定義物件時由對應的實參給定的,實參必須與建構函式的形參的個數、次序、型別一致
cuboid::
cuboid
(int l,
int w,
int h)
:length
(l),
width
(w),
height
(h)//外部定義的建構函式,,初始化列表
說明:3. 建構函式的過載有時必須用建構函式初始化列表:如果沒有為類型別的資料成員提供初始化列表,則編譯器會隱式的使用該成員的預設建構函式,若該成員沒有預設建構函式,則報錯。所以一般沒有預設建構函式的成員,以及const或引用型別的成員都必須在建構函式初始化列表中初始化
成員初始化的次序class
point
//沒有預設建構函式
void
print()
};class
pointtest
// 只能在初始化列表裡對成員a初始化
}
初始化式可以是任意表示式
4. 帶預設引數的建構函式
說明:5. 預設建構函式必須在類的內部指定預設引數如果建構函式的全部引數都指定了預設值,則在定義物件時可以給出任意個實參
一般不同時使用建構函式的過載和帶預設引數的建構函式
定義預設建構函式
說明:隱式類型別轉換任何乙個類有且只有乙個預設建構函式。如果定義的類中沒有顯式定義任何建構函式,編譯器會自動為該類生成預設建構函式,稱為合成預設建構函式乙個類哪怕只定義了乙個建構函式,編譯器也不會再生成預設建構函式
一般任何乙個類都應定義乙個預設建構函式
6. 複製建構函式與合成複製建構函式
複製建構函式
說明:合成複製建構函式複製建構函式有且只有乙個本型別物件的引用形參,通常使用const限定,因為複製建構函式只是複製物件,沒有必要改變傳遞來的物件的值
複製建構函式的功能是利用乙個已知的物件來初始化乙個被建立的同類的物件
物件賦值和物件複製的區別:
以下3種情況使用複製建構函式
point pt1(10
,20);
point pt2 = pt1;
// 複製初始化
point pt3
(pt1)
;// 直接初始化
函式引數按值傳遞物件時,或函式返回物件時
根據元素初始化式列表初始化陣列元素時
7. 深複製和淺複製
C 基礎3 拷貝 複製 建構函式
使用類建立物件時,建構函式被自動呼叫以完成物件的初始化,那麼能否象簡單變數的初始化一樣,直接用乙個物件來初始化另乙個物件呢?答案是可以 student s1 student s2 s1 像這種語句在語法上是合法的。初始化s2,相當於將s1中每個資料成員的值複製到s2中,這是表面現象。實際上,系統呼叫...
c 基礎學習 析構函式 拷貝建構函式
字串函式 string類是c 提供的字串類,其主要功能是對字串進行操作。string類定義的變數稱為字串物件,該物件可以直接用字串常量賦值,也可呼叫string類中定義的成員函式。常型別是指使用型別修飾符const說明的型別,常型別的變數或物件的值不能被更新。c 中引入const的目的是為了取代巨集...
C 學習 建構函式
成員函式的一種 class complex 編譯器自動生成預設建構函式 complex c1 complex p new complex 上面兩個語句類的預設建構函式均被呼叫class a a a double r,double i a a1 缺少函式引數 a a new a 少參 a a 2 ok...