gpt4 book ai didi

c++ - `Base *b = new Base;` 与 `Base *b = new Base();` 没有定义我自己的构造函数

转载 作者:可可西里 更新时间:2023-11-01 16:03:23 26 4
gpt4 key购买 nike

如果我不定义自己的构造函数,Base *b = new Base;Base *b = new Base(); 之间有什么区别吗?

最佳答案

初始化是标准中要遵循的一种 PITA...然而,这两个已经存在的答案在他们遗漏的内容上是不正确的,这使他们确认没有区别。

在没有用户定义的构造函数的类中调用 new Tnew T() 之间存在巨大差异。在第一种情况下,对象将被默认初始化,而在第二种情况下,它将被“值初始化*”。如果对象包含任何 POD 子对象,那么第一个将使 POD 子对象保持未初始化状态,而第二个会将每个子元素设置为 0。

struct test {
int x;
std::string s;
};
int main() {
std::auto_ptr<test> a( new test );
assert( a->s.empty() ); // ok, s is string, has default constructor
// default constructor sets it to empty
// assert( a->x == 0 ); // this cannot be asserted, the value of a->x is
// undefined
std::auto_ptr<test> b( new test() );
assert( b->s.empty() ); // again, the string constructor sets to empty
assert( b->x == 0 ); // this is guaranteed by *value-initialization*
}

对于漫长的道路... default-initialize 对于用户定义的类意味着调用默认构造函数。在没有用户提供默认构造函数的情况下,它将调用隐式定义的默认构造函数,这相当于一个具有空初始化列表和空主体的构造函数 (test::test() {} ),这将导致每个非 POD 子对象的默认初始化,并使所有 POD 子对象保持未初始化状态。由于 std::string 有一个 user(根据用户的一些定义,包括标准库编写器)提供的构造函数,它会调用这样的构造函数,但它不会执行任何x 成员的真正初始化。

也就是说,对于具有用户提供的默认构造函数的类,new Tnew T() 是相同的。对于没有这种构造函数的类,则取决于类的内容。

关于c++ - `Base *b = new Base;` 与 `Base *b = new Base();` 没有定义我自己的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3697750/

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