c – 在不改变原始值的情况下重载运算符的方法?
发布时间:2020-12-16 10:26:24 所属栏目:百科 来源:网络整理
导读:我想知道你是否可以重载一个操作符并使用它而不改变对象的原始值. 编辑代码示例: class Rational{public: Rational(double n,double d):numerator_(n),denominator_(d){}; Rational(){}; // default constructor double numerator() const { return numerat
我想知道你是否可以重载一个操作符并使用它而不改变对象的原始值.
编辑代码示例: class Rational{ public: Rational(double n,double d):numerator_(n),denominator_(d){}; Rational(){}; // default constructor double numerator() const { return numerator_; } // accessor double denominator() const { return denominator_; } // accessor private: double numerator_; double denominator_; }; const Rational operator+(const Rational& a,const Rational& b) { Rational tmp; tmp.denominator_ = (a.denominator() * b.denominator()); tmp.numerator_ = (a.numerator() * b.denominator()); tmp.numerator_ += (b.numerator() * a.denominator()); return tmp; } 我创建了访问器const方法,但我仍然会收到每个tmp.denominator_ / numerator_的隐私错误. 解决方法
您正在寻找的是“二元”加法和减法运算符:
const Rational operator+(const Rational& A,const Rational& B) { Rational result; ... return result; } 更新(响应新代码和评论): 您收到该错误是因为您的访问器函数未声明为常量函数,因此编译器必须假定它们可能会修改原始对象.按如下方式更改您的访问者,您应该好好去: double numerator() const { return numerator_; } double denominator() const { return denominator_; } 更新 要正确处理隐私问题,您应该将二元运算符函数声明为Rational类的朋友.它的外观如下: class Rational { public: Rational(double n,denominator_(d) {}; Rational() {}; // default constructor double numerator() const { return numerator_; } // accessor double denominator() const { return denominator_; } // accessor friend Rational operator+(const Rational& A,const Rational& B); private: double numerator_; double denominator_; }; const Rational operator+(const Rational& a,const Rational& b) { Rational result; result.denominator_ = (a.denominator_ * b.denominator_); result.numerator_ = (a.numerator_ * b.denominator_); result.numerator_ += (b.numerator_ * a.denominator_); return result; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |