Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ `Base*b=新的Base;`vs`Base*b=newbase();`没有定义自己的构造函数_C++_Constructor - Fatal编程技术网

C++ `Base*b=新的Base;`vs`Base*b=newbase();`没有定义自己的构造函数

C++ `Base*b=新的Base;`vs`Base*b=newbase();`没有定义自己的构造函数,c++,constructor,C++,Constructor,如果我没有定义自己的构造函数,Base*b=newbase之间有什么区别吗vsBase*b=newbase()?编辑:请参见@David的答案——这是错误的,但我无法删除它,因为它已被接受 这两种情况都没有区别——不管您是否定义了自己的构造函数 唯一的区别是,对于基本类型(即int或float),添加()会将值初始化为零。() 请参阅此示例(输出处于打开状态) #包括 结构构造函数检查器 { 构造函数检查器() { 正如比利提到的,两者都是一个整体 这称为“值初始化语法”($8.5/7) 初始值

如果我没有定义自己的构造函数,
Base*b=newbase之间有什么区别吗vs
Base*b=newbase()

编辑:请参见@David的答案——这是错误的,但我无法删除它,因为它已被接受

这两种情况都没有区别——不管您是否定义了自己的构造函数

唯一的区别是,对于基本类型(即
int
float
),添加
()
会将值初始化为零。()

请参阅此示例(输出处于打开状态)

#包括
结构构造函数检查器
{
构造函数检查器()
{

正如比利提到的,两者都是一个整体

这称为“值初始化语法”($8.5/7)

初始值设定项为 空括号集,即(), 应初始化该值


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

调用
newt T
newt()之间有很大的区别
在没有用户定义构造函数的类中。在第一种情况下,对象将默认初始化,而在第二种情况下,对象将为“值初始化*。如果对象包含任何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*
}
struct测试{
int x;
std::字符串s;
};
int main(){
标准:自动测试a(新测试);
assert(a->s.empty());//确定,s是字符串,具有默认构造函数
//默认构造函数将其设置为空
//assert(a->x==0);//这不能断言,a->x的值为
//未定义
std::auto_ptr b(新测试());
assert(b->s.empty());//字符串构造函数再次设置为空
断言(b->x==0);//这由*值初始化保证*
}
对于漫长的道路…用户定义类的默认初始化意味着调用默认构造函数。如果没有用户提供的默认构造函数,它将调用隐式定义的默认构造函数,这相当于具有空初始化列表和空主体的构造函数(
test::test(){}
),这将导致每个非POD子对象的默认初始化,并使所有POD子对象保持未初始化状态。因为
std::string
有一个用户(根据包括标准库编写器的用户定义)如果提供构造函数,它将调用此类构造函数,但不会对
x
成员执行任何实际初始化


也就是说,对于具有用户提供的默认构造函数的类
new T
new T()对于没有这种构造函数的类,它依赖于类的内容。

一个微妙而奇怪的区别。C++的那种东西让你感到奇怪:为什么?Mike:向后兼容性没有任何意义,因为<代码>新< /代码>一直是这样的。我猜他们不希望用户不得不这样做。付费将内存初始化为零,但他们想提供一个
new
样式
calloc
替换(这要求将内存初始化为零)。
()
是一种合理的语法,因为它看起来像是在调用构造函数,构造函数初始化任何其他类型的值。我的意思是“向后兼容性”的含义是“需要
new BasicClass()
语法并禁止
new BasicClass
语法将破坏使用后者的代码。“我说,我喜欢你的解释。”麦克,因为C没有<代码>新< /Cord>或类,不需要保持向后兼容性。我相信这两个不同的语法从第一个C++规范中存在。我指的是向后兼容第一个C++规范,而不是C的任何版本。“C++ 98不会声明<新的BasicClass;< /Calp>非法。”“抱歉,混淆了。是第一个合法的C++代码吗?”Rave:是的,第一个是完全合法的(参见我的答案中的CODEPTA链接),可接受的答案是错误的。<代码>新的T/<代码>将默认初始化对象,而<代码>新的T-()。
将对其进行值初始化。链接问题可能重复的范围更广,但公认的答案也涵盖了这种情况。您引用了标准的正确部分,但您没有注意到它的重要性…对于非母语人士(包括我):(1)(2)感谢@afriza的链接。+1:现在,请指出我回答中的错误。还有+1,请给出一个好的答案。稍后将对其进行排队!!。将其作为我最喜欢的问题well@Chubsdad:无论如何,我没有投你的反对票。而且,被称为“可能重复”的问题/答案比这个好。我正在等待问题的答案e以完全相同的方式关闭以删除此答案。此答案的第三段在技术上是不正确的。具有空初始值设定项列表和空构造函数正文的构造函数不会导致POD类型的基和成员默认初始化,它将使它们未初始化。只有非POD类类型的基和成员才被删除lt已初始化。如果POD基和成员是默认初始化的,那么它们将被零初始化,并且值初始化没有区别。(12.6.2[class.base.init]第4段)
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*
}