gpt4 book ai didi

c++ - 为什么用户定义类型的数组必须调用其默认构造函数?

转载 作者:行者123 更新时间:2023-11-30 00:55:10 24 4
gpt4 key购买 nike

请考虑下面的例子

struct Foo
{
int bar;
Foo(int i):bar(i){cout << "real ctor\n";}
Foo(){cout << "default ctor\n";}
};

int main()
{
Foo fooArr[3];//default ctor called 3 times
for(int i=0;i!=3;++i)cout << fooArr[i].bar << endl;//bare memory junk
cout << endl;

vector<Foo> fooVec;
for(int i=0;i!=3;++i){
fooVec.push_back(Foo(i)); //only real ctor called
cout << fooVec[i].bar << endl;//real thing
}
cout << endl;

int iArr[3];
for(int i=0;i!=3;++i)cout << iArr[i] << endl;//bare memory junk
}

我不希望 Foo 的任何用户调用它的默认构造函数,因为它不在我的设计中。但我希望我的用户能够使用 Foo 数组,为了支持这一点,我不得不提供一个毫无意义且令人困惑的 Foo::Foo()。我只是不明白为什么 C++ 标准会强制程序员做这样的事情。其背后的原理是什么?为什么不一致?请哪位聪明的 friend 给我解释一下,好吗?提前致谢!

最佳答案

您可以制作 Foo 的数组即使它没有默认构造函数。只是在声明数组时必须 构造元素。所以你可以这样做:

Foo fooArr[] = { Foo( 1 ), Foo( 2 ), Foo( 3 ) };

替代方法是使用动态数组(您的 vector<Foo> 示例,这可能是最好的)或指向 Foo 的指针数组(如 shared_ptr<Foo> arrFoo[3])

shared_ptr<Foo> arrFoo[3];
arrFoo[2].reset( new Foo(3) );

关于 vector<Foo> 的最后说明: 由于数组的大小是事先已知的,您可以通过在 vector 中为所有 future 保留足够的空间来提高性能 Foo小号:

vector<Foo> arrFoo;
arrFoo.reserve( 3 );

for( int i = 0; i<3; ++i )
arrFoo.push_back( Foo( i ) );

编辑:你的问题是为什么你必须有一个默认的构造函数来创建一个类型的静态数组。我认为答案很明确,但我会尝试解释一下。

Foo bar1; Foo bar2;使用默认构造函数创建两个对象,因为没有提供参数。

Foo bar[2];本质上是一样的。它声明了两个需要构造的对象。没有构造对象就无法声明它 - 这就是首先声明它的意义所在。

C++ 中的静态数组只是一堆连续放置在内存中的对象。它不是一个单独的对象。

希望这是有道理的。

关于c++ - 为什么用户定义类型的数组必须调用其默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12870853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com