2010-03-06 55 views
2

從前一篇文章中,我瞭解到,至少有兩種方法可以聲明一個沒有默認構造函數的數組。像這樣關於C++中沒有默認構造函數的數組的一個問題

class Foo{ 
    public: 
    Foo(int i) {}  
}; 
    Foo f[5] = {1,2,3,4,5}; 
    Foo f[5] = {Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)}; 

我還了解到,第一個會直接使用參數構造對象,第二個拷貝構造函數在這裏使用。但是,當我測試下面的代碼。我使複製構造函數是私人的。我期望看到複製構造函數使用的區別。但這不是我所期望的。這兩個聲明都不起作用。

class Foo{ 
    public: 
    Foo(int i) {}  
    private: 
    Foo(const Foo& f) {} 
}; 
int main(){ 

    Foo f[5] = {1,2,3,4,5}; 
    Foo f[5] = {Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)};  
} 

有人可以向我解釋爲什麼會發生這種情況?

+1

@skydoor:現在你已經問了100個問題:-) – 2010-03-06 16:33:18

回答

5

第一個不會直接構造對象。它將首先構造一個臨時的Foo,然後將Foo複製到元素中。這與你的第二種方式類似。不同之處在於,第一種方法在第一種方法中不適用於explicit拷貝構造函數。相反,第一個將不會與一個explicit構造函數使用int,而第二個將會。換句話說,元素初始化中使用的第一個構造函數不能是explicit

請注意,這兩種方式都不需要複製。但他們仍然需要檢查複製構造函數是否可訪問。所以,他們應該表現爲,如果他們會複製,但他們並不需要複製。

相關問題