2010-03-06 54 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

请注意,这两种方式都不需要复制。但他们仍然需要检查复制构造函数是否可访问。所以,他们应该表现为,如果他们会复制,但他们并不需要复制。

相关问题