为什么从另一个构造函数内部调用的C ++构造函数不会修改类变量?

时间:2018-10-02 19:40:02

标签: c++

为什么直接从另一个构造函数调用的构造函数不能修改C ++中的类变量?

例如,在下面的代码中,evenNum()被调用,但是val类变量未修改。因此它将打印0(默认值),而不是预期的2。

#include <iostream>

class evenNum {
  public:
    int val;
    evenNum(){
      this->val = 2;
    }
    evenNum(int var)
    {
      if(var%2==0){
        this->val = var;
      }else{
        evenNum();
      }
    }
};

int main() {
  evenNum e(7);
  std::cout << e.val;
}

2 个答案:

答案 0 :(得分:5)

    evenNum();

创建一个临时对象。它对正在构造的对象没有任何作用。

您可以使用委派构造器,也可以直接设置成员变量的值。

evenNum(int var) : evenNum()
{
  if(var%2==0){
    this->val = var;
  }
}

evenNum(int var)
{
  if(var%2==0){
    this->val = var;
  }else{
    this->val = 2;
  }
}

使用委派的构造函数更好。可以清楚地表达意图并减少代码重复。

答案 1 :(得分:1)

您的第二个构造函数(具有参数的构造函数)不会调用第一个构造函数(没有参数的结构,即默认构造函数)。因此,数据成员不是预先设置的。

在C ++中,要调用默认构造函数,您需要在方法签名后指定调用。写:

evenNum(int var) : evenNum()
{ ...
}

请注意-与其他编程语言(例如Java)不同,不能从函数体内调用构造函数。因此,函数体内的evenNum()不会调用构造函数,而是创建一个(未使用的)临时对象:

evenNum(int var)
{
    evenNum();  // a new object is created (distinct from "this"), and discarded then.
    ...
}