带默认参数的构造函数问题求助:拷贝对象属性未正确赋值
问题分析与解决
你的问题出在拷贝构造函数的定义错误上:
你写的构造函数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
相关产品推荐
相关产品推荐

