2012-01-30 137 views
5

在複製構造函數中爲什麼參數需要具有與它們相關的默認值? 如果沒有與它們關聯的默認值並且在構造函數中提供了多個參數,會發生什麼情況?複製構造函數參數

例如:

X(const X& copy_from_me, int = 10); 

有整型的默認值,但這樣的:

X(const X& copy_from_me, int); 

沒有。第二種情況會發生什麼?

http://en.wikipedia.org/wiki/Copy_constructor

+0

你是什麼意思? – kennytm 2012-01-30 15:13:23

+0

X(const X&copy_from_me,int = 10);如果我寫X(const X&copy_from_me,int); – haris 2012-01-30 15:16:56

+1

對於這個有趣的問題,你應該在下次的演講中多加一點努力:) – 2012-01-30 15:22:08

回答

9

拷貝構造函數總是需要一個參數,參照用於其所屬,有也許其他參數,但他們必須默認值的類型。

一個拷貝構造函數被調用作爲複印功能和拷貝構造的目的是通過使用相同的類型作爲創建新類型的基礎的一個目的是創建一個類型的對象。

標準規定的是拷貝構造函數是類型:

T(const &T obj); 

這基本上允許按值調用函數或返回值的類型的對象時臨時對象的創建。如果被傳遞到拷貝構造函數的其他參數

T obj1(obj2);  <--------- Direct Initialization 
T obj1 = obj2;  <--------- Copy Initialization 

不會被授權有默認值,然後使用上述語法是不可能的對象的構造:
這句法有利於建立一個新的對象作爲。
因此,嚴格的條件,
也許其它參數拷貝構造函數,但他們必須默認值。

9

當調用拷貝構造函數,這是保證是唯一可用的東西是同一類的實例的引用。如果複製構造函數的參數超出此必需的引用,那些參數必須具有默認值。

比方說,我們有以下簽名的構造函數:

X(const X&, int); 

這不能作爲一個拷貝構造函數,因爲第二個參數。例如:

X x1; 
X x2(x1); 

編譯器如何使用x2的上述構造函數?它不能。

在另一方面,下面的可以被用作複製構造:

X(const X&, int = 0); 
+0

+1不止一個班輪! – ezdazuzena 2012-01-30 15:24:22

1

複製構造必須是可調用與剛剛所述類型的一個目的是要複製:

Thing t1;  // default constructor 
Thing t2(t1); // copy constructor 

如果沒有默認值的額外參數,那麼構造函數不能像這樣調用,所以它不是一個複製構造函數。

3

複製構造函數具有一個參數,該參數是對所複製類型的引用。

可以有附加參數,如果這些有默認值。如果他們沒有默認值,它只是不是一個複製構造函數。