为什么默认构造函数不存在于包含const数据成员的类

时间:2013-05-23 06:07:40

标签: 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;
}

5 个答案:

答案 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)

由于aconst变量,您可以将其声明为静态并初始化它,而不使用如下构造函数,

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,你可以在任何你喜欢的地方设置它!