標籤:one std 總結 code double 程式 資訊 bsp class
參考:http://www.weixueyuan.net/view/6341.html
總結:
預設參數的建構函式,其預設參數必須置於參數列表的結尾。
設計類的建構函式的時候最好不要同時是用建構函式的重載和帶參數的建構函式。
我們可以想象一個這樣的情境:某一天書店整理庫存,發現了一些非常老的書,為了儘快清空庫存,店主想了一下,決定開展一個大甩賣活動,所有的這些書全部以五美元的價格出售。此時如果需要儘快將這些書的資訊錄入到書店的書單中,為了方便,我們可以在book類中添加一個帶預設參數的建構函式。
[例1] 預設帶參建構函式樣本:
#include<iostream>using namespace std;class book{public: book(){} book(char* a, double p = 5.0); void display();private: double price; char * title;};book::book(char* a, double p) //在定義函數的時候可以不指定預設參數{ title = a; price = p;}void book::display(){ cout<<"The price of "<<title<<" is $"<<price<<endl;}int main(){ book Harry("Harry Potter", 49.9); Harry.display(); book Gone("Gone with the Wind"); Gone.display(); return 0;}
在本例中,book類中的帶參建構函式 book(char* a, double p = 5.0); 將價格設定為5.0,如此一來p就被設定成為一個預設參數,如果在建立對象的時候,沒有傳遞實參給該參數p,則該參數會被預設設定為5.0。
在例1的主函數中我們可以看到Harry對象建立時傳遞了兩個實參"Harry potter"和49.9,而Gone 對象則只是傳遞了一個實參"Gone with the Wind"用於初始化title,此時price就會被用預設參數初始化為5.0。
程式運行結果如下:
The price of Harry Potter is $49.9
The price of Gone with the Wind is $5.0
需要說明的是帶預設參數的建構函式,其預設參數必須置於參數列表的結尾。如果例1中帶參建構函式 book(char* a, double p = 5.0); 被聲明成 book(double p = 5.0, char* a); 則是無法通過編譯的,因為預設參數不在參數列表的結尾。
雖然帶參數的建構函式會給我們初始化帶來一定便利,但糟糕的是它也會給建構函式的調用帶來歧義。
[例2] 預設帶參建構函式所帶來的歧義:
- #include<iostream>
- using namespace std;
-
- class book
- {
- public:
- book(){}
- book(char* a, double p = 5.0);
- book(char *a);
- void setprice(double a);
- double getprice();
- void settitle(char* a);
- char * gettitle();
- void display();
- private:
- double price;
- char * title;
- };
- book::book(char* a, double p) //在定義函數的時候可以不指定預設參數
- {
- title = a;
- price = p;
- }
- book::book(char *a)
- {
- title = a;
- }
- void book::display()
- {
- cout<<"The price of "<<title<<" is $"<<price<<endl;
- }
- int main()
- {
- book Harry("Harry potter", 49.9);
- Harry.display();
- book Gone("Gone with the Wind"); //compile error
- Gone.display();
- return 0;
- }
在本例中有三個建構函式,一個是預設建構函式,兩個帶參建構函式,其中一個為帶有預設參數的建構函式。
在主函數中,通過book類建立Harry對象沒有問題,此時建立對象只能調用book(char* a, double p = 5.0);建構函式。建立Gone對象時則有問題了,此時我們建立對象有兩個與之匹配的建構函式可以調用,分別是book(char *a);和book(char* a, double p = 5.0);,此時該調用哪一個呢?無法得知,編譯器只能報錯了。
出現這種情況我們只能極力去避免了,通常而言,在設計類的建構函式的時候最好不要同時是用建構函式的重載和帶參數的建構函式,以避免上述問題。
2.9 C++使用預設參數的建構函式