微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/c/115871.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐