C ++多个构造函数初始化和销毁

时间:2013-08-12 12:03:46

标签: c++ constructor destructor

我有一个包含两个构造函数的类:

A::A(int a) and A::A(double a). 

这些构造函数初始化不同的成员变量。在第一种情况下,我初始化一个地图,在第二种情况下,我初始化一个指针。

第一种情况:

 A::A(int a): mymap() {}

第二种情况:

A::A(double a) : mypointer(NULL) {} 

我的问题是,当创建使用这两个不同构造函数的两个对象时,在调用此类的析构函数时应该考虑什么?我的意思是,按如下方式编写析构函数就足够了: - 我检查mymap是否为空,然后删除条目 - 我检查mypointer是否为null然后删除mypointer。

A::~A(){
  if(!mymap.empty()) { delete entries and clear the map}

  if(mypointer != NULL) { delete mypointer; mypointer =NULL; } 
}

然后,如果我在两个构造函数中初始化两个变量,如:

A :: A(int a):mymap(),mypointer(NULL){}  A :: A(双a):mymap(),mypointer(NULL){}

我的析构函数安全吗?或者我应该删除条件并直接删除。

3 个答案:

答案 0 :(得分:3)

您需要初始化两个构造函数中的所有成员。

例如,考虑一下在其中一个构造函数中初始化的指针。由于其他构造函数没有初始化它,因此它的值将是未定义的,因此在检查析构函数中的指针时会有未定义的行为。

答案 1 :(得分:0)

首先在构造函数中初始化所有成员变量,否则会导致内存错误。 mymap无需检查,因为mymap不是指针,如果是mypointer,则首先检查NULL是否正确

答案 2 :(得分:0)

  

我的问题是,当创建使用这两个不同构造函数的两个对象时,在调用此类的析构函数时应该考虑什么?我的意思是足以按如下方式编写析构函数: - 我检查mymap是否为空然后删除条目 - 我检查mypointer是否为null然后删除mypointer。

您的方法在技术上是正确的 - 也就是说,检查并释放析构函数中的所有资源。 但是,从概念上讲,我建议有两个类,因为它看起来至少需要两个 completeley不同的接口和实现。