初始化数据成员取决于构造函数内的条件

时间:2018-06-13 20:37:30

标签: c++ constructor

#include<iostream>

using namespace std;

class Fraction {

    int numerator;
    int denominator;

public:

    Fraction(int a, int b) {

       if (a > 0 && b > 0) {
            numerator = a;
            denominator = b;
       }
       else {
           Fraction();
       }
   }

   Fraction() {
       numerator = 0;
       denominator = 0;
   }

   void display() const {
       if (numerator == 0 && denominator == 0) {
           cout << "data member is 0" << endl;
       }
       else {
           cout << "data member is not 0" << endl;
       }
   }
};

int main(void) {

   Fraction c(-5,15);
   c.display();

   return 0;
}

我期望打印出“数据成员为0”,因为我在创建对象时传递了-5,这与Fraction(int a,int b)中的条件不匹配。 但是,它打印出“数据成员不为0”。所以我试图打印出每个数据成员,并打印出数据成员的地址,如-8776877。 请帮帮我

2 个答案:

答案 0 :(得分:2)

你实际上并没有重新分配分子和分母的值。

在你的else语句中,你只需调用Fraction()。这只是调用Fraction类的构造函数而不对它做任何事情。因此,在代码的最后,分子和分母仍然没有被赋值为0。

在else语句中你应该做的是:

else {
    numerator = 0;
    denominator = 0;
}

答案 1 :(得分:1)

您可以在类声明中默认初始化数据成员,并依赖编译器生成的默认构造函数,

class Fraction {
  public:
    Fraction() = default;
    Fraction(int a, int b);

  private:
    int numerator = 0;
    int denominator = 0;
};

这样,您就不必从用户定义的构造函数中调用默认构造函数:

Fraction::Fraction(int a, int b) {
    if (a > 0 && b > 0) {
        numerator = a;
        denominator = b;
    }
}

还有其他选项,但具有有意义默认值的类内初始值设定项是CoreGuidelines建议的。