C 一道題搞定C 構造析構的呼叫

2021-06-19 16:31:55 字數 1757 閱讀 4254

#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 建構函式析構函式呼叫順序

在使用建構函式和析構函式時,需要特別注意對它們的呼叫時間和呼叫順序。在一般情況下,呼叫析構函式的次序正好與呼叫建構函式的次序相反 最先被呼叫的建構函式,其對應的 同一物件中的 析構函式最後被呼叫,而最後被呼叫的建構函式,其對應的析構函式最先被呼叫。簡單來說,其建構函式的順序就一句話 基類建構函式 成...