C++带额外参数的拷贝构造函数成员赋值异常问题求助
错误原因
你代码里的问题出在自定义的拷贝逻辑构造函数中,核心有2个问题:
- 成员赋值逻辑写反+变量名歧义
你在构造函数里写的y = foo.y;,这里的y是函数入参的局部变量(就是你传进来的5),不是新对象的成员变量this->y。这行代码的实际效果是把原对象的y值覆盖掉了你传入的新y参数,根本没有给新对象的y成员做赋值操作。未初始化的int类型成员会读取栈内存里的残留脏数据,你看到的32766就是这个随机垃圾值。
反观x成员你写的是this->x = foo.x;,显式指定了操作对象成员,所以x的拷贝结果是对的。 - 冗余声明问题
你声明了无参构造Point();但没有给出实现,如果后续代码调用无参构造会触发链接错误,不需要的话可以直接删掉这个声明。
补充说明:严格意义上C++的标准拷贝构造函数签名要求只有一个const引用类型的同类型参数,你写的带额外int参数的属于自定义普通构造函数,用来实现“部分拷贝成员+部分赋新值”的需求是完全可行的,不属于语法错误。
修正方案
把构造函数的赋值逻辑改对即可,更推荐用初始化列表写法,避免变量名歧义,同时把源对象参数加const修饰更规范:
#include <iostream> class Point { public: int x, y; Point(int x, int y): x(x), y(y) {} // 自定义部分拷贝构造逻辑:拷贝源对象的x,用传入的新值初始化y Point(const Point& src, int new_y): x(src.x), y(new_y) {} }; int main() { Point p (0, 1); std::cout << "Original object (" << p.x << ", " << p.y << ")\n"; Point copy(p, 5); std::cout << "Copied object (" << copy.x << ", " << copy.y << ")\n"; return 0; }
运行后输出符合预期:
Original object (0, 1) Copied object (0, 5)
内容的提问来源于stack exchange,提问作者ninufa.1123
相关产品推荐
相关产品推荐

