1. 程式人生 > >建構函式與預設建構函式

建構函式與預設建構函式

在C++中,結構體與類是相似的,他們可以互相進行繼承操作

比如我們構造一個類A和一個繼承A的結構體B

class A {
public:
	int a;
};

struct B:A
{

};

他們之間可以是相互的繼承關係,因此執行以下操作是被允許的

B b;
	b.a = 0;
	cout << b.a << endl;  //編譯能通過,B是struct,B的基類是A是通過public繼承,所以能通過

結構體中可以預設初始化物件,方法如下:

物件的初始化:
struct point{
    int x;
    int y;
};
int main()
{
    point p[3]{{1,2},{3,4},{5,6}};
    return 0;
}

同時,在一個struct裡面,Universal Construction會按照成員變數的定義順序挨個初始化struct每一個成員,但是,當有建構函式的時候,就會轉去呼叫建構函式

struct point:
{
Int x;
Int y;

Point(int v)
{
}

}

此時上面main()中的初始化方法就失效了,必須按照指定的初始化法進行初始化操作(這裡是傳入一個引數)

如果我們有多種構造方法該怎麼辦呢?這時候就可以進行建構函式的過載操作

struct point
{
	int x;
	int y;

	point() :x( 0 ), y( 0 ) {};
	point(int v) :x(v), y(v) {};
	point(int theX, int theY) :x(theX), y(theY) {};
};

這時我們就可以傳入不同的引數進行不同的構造:

(1)不使用建構函式,則會自動把兩個引數初始化為0

(2)傳入一個引數的建構函式,則會把兩個引數初始化為傳入的引數

(3)傳入兩個引數,則分別進行賦值

其中,C++中有一種default構造法,叫做預設建構函式:

struct DefaultPoint
{
	int x{};
	int y{};
	int z{};

	DefaultPoint() = default;
};

這樣呼叫,如果不呼叫建構函式,則全部初始化為0,然後根據引數定義的順序進行賦值,方法如下:

DefaultPoint AAA{1,2};
	cout << AAA.z << endl;

這樣使用,x就為1,y就為2,z預設就為0

如果不進行構造,則x,y,z都會為預設為0

這裡可能會有一些混淆,為什麼有的時候不寫預設建構函式就是有一個預設建構函式,有些時候就不是呢?因為編譯器只會在這個類沒有任何建構函式被寫出來的情況下會替我們生成一個預設建構函式,除非我們使用default。具體到我們的例子裡,因為point已經有point(int v)和point(int theX, int they)兩個構造函數了,因此如果我們不寫預設建構函式,那麼編譯器會認為這個類沒有預設建構函式