C 語言 類中的建構函式和拷貝建構函式

2021-07-27 23:08:13 字數 2927 閱讀 9314

在說這個之前我想問乙個問題,如果成員變數是私有的,我們怎麼初始化這些私有的成員變數?

其實這就是建構函式的存在的理由,因為這個成員變數為私有的,要對它們進行初始化,必須用乙個

公有成員函式來進行。同時這個函式應該有且僅在定義物件時自動執行一次,這時呼叫的函式稱為構

造函式(constructor) 

下面就是建構函式的特徵:

1.函式名與類名相同。

2.無返回值。

3.物件構造(物件例項化)時系統自動呼叫對應的建構函式。

4.建構函式可以過載。

5.建構函式可以在類中定義,也可以在類外定義。

6.如果類定義中沒有給出建構函式,則c++編譯器自動產生乙個預設的建構函式,但只要我們定義了乙個

建構函式,系統就不會自動生成預設的建構函式。

7.無參的建構函式和全預設值的建構函式都認為是預設建構函式,並且預設的建構函式只能有乙個。

下面我們舉個例子:

定義乙個date類,在它嘗試使用一下建構函式。

class date

// 2.帶參建構函式

date(int year, int month, int day)

void display()

private:

int _year;

int _month;

int _day;

};void testdate1()

int main()

由於並未對類中的成員進行初始化,也就是我們呼叫了無參的建構函式,不出所料出現的是隨機值。

現在我們試試有參的建構函式:

class date

// 2.帶參建構函式

date(int year, int month, int day)

void display()

private:

int _year;

int _month;

int _day;

};void testdate1()

int main()

因為我們知建構函式是可以過載的,所以我們這次使用有參的建構函式。結果應該是我首先輸出一段話

,然後依次列印出成員變數,我們來看看:

還有一種預設引數的建構函式,我們分別來看看他們的結果:

class date

// 4.半預設引數的建構函式(不常用)

date(int year, int month = 1)

void display()

private:

int _year;

int _month;

int _day;

};void test()

int main()

看看結果,因為它早早地已經有自己的值了,所以就算沒有引數也沒有關係

// 4.半預設引數的建構函式(不常用)

date(int year, int month = 1)

void display()

private:

int _year;

int _month;

int _day;

};//這裡注意半缺席的建構函式,引數從前往後可以預設,但是不能從最後一位開始預設

備註:若預設引數宣告和定義分離,則可以在宣告或定義中給預設引數。

建立物件時使用同類物件來進行初始化,這時所用的建構函式稱為拷貝建構函式(copy constructor)

,拷貝建構函式是特殊的建構函式。

特徵:1.拷貝建構函式其實是乙個建構函式的過載。

2.拷貝建構函式的引數必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。

3.若未顯示定義,系統會預設預設的拷貝建構函式。預設的拷貝建構函式會,依次拷貝類成員進行初始化

舉個date類,練習一下拷貝構造。

class date

// 拷貝建構函式

date(const date& d)

void display()

private:

int _year;

int _month;

int _day;

};void testdate1()

int main()

這裡我們可以看到呼叫一次建構函式,呼叫兩次拷貝構造,然後讓我們看看結果吧。

拷貝建構函式特徵第二條,拷貝建構函式的引數必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。

這個為什麼不行呢?

思考一下,如果我們使用值傳遞,傳參的時候是不是需要建立乙個新的形參,而這個新的形參就值本身,

也就是自身的乙個拷貝,然後呢,又呼叫了拷貝構造,然後就無窮遞迴了。

還有乙個問題。

c 中的建構函式和拷貝建構函式

c 的類有六個預設成員函式,我今天介紹其中的兩個,乙個是建構函式另乙個是拷貝建構函式。建構函式用於當類的物件被建立時,給它分配記憶體空間,並且由編譯器自動呼叫建構函式對類物件進行初始化工作。建構函式的函式名與類名相同,沒有返回型別。下面是乙個例子 class string private char ...

c 建構函式和拷貝建構函式

c 中為什麼要使用建構函式?c 是從c演變過來的,c中存在的是結構體,例如 對點point struct point 但是對點的操作還要在外部使用函式來實現。c 中包括了成員屬性和成員方法,但是由於類的封裝性,不能像普通變數乙個對成員屬性就行初始化,所以使用建構函式。class point doub...

C 的建構函式和拷貝建構函式

編譯器自動生成的構造僅僅做讓編譯能通過的事情,它不會初始化成員變數。編譯器並不會自動生成預設的建構函式和拷貝建構函式,僅僅在它需要的時候。沒錯!對於下面的類 class test 編譯器不會自動生成建構函式,因為沒有字段需要初始化。很多時候都需要深拷貝,這時需要自己定義copy constructo...