关于C ++中没有默认构造函数的数组的一个问题

时间:2010-03-06 16:22:39

标签: c++ arrays copy-constructor

从上一篇文章中我了解到,至少有两种方法可以声明一个没有默认构造函数的数组。喜欢这个

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 个答案:

答案 0 :(得分:5)

第一个不会直接构造对象。它将首先构造一个临时Foo,然后将Foo复制到元素中。它与你的第二种方式类似。不同的是,你的第二种方式不适用于explicit复制构造函数,而你的第一种方式。相反,第一个不适用于explicit构造函数使用int,而第二个将使用explicit。换句话说,元素初始化中使用的第一个构造函数不能是{{1}}。

请注意,这两种方式都不需要复制。但是他们仍然需要检查复制构造函数是否可访问。因此,他们应该按照 as 进行复制,但他们并不需要复制。