c – `Base * b = new Base;`vs`Base * b = new Base();`而不定义我自己的构造函数

前端之家收集整理的这篇文章主要介绍了c – `Base * b = new Base;`vs`Base * b = new Base();`而不定义我自己的构造函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我没有定义我自己的构造函数,Base * b = new Base之间有什么区别? vs Base * b = new Base(); ?

解决方法

初始化是一种遵循标准的PITA.但是,现在已经存在的两个答案在错误中是不正确的,这使得他们确认没有任何区别.

在没有用户定义的构造函数的类中,调用新T和新T()之间有很大的区别.在第一种情况下,对象将被默认初始化,而在第二种情况下,它将是“value-initialized *”.如果对象包含任何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有一个用户(通过用户的一些定义,包括标准库编写器)提供的构造函数,它将调用这样的构造函数,但它不会对x成员执行任何真正的初始化.

也就是说,对于具有用户提供的默认构造函数的类,新的T和新的T()是相同的.对于没有这样的构造函数的类,它取决于类的内容.

原文链接:https://www.f2er.com/c/115871.html

猜你在找的C&C++相关文章