在C ++中编写构造函数的正确方法

时间:2012-09-27 11:20:19

标签: c++ constructor dynamic-memory-allocation

编辑:将我的问题更改为更有意义的内容

如果我有课:

class A{
public:
     int nr;
     int *a;

     A();
};

A::A(): nr(0), a = new int[10]{}

这是短信,但如果我有

 A::A(): nr(0) {a = new int[10];}

有效。请向我解释这种行为。

3 个答案:

答案 0 :(得分:1)

nr(0)是数据成员nr的初始值设定项。

{a = new T[10]; }是一个构造函数体,在执行初始化列表中的初始化后,为数据成员a 分配值。

{}是一个空的构造函数体,它意味着构造函数什么都不做(当然,除了初始化nr之外,因为它在初始化列表中)。

初始化列表和构造函数体之间的

a = new int[10]是无意义的,语言的语法不允许它。它不应该编译,但是如果你发现一个接受它然后它崩溃的编译器,你将不得不查看该编译器的文档以获得解释。

答案 1 :(得分:1)

看起来应该是这样的:

template<class T>
class A {
public:
     int nr;
     T *a;
     A();
};

template<class T>
A<T>::A() : nr(0), a( new T[42]) { }

答案 2 :(得分:0)

也不应该编译。正确的方法是:

  • 第一种情况:A::A(): nr( 0 ), a( new int[5] ){}
  • 第二种情况:A<T>::A(): nr( 0 ), a( new T[10] ){}