蛄丶 2023-02-12 13:45 采纳率: 50%
浏览 43
已结题

重载运算符时遇到的疑惑

为class重载运算符时出现的一些疑惑


#include <iostream>
using namespace std;

class Vector{
    private:
        double x;
        double y;
    public:
        Vector(double a = 0, double b = 0): x{a}, y{b} {}
        void print();
        double getx() const {return x;}
        double gety() const {return y;}
        
};

void Vector::print() {
    cout << "(" << x << "," << y << ")" << endl;
}

Vector operator+(const Vector& v1, const Vector& v2) {
    return Vector(v1.getx()+v2.getx(), v1.gety()+v2.gety());
}

以上代码创建了向量这种变量,并重载运算符+为向量加法
但是进行数字+向量 / 向量+数字的加法时,仍然可以调用只重载了向量+向量的加法运算
比如:

int main() {
  Vector u(1,2), v;
  v = u+3;
  v.print(); // 输出是:(4,2)
  return 0;
}

按理来说不应该会由于没有匹配的运算符而报错吗?为什么能正常运行呢?
希望得到解释,提前谢谢答者!

补:漏了一个关键信息,非常对不起。在我给构造函数加上默认值之前是会报错的,但是加上默认值之后就能正常运行了。

  • 写回答

6条回答 默认 最新

  • 社区专家-Monster-XH 2023-02-12 14:17
    关注

    进行u + 3的计算时,编译器不会报错,因为已经在该行上实现了隐式类型转换。

    如果在类中没有定义适当的运算符重载函数,则编译器将尝试使用隐式类型转换将一个数字转换为类对象。

    因此,进行数字+向量 / 向量+数字的加法时,编译器将使用只重载了向量+向量的加法运算,并且结果是有效的。

    如果禁止这种情况,则可以在类中定义适当的运算符重载函数,以在不合法的情况下抛出编译错误。

    class Vector{
        private:
            double x;
            double y;
        public:
            Vector(double a = 0, double b = 0): x{a}, y{b} {}
            void print();
            double getx() const {return x;}
            double gety() const {return y;}
            Vector operator+(const Vector &rhs) const;
    };
     
    Vector Vector::operator+(const Vector &rhs) const {
        return Vector(x + rhs.x, y + rhs.y);
    }
    
    Vector operator+(double lhs, const Vector &rhs) {
        return Vector(lhs + rhs.getx(), lhs + rhs.gety());
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 2月20日
  • 已采纳回答 2月12日
  • 修改了问题 2月12日
  • 修改了问题 2月12日
  • 展开全部

悬赏问题

  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题