2012-03-20 73 views
1
class Sample 
    { 
     public: 
     Sample(){} 
     Sample(const Sample& obj){ cout<<"C.C. with 1 argument called"<<endl;} 
     Sample(const Sample& obj, int i){ cout<<"C.C. with 2 arguments called"<<endl;} 
    }; 
    void main() 
    { 
     Sample s1; 
     Sample s2 = s1; // Here, C.C with 1 arg. called. 
    } 

有幾個問題:複製構造與2參數

  1. 我如何撥打電話,以複製爲2個參數的構造函數?
  2. 當我們需要一個具有1個參數的複製構造函數,並且當我們需要具有2個參數的C.C時?
+0

樣本s2 = s1; //這裏,C.C和1個參數。調用。您在此處呼叫賦值運算符。 – 2012-03-20 16:18:53

+0

@AlessandroTeruzzi:不,這是調用複製構造函數。 – 2012-03-20 16:23:19

+0

@BenjaminLindley你是對的!我從來沒有意識到這相當於樣本s2(s1);是標準還是編譯器優化? – 2012-03-20 16:33:36

回答

7

與2(或更多)需要參數構造函數是複製構造函數。

1:

Sample s2(s1, 0); 
+7

...除非第一個參數是對類類型的可能cv限定參考,並且所有bar可能第一個參數都具有默認值。 – 2012-03-20 16:10:14

+0

實際上,如果第二個參數具有默認值,那麼它可以是複製構造函數。 – Nawaz 2012-03-20 16:10:29

+0

是的,謝謝澄清。更新。 – 2012-03-20 16:12:24

2

一個類只有真正擁有一個拷貝構造函數,它可以只用一個參數來調用。它可以使用兩個(或更多)參數,但僅限於爲其他參數提供默認值。無論哪種方式,第一個參數必須是對同一類型的對象(通常是const)的引用。

你的第二個ctor獲取兩個參數並不是一個真正的複製ctor(至少正如這個術語通常使用的那樣) - 它只是一個恰好將實例作爲參數的ctor(可能基於該實例論點,至少部分)。

+0

*「一個班級只會有一個副本ctor」* ..是嗎?我認爲一個類可以有多個拷貝構造函數。 – Nawaz 2012-03-20 16:12:30

+1

@Nawaz:是和否 - 是的,從理論上講,你可能會有幾個超載,其中任何一個都可能有資格。但是,如果你這樣做了,並且實際上試圖以副本方式使用其中的一種,代碼將不會編譯,因爲它會不明確。 – 2012-03-20 16:14:55

+0

@Nawaz:那將是模棱兩可的,不是嗎? – 2012-03-20 16:15:09

4

只是在這裏添加一點形式主義。標準對「複製構造函數」術語(12.8)有嚴格定義:
A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments (8.3.6). [ Example: X::X(const X&) and X::X(X&,int=1) are copy constructors.