#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。 请帮帮我
答案 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建议的。