请求解析C++模板类Price的重载赋值运算符及相关代码
C++模板类Price赋值运算符重载问题解析
我定义了一个C++模板类Price并实现了函数重载,但对类中的赋值运算符重载等代码实现存在疑问,尝试查找资料却毫无头绪,恳请专业人士解惑。相关代码如下:
template <class S> class Price{ public: Price(double p) : p_(p) { check(p); } Price(const Price<S>& p) : p_(p.p_){} double price() const { return p_; } Price<S>& operator = (double p) { check (p); p_ = p; return *this; } Price<S>& operator = (const Price<S>& p) { p_ = p.p; return *this; } private: // 原代码缺失成员变量p_声明与check函数实现 };
代码中的问题及修正建议:
- 拷贝赋值运算符的语法错误:
operator=(const Price<S>& p)里的p_ = p.p;是错误写法,应该访问对象的私有成员p_,修正为p_ = p.p_;。 - 缺失核心成员与函数实现:原代码私有部分未声明成员变量
p_,也没有实现check函数,这会直接导致编译失败。需要补充double p_;的声明,以及check函数的具体逻辑(比如价格合法性校验):private: double p_; void check(double p) { // 示例:禁止价格为负数 if (p < 0) { throw std::invalid_argument("价格不能为负数"); } } - 自我赋值检查(推荐):在拷贝赋值运算符中添加自我赋值检查,避免无意义的内存操作:
Price<S>& operator = (const Price<S>& p) { if (this != &p) { p_ = p.p_; } return *this; } - 隐式转换控制(可选):构造函数
Price(double p)未加explicit,会允许double到Price<S>的隐式转换。如果不需要这种自动转换,建议添加explicit关键字:explicit Price(double p) : p_(p) { check(p); }
内容的提问来源于stack exchange,提问作者unknwnMod
相关产品推荐
相关产品推荐

