为什么从另一个构造函数内部调用C++构造函数不修改类变量?
Why do C++ constructors called from inside another constructor not modify class variables?
为什么直接从另一个构造函数调用的构造函数不修改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.
...
}
相关文章:
- "error: no matching function for call to"构造函数错误
- 修改程序的入口点时未调用全局变量的构造函数
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 如何在使用 Qt5 构造函数时将非常量参数修改为常量参数?
- 我允许用memcpy(*this)修改构造函数中的所有类成员
- 我的类的可变参数模板构造函数无法修改我的类成员,为什么会这样?
- 当push_back到向量中时,我是否需要复制构造函数来修改静态成员
- 复制构造函数不起作用,无法修改副本
- 在调用基类构造函数之前修改构造函数参数值
- C++ 继承类,并将修改后的参数发送到父级的构造函数
- 是否有可能在构造函数和析构函数之外修改“vptr”
- C++ 如何确保复制构造函数不会修改原始对象的指针数据成员?
- 当我修改复制构造函数以执行一些奇怪的操作,然后按值将对象(该类)传递给函数时会发生什么
- 由算术运算符成员函数修改的动态数组的复制构造函数
- C++ 将字符串传递到构造函数中只会传递" "除非显式修改
- 如何在构造函数中初始化的函数中修改对象大小的2D向量
- 是否可以在constexpr构造函数中修改非静态成员变量(c++ 14)
- 从复制构造函数外部修改对象成员时导致向量内存损坏,但从复制构造函数内部修改时不会
- Qt,在构造函数之外修改小部件属性的问题