1. 程式人生 > >C++使用預設引數的建構函式

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

轉載自:http://blog.csdn.net/maojudong/article/details/8172672

建構函式中引數的值既可以通過實參傳遞,也可以指定為某些預設值,即如果使用者不指定實參值,編譯系統就使形參取預設值。在建構函式中也可以採用這樣的方法來實現初始化。

例9.3的問題也可以使用包含預設引數的建構函式來處理。例9.4 將例9.3程式中的建構函式改用含預設值的引數,長、寬、高的預設值均為10。

在例9.3程式的基礎上改寫如下:
#include <iostream>
using namespace std;
class Box
{
   public :
   Box(int h=10,int w=10,int len=10); //在宣告建構函式時指定預設引數


   int volume( );
   private :
   int height;
   int width;
   int length;
};
Box::Box(int h,int w,int len) //在定義函式時可以不指定預設引數
{
   height=h;
   width=w;
   length=len;
}
int Box::volume( )
{
   return (height*width*length);
}
int main( )
{
   Box box1; //沒有給實參
   cout<<″The volume of box1 is ″<<box1.volume( )<<endl;

   Box box2(15); //只給定一個實參
   cout<<″The volume of box2 is ″<<box2.volume( )<<endl;
   Box box3(15,30); //只給定2個實參
   cout<<″The volume of box3 is ″<<box3.volume( )<<endl;
   Box box4(15,30,20); //給定3個實參
   cout<<″The volume of box4 is ″<<box4.volume( )<<endl;
   return 0;

}
程式執行結果為
The volume of box1 is 1000
The volume of box2 is 1500
The volume of box3 is 4500
The volume of box4 is 9000
程式中對建構函式的定義(第12-16行)也可以改寫成引數初始化表的形式:
   Box::Box(int h,int w,int len):height(h),width(w),length(len){ }
可以看到: 在建構函式中使用預設引數是方便而有效的,它提供了建立物件時的多種選擇,它的作用相當於好幾個過載的建構函式。

它的好處是: 即使在呼叫建構函式時沒有提供實參值,不僅不會出錯,而且還確保按照預設的引數值對物件進行初始化。尤其在希望對每一個物件都有同樣的初始化狀況時用這種方法更為方便。

關於建構函式預設值的幾點說明:

  1. 應該在宣告建構函式時指定預設值,而不能只在定義建構函式時指定預設值。
  2. 程式第5行在宣告建構函式時,形參名可以省略。
  3. 如果建構函式的全部引數都指定了預設值,則在定義物件時可以給一個或幾個實參,也可以不給出實參。
  4. 在一個類中定義了全部是預設引數的建構函式後,不能再定義過載建構函式。
 注意1:    定義物件的時候,不能像下面呼叫預設的建構函式,編譯器會理解為相當於宣告了一個返回值為 Box物件的函式  
   Box box0();  
   應該按照這種方法進行呼叫無參的建構函式    Box box1; //呼叫無參的建構函式    普通的函式呼叫 如A a;   a.func1()  ;則需要帶有小括號來呼叫無引數的函式    注意2:
   定義了預設引數的函式後(包括建構函式和成員函式,普通函式),就不能才定結構類似的過載函數了。 如定義了預設建構函式    Box(int h=10,int w=10,int len=10); //在宣告建構函式時指定預設引數

   //又定義了無引數的建構函式
   Box()
   {
      cout<<"Construcor calling  Box()"<<endl;
   }
則 Box  a;  //定義物件的時候可能呼叫無參的建構函式,也有可能呼叫Box(int h=10,int w=10,int len=10); 的預設形式。產生了二義性,編譯器直接報錯