You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++构造函数疑问:为何代码输出0而非预期的2?

为什么这段C++代码返回0而不是预期的2?

首先来看你的代码:

#include<iostream>
using namespace std;
class Rectangle {
private :
    int _width;
    int _height;
public :
    Rectangle() : _width{},_height{} {}
    Rectangle(int initial_w, int initial_h) : _width{initial_w}, _height{initial_h} {}
    int get_width(){return _width;}
};
int main() {
    Rectangle a;
    Rectangle(2,3);
    cout<<a.get_width()<<endl;
}

问题出在这一行:Rectangle(2,3);

你可能以为这行代码是在修改已经创建的a对象,但实际上不是——这行代码创建了一个临时的Rectangle对象,这个对象在这一行执行完之后就立刻被销毁了,完全没有和a产生任何联系。

而你之前创建的a对象,是用默认构造函数Rectangle()初始化的,这个构造函数把_width和_height都初始化为0(_width{},_height{}是C++11及以后的列表初始化方式,等价于赋值0),所以当你调用a.get_width()时,自然返回的是0。

如何修正?

有两种简单的方式达到你的预期:

方式1:直接用带参数的构造函数初始化a

把main函数里的代码改成这样:

int main() {
    Rectangle a(2,3); // 直接用宽2、高3初始化对象a
    cout<<a.get_width()<<endl; // 现在会输出2
}

这样a从一开始就被正确初始化,调用get_width()就会返回你预期的2。

方式2:给a赋值临时对象(需要确保类支持赋值)

如果你确实需要先创建默认初始化的a,之后再修改它,可以这样写:

int main() {
    Rectangle a;
    a = Rectangle(2,3); // 将临时对象的值赋值给a
    cout<<a.get_width()<<endl; // 输出2
}

这里因为你的类成员都是基本数据类型(int),默认的赋值运算符就能正常工作,不需要额外重载。

这样修改后,代码就能按照你的预期返回2啦!

内容的提问来源于stack exchange,提问作者Quần Trần

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 20:08:15