Bjarne写道:
对于类型T,T()是默认值的符号表示,由默认构造函数定义。
如果我们不声明默认构造函数会发生什么?例如:
using namespace std;
class date{
int n,m;
public:
int day(){return n;}
int month(){return m;}
};//no default constructor
int main()
{
date any =date();
cout<<any.month()<<endl;
cout<<any.day()<<endl;
return 0;
}
这个程序的输出结果每次运行都是0和0。我没有声明任何默认构造函数,那么为什么会存在默认值即0?
编辑-
class date{
int n,m;
public:
date (){
m=1;}
int day(){return n;}
int month(){return m;}
};
int main()
{
date any =date();
cout<<any.month()<<endl;
cout<<any.day()<<endl;
return 0;
}
阅读了答案后,我提供了一个默认构造函数,但现在n的值变成了垃圾值。根据答案,由于m超出了任何其他构造函数的范围,并且它是值初始化(如答案中所述),因此n应该为0。
date any;
不会对其进行初始化。date any = date();
会调用编译器生成的默认构造函数,该函数将为所有基类和成员调用默认构造函数。对于int
类型,默认构造函数是int()
。它将把int
成员初始化为0
。您可以自行查看 链接。 - lapkv-table
的参考吗?这是一个笼统的说法,标准根本没有提到v-table
,动态分派是一种实现细节。不要依赖和基于可观察行为来建立你的基础,未定义和未指定的行为可能会展示任何行为。 - Alok Savedate (){m=1;}
。你刚才说的是“值初始化为那些超出任何构造函数范围的成员提供了零的初始值。在你的程序中,n和m超出了任何构造函数的范围,因此被初始化为0。”所以输出应该是n=0,m=1。但是n却得到了垃圾值。 - T.J.