为什么直接从另一个构造函数调用的构造函数不能修改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;
}
答案 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.
...
}