#include using namespace std;
class csample
{ char ch1, ch2;
public:
friend void set(csample & s, char c1, char c2);
csample(char a, char b)
{ch1 = a;
ch2 = b;
cout<<"csample constructor"<
這道題目的輸入結果是:
csample constructor
csample copy-constructor
csample copy-constructor
csample copy-constructor
csample operator=
ch1=7,ch2=9
ch1=7,ch2=9
ch1=7,ch2=9
ch1=7,ch2=8
用的是g++編譯的。
解釋一下:
obj(『7』,『8』)這句話呼叫一般建構函式,輸出csample contrucutor
第二句話,用obj1給obj2初始化,用乙個已知的對方給另外乙個物件初始化,呼叫拷貝建構函式,所以輸出csample copy-constructor
呼叫fun(obj1)時,構造乙個形參,所以呼叫拷貝建構函式,輸出csample copy-constructor,此時obj1的值為(『7』,8『),而這個形參的值為(』7『,』9『),這裡是按值傳引數,所以對obj1沒有改變,返回obj的時候,又構造乙個臨時物件,所以呼叫拷貝建構函式,輸出csample copy-constructor,此時這個臨時物件的值為(7,9),然後用這個臨時物件給obj2賦值,呼叫過載函式,輸出csample operator=,
然後反序呼叫析構函式,先析構臨時物件,輸出ch1=7,ch2=9;
再析構形參,輸出ch1=7,ch2=9;
再析構obj2,輸出ch1=7,ch2=9
再析構obj1,輸出ch1=7,ch2=8
整個過程結束,要記住,乙個物件作為實參進入乙個函式時,只是自己拷貝乙份進去,該函式結束時要把這份臨時的複製物件析構掉,函式返回時返回乙個物件也是先構造乙個臨時物件。
友元函式set並不是類的成員函式,記住。
總結一下構造和析構:
每個類至少有三個建構函式和乙個析構函式。
三個建構函式為:普通建構函式,拷貝建構函式,operator=建構函式,如果沒有申明建構函式,編譯器會自動的生成預設建構函式,但是如果一旦出現了普通建構函式,編譯器就不會自動生成預設建構函式。當用乙個物件去初始化另外乙個物件時,寫成(obj) 或者 = obj,呼叫拷貝建構函式,沒有拷貝建構函式,系統會自動生成乙個預設的拷貝建構函式,當用乙個物件給乙個乙個存在的物件賦值時,呼叫operator=建構函式,預設的建構函式,都是通過位拷貝進行複製的,所以,當出現指標的時候,呼叫預設的建構函式往往會出錯。
構造派生類子物件的時候,先呼叫基類建構函式,按照繼承的順序,在呼叫子物件的建構函式,按照子物件宣告的順序,在呼叫自己的建構函式。這個順序和初始化列表的順序無關。
對於初始化列表,const成員只能在初始化列表裡面進行初始化,static成員只能通過::進行初始化,不能那個寫在建構函式裡面。
乙個物件作為形參的時候,其實是呼叫了乙個預設拷貝建構函式構造了乙個形參物件,物件作為返回值的時候也是如此,呼叫了預設的拷貝建構函式,
析構的順序和構造的順序完全相反;
析構函式只有乙個,在物件生成週期結束的時候,編譯器自動呼叫析構函式。
從一道題談C 中構造函式呼叫建構函式
題目如下 問下列 的列印結果為0嗎?include stdlib.h include iostream using namespace std struct clscls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,...
C 繼承中構造析構呼叫原則
構造析構呼叫原則 1 子類物件在建立時會首先呼叫父類的建構函式 2 父類建構函式執行結束後,執行子類的建構函式 3 當父類的建構函式有引數時,需要在子類的初始化列表中顯示呼叫 4 析構函式呼叫的先後順序與建構函式相反 案例如下 define crt secure no warnings includ...
C 建構函式析構函式呼叫順序
在使用建構函式和析構函式時,需要特別注意對它們的呼叫時間和呼叫順序。在一般情況下,呼叫析構函式的次序正好與呼叫建構函式的次序相反 最先被呼叫的建構函式,其對應的 同一物件中的 析構函式最後被呼叫,而最後被呼叫的建構函式,其對應的析構函式最先被呼叫。簡單來說,其建構函式的順序就一句話 基類建構函式 成...