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

带默认参数的构造函数问题求助:拷贝对象属性未正确赋值

问题分析与解决

你的问题出在拷贝构造函数的定义错误上:

你写的构造函数var(const var& v, char name = ' ')并不是标准的拷贝构造函数(标准拷贝构造函数仅接受一个const var&类型的参数),而且这个构造函数初始化name_时,用的是传入的name参数(默认值为空格),完全没有复制原对象v的name_属性,这就导致var y = x;创建y时,直接用了默认的空格作为name值。

解决步骤

  • 重新定义正确的拷贝构造函数,只接收const var&参数,并将当前对象的name_初始化为原对象的name_
  • 保留你原来的其他构造函数不变

修改后的完整代码

#include <iostream>

class var {
public:
    // 正确的拷贝构造函数
    var(const var& v) : name_(v.name_) {}
          
    explicit var(double v, char name = ' ') : name_(name) {}
        
    char name() { return name_; }
    
private:
    char name_; 
};  

int main() {
    var x(10, 'x');
    var y = x;
    std::cout << x.name() << std::endl; // 输出 'x'
    std::cout << y.name() << std::endl; // 输出 'x',符合预期
    return 0;
}   

补充说明

如果你确实需要支持拷贝时自定义name的场景,可以额外重载一个构造函数,但不要把它和拷贝构造函数混淆:

// 重载构造函数,支持拷贝时指定新name
var(const var& v, char name) : name_(name) {}

这样当你需要自定义时可以写var y(x, 'y');,而var y = x;会自动调用标准的拷贝构造函数,复制原对象的name值。

内容的提问来源于stack exchange,提问作者HMPtwo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:25:15