为什么没有为包含const数据成员的类提供默认构造函数



为什么编译器没有为包含常量数据成员的类添加默认构造函数。请参阅下面的代码,因为我已经声明了常量数据成员"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值在初始化后不能更改,那么默认构造函数如何为它选择值呢?所以没有创建默认构造函数

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

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

最新更新