为什么编译器没有为包含常量数据成员的类添加默认构造函数。 请看下面的代码,因为我已经声明了常量数据成员'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;
}
答案 0 :(得分:4)
C ++ 03规则在12.6.2 / 4 [class.base.init]中指定。如果构造函数的成员初始化列表中未提及类的非静态成员,那么如果它是const
限定的,则它必须是具有用户声明的构造函数的非POD类类型,否则计划将是不正确的。使用空成员初始化列表(和空体)定义隐式定义的构造函数,因此,在这种情况下,导致隐式声明的默认构造函数被隐式定义,它也会导致程序格式错误。
C ++ 11规则相同。未在成员初始值设定项列表中指定的非静态数据成员是默认初始化。在C ++ 11 8.5 / 6 [dcl.init]中,“[...]如果程序调用const限定类型T
的对象的默认初始化,T
应该是具有用户提供的默认构造函数的类类型。“在这种情况下归结为相同的规则。
答案 1 :(得分:2)
由于const值在初始化后无法更改,因此默认构造函数如何为其选择值。因此,未创建默认构造函数
答案 2 :(得分:2)
由于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;
}
答案 3 :(得分:1)
类型int
在C或C ++中没有默认值,因此a
的值将是未定义的。例如,如果VC ++在调试中运行,如果它在发布模式下运行,则VC ++将使用不同的默认值填充a
的值。
在debug中,VC ++ populates uninitialized memory具有以下值:
- 0xCCCCCCCC - 由Microsoft的C ++调试运行时库和许多DOS环境用于标记未初始化的堆栈内存。
- 0xCDCDCDCD - 由Microsoft的C / C ++调试malloc()函数用于标记未初始化的堆内存,通常从HeapAlloc()返回
因此,如果不初始化a
,程序每次都会有不同的const值。
答案 4 :(得分:0)
我相信你必须在构造函数中显式初始化const成员,你必须将它们设置在某个地方,因为它们是const,你可以在任何你喜欢的地方设置它!