nag*_*esh 5 c++ constructor default-constructor
为什么编译器没有为包含常量数据成员的类添加默认构造函数.请看下面的代码,因为我已经声明了常量数据成员'a',并且在尝试为类'ClassA'创建对象时,它表示没有适当的默认构造函数可用.请帮忙.
#include "stdafx.h"
#include <iostream>
using namespace std;
class ClassA
{
private:
const int a;
public :
void print()
{
cout << "hello world" << endl;
}
};
int main()
{
ClassA obj;
obj.print();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C++03 规则在 12.6.2/4 [class.base.init] 中指定。如果在构造函数的成员初始值设定项列表中没有提到类的非静态成员,那么如果它被const
限定,则它必须是具有用户声明的构造函数的非 POD 类类型,否则程序将出错-形成。隐式定义的构造函数使用空的成员初始值设定项列表(和空的主体)定义,因此,在这种情况下,导致隐式声明的默认构造函数被隐式定义,它也会导致程序格式错误。
C++11 规则相当于同一件事。未在成员初始值设定项列表中指定的非静态数据成员是默认初始化的。在 C++11 8.5/6 [dcl.init] 中,“[...] 如果程序调用 const 限定类型的对象的默认初始化T
,T
则应为具有用户提供的默认构造函数的类类型.” 在这种情况下归结为相同的规则。