2.9 C++使用預設參數的建構函式

來源:互聯網
上載者:User

標籤: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] 預設帶參建構函式所帶來的歧義:

  1. #include<iostream>
  2. using namespace std;
  3. class book
  4. {
  5. public:
  6. book(){}
  7. book(char* a, double p = 5.0);
  8. book(char *a);
  9. void setprice(double a);
  10. double getprice();
  11. void settitle(char* a);
  12. char * gettitle();
  13. void display();
  14. private:
  15. double price;
  16. char * title;
  17. };
  18. book::book(char* a, double p) //在定義函數的時候可以不指定預設參數
  19. {
  20. title = a;
  21. price = p;
  22. }
  23. book::book(char *a)
  24. {
  25. title = a;
  26. }
  27. void book::display()
  28. {
  29. cout<<"The price of "<<title<<" is $"<<price<<endl;
  30. }
  31. int main()
  32. {
  33. book Harry("Harry potter", 49.9);
  34. Harry.display();
  35. book Gone("Gone with the Wind"); //compile error
  36. Gone.display();
  37. return 0;
  38. }

在本例中有三個建構函式,一個是預設建構函式,兩個帶參建構函式,其中一個為帶有預設參數的建構函式。

在主函數中,通過book類建立Harry對象沒有問題,此時建立對象只能調用book(char* a, double p = 5.0);建構函式。建立Gone對象時則有問題了,此時我們建立對象有兩個與之匹配的建構函式可以調用,分別是book(char *a);和book(char* a, double p = 5.0);,此時該調用哪一個呢?無法得知,編譯器只能報錯了。

出現這種情況我們只能極力去避免了,通常而言,在設計類的建構函式的時候最好不要同時是用建構函式的重載和帶參數的建構函式,以避免上述問題。

2.9 C++使用預設參數的建構函式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.