在說這個之前我想問乙個問題,如果成員變數是私有的,我們怎麼初始化這些私有的成員變數?
其實這就是建構函式的存在的理由,因為這個成員變數為私有的,要對它們進行初始化,必須用乙個
公有成員函式來進行。同時這個函式應該有且僅在定義物件時自動執行一次,這時呼叫的函式稱為構
造函式(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...