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
相关产品推荐
相关产品推荐

