为什么直接从另一个构造函数调用的构造函数不修改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;
}
行
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;
}
}
使用委托构造函数更好。它清楚地表达了意图并减少了代码重复。
你的第二个构造函数(带有参数的构造函数(不会调用第一个构造函数(没有参数的构造函数,即默认构造器(。因此,不会预先设置数据成员。
C++中,若要调用默认构造函数,需要在方法签名后指定调用。写:
evenNum(int var) : evenNum()
{ ...
}
请注意,与其他编程语言(例如java(不同,构造函数不能从函数体内部调用。因此,函数体中的evenNum()
不调用构造函数,而是创建一个(未使用的(临时对象:
evenNum(int var)
{
evenNum(); // a new object is created (distinct from "this"), and discarded then.
...
}