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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:27:31