为什么编译器没有为包含常量数据成员的类添加默认构造函数。请参阅下面的代码,因为我已经声明了常量数据成员"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;
}
c++ 03规则在12.6.2/4 [class.base.init]中指定。如果在构造函数的成员初始化列表中没有提到类的非静态成员,那么如果它是const
合格的,那么它必须是具有用户声明的构造函数的非pod类类型,否则程序将是病态的。隐式定义的构造函数是用空的成员初始化列表(和空的主体)定义的,因此,在这种情况下,导致隐式声明的默认构造函数被隐式定义,也会使程序格式不正确。
c++ 11规则也是一样的。未在成员初始化列表中指定的非静态数据成员为默认初始化。在c++ 11 8.5/6中[dcl. 6]init)[…如果程序调用具有const限定类型T
的对象的默认初始化,则T
应该是具有用户提供的默认构造函数的类类型。
既然const值在初始化后不能更改,那么默认构造函数如何为它选择值呢?所以没有创建默认构造函数
由于a
是const
变量,您可以将其声明为静态并初始化,而无需使用构造函数,如下所示
class ClassA
{
private:
const static int a=10;
public :
void print()
{
cout << "hello world" << endl;
}
};
int main()
{
ClassA obj;
obj.print();
return 0;
}
类型int
在C或c++中没有默认值,因此a
的值将未定义。例如,如果在调试模式下运行,vc++将用不同的默认值填充a
的值,如果它在发布模式下运行。
在调试中,vc++用以下值填充未初始化的内存:
- 0xCCCCCCCC -被微软的c++调试运行库和许多DOS环境用来标记未初始化的堆栈内存。
- 0xCDCDCDCD -由微软的C/c++调试malloc()函数用于标记未初始化的堆内存,通常从HeapAlloc()返回
如果不初始化a
,你的程序每次都会有不同的const值
我相信你必须在构造函数中显式初始化const成员,你必须在某个地方设置它们,因为它们是const,你可以在任何你喜欢的地方设置它!