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

Why do C++ constructors called from inside another constructor not modify class variables?

本文关键字:构造函数 修改 类变量 C++ 调用 另一个 内部 为什么      更新时间:2023-10-16

为什么直接从另一个构造函数调用的构造函数不修改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.
...
}
相关文章: