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

发布于 2024-08-24 02:18:28 字数 551 浏览 5 评论 0原文

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

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)};      
}

有人可以向我解释为什么会发生这种情况吗?

From previous post, I learnt that for there are two ways, at least, to declare an array without default constructors. Like this

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)}; 

I also learnt that the first one will construct the object using the parameter directly and the second copy constructor is used here. However, when I test the code below. I make the copy constructor private. I expect to see the difference of the copy constructor usage. But it is not what I expected. Neither of the two declarations is working.

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)};      
}

Can anybody explain to me why does this happen?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

想挽留 2024-08-31 02:18:28

第一个不会直接构造对象。它首先构造一个临时的 Foo,然后将 Foo 复制到元素中。和你的第二种方式类似。不同之处在于,第二种方法不适用于显式复制构造函数,而第一种方法则可以。相反,第一个不适用于采用 int 的显式构造函数,而第二个则可以。换句话说,元素初始化中使用的第一个构造函数不能是显式的。

请注意,这两种方式都不需要复制。但他们仍然需要检查复制构造函数是否可访问。因此,他们的行为应该就像他们会复制一样,但他们实际上并不需要复制。

The first won't construct the objects directly. It will first construct a temporary Foo, and then copy the Foo into the element. It's similar to your second way. The difference is that your second way won't work with a explicit copy constructor, while your first will. And conversely, the first will not work with a explicit constructor taking int, while the second will. Stated another way, the first constructor used in the initialization of an element must not be explicit.

Notice that neither way needs to copy. But they still need to check whether the copy constructors are accessible. So, they shall behave as-if they would copy, but they don't really need to do the copy.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文