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

请求解析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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:55:23