C 建構函式初始化順序詳解

2022-09-27 02:09:14 字數 3188 閱讀 4122

1.建構函式、析構函式與拷貝建構函式介紹

建構函式

1.建構函式不能有返回值

2.預設建構函式時,系統將自動呼叫該預設建構函式初始化物件,預設建構函式會將所有資料成員都初始化為零或空

3.建立乙個物件時,系統自動呼叫建構函式

析構函式

1.析構函式沒有引數,也沒有返回值。不能過載,也就是說,乙個類中只可能定義乙個析構函式

2.如果乙個類中沒有定義析構函式,系統也會自動生成乙個預設的析構函式,為空函式,什麼都不做

3.呼叫條件:1.在函式體內定義的物件,當函式執行結束時,該物件所在類的析構函式會被自動呼叫;2.用new運算子動態構建的物件,在使用delete運算子釋放它時。

拷貝建構函式

拷貝建構函式實際上也是建構函式,具有一般建構函式的所有特性,其名字也與所屬類名相同。拷貝建構函式中只有乙個引數,這個引數是對某個同類物件的引用。它在三種情況下被呼叫:

1.用類的乙個已知的物件去初始化該類的另乙個物件時;

2.函式的形參是類的物件,呼叫函式進行形參和實參的結合時;

3.函式的返回值是類的物件,函式執行完返**用者。

【**】

複製** **如下:

/*version: 1.0

author: hellogiser

date: 2014/9/25

*/#include "stdafx.h"

#include

using namespace std;

class point

point(const point &p)

~point()

int get_x()

int get_y()

};void f(point p)

point g()

void test()

int main()

/*constructor

copy constructor

15      22

copy constructor

15      22

destructor

constructor

copy constructor

destructor

destructor

7       33

destructor

destructor

*/2. 繼承關係中建構函式執行順序

(1)任何虛擬基類(virtual)的建構函式按照它們被繼承的順序構造;

(2)任何非虛擬基類(non-virtual)的建構函式按照它們被繼承的順序構造;

(3)任何成員物件(data member)的建構函式按照它們宣告的順序呼叫;

(4)類自己的建構函式(self)。

【**】

複製** **如下:

/*version: 1.0

author: hellogiser

date: 2014/9/27

*/#include "stdafx.h"

#include

using namespace std;

class obj1

};class obj2

};class base1

};class base2

};class base3

};class base4

};class derived : public base1, virtual public base2,

public base3, virtual public base4

protected:

obj1 obj1;

obj2 obj2;

};void test()

int main()

/*base2

base4

base1

base3

obj1

obj2

derived.

this is ok.

*/【**2】

複製** **如下:

/*version: 1.0

author: hellogiser

date: 2014/9/27

*/#include "stdafx.h"

#include

using namespace std;

class base1

};class base2

};class base3

};class derived : public base2,  public base1, virtual public base3

protected:

base1 b1;

base2 b2;

base3 b3;

int m;

};void test()

int main()

/*base3 *

base2 2

base1 1

base1 3

base2 4

base3 *

derived.

this is ok.

*/分析:

(1) virtual

按照繼承順序:base3

第一步:先繼承base3,在初始化列表裡找不到base3(), 則呼叫base3裡的預設建構函式base3(),列印"base3  *"

(2)non-virtual

按照繼承順序:base2,base1

第二步:繼承base2,在初始化列表中www.cppcns.com找base2(b),呼叫base2的建構函式base2(2),列印"base2 2"

第三步:繼承base1,在初始化列表中找base1(a),呼叫base1的建構函式base1(1),列印"base1 1"

(3)data member

按照申明順序:b1,b2,b3

第四步:構造b1,在初始化列表中找b1(c),呼叫base1的建構函式base1(3),列印"base1 3"

第五步:構造b2,在初始化列表中找b2(d),呼叫base2的建構函式base1(4),列印"base2 4"

第六步:構造b3,在初始化列表中找不到b3(),呼叫base3的建構函式base3(),列印"base3 *"

(4)self

第7步:執行自己的建構函式體,輸出"derived."

本文標題: c++建構函式初始化順序詳解

本文位址:

C 建構函式初始化順序

c 建構函式按下列順序被呼叫 1 任何虛擬基類的建構函式按照它們被繼承的順序構造 2 任何非虛擬基類的建構函式按照它們被繼承的順序構造 3 任何成員物件的建構函式按照它們宣告的順序呼叫 4 類自己的建構函式。include using namespace std class obj1 class o...

C 建構函式初始化順序

建構函式初始化按照如下順序進行 1.首先構造虛擬基類,任何虛擬基類的建構函式按照它們被繼承的順序構造 2.其次構造非虛擬基類,任何非虛擬基類的建構函式按照它們被繼承的順序構造 3.接著構造成員物件,任何成員物件的建構函式按照它們宣告的順序呼叫 4.最後呼叫類自身的建構函式 析構函式就無腦的將建構函式...

C 建構函式初始化順序

c 建構函式按下列順序被呼叫 1 任何虛擬基類的建構函式按照它們被繼承的順序構造 2 任何非虛擬基類的建構函式按照它們被繼承的順序構造 3 任何成員物件的建構函式按照它們宣告的順序呼叫 4 類自己的建構函式。include using namespace std class obj1 class o...