蛄丶 2023-02-12 05: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 06: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月19日
  • 已采纳回答 2月12日
  • 修改了问题 2月12日
  • 修改了问题 2月12日
  • 展开全部

悬赏问题

  • ¥30 silcavo仿真,30分钟,只需要代码
  • ¥15 FastReport 怎么实现打印后马上关闭打印预览窗口
  • ¥15 利用3支股票数据估计其均值和方差的95%置信区间。
  • ¥15 微信小程序运行一项功能时,弹出未知错误弹框,检查代码没有问题
  • ¥15 ATAC测序生成self-pseudo replicates之前是否要进行去线粒体reads
  • ¥15 python模糊字匹配函数问题
  • ¥20 谁刷目标页面的uv记录器上数据,数据只记录跳转的数值
  • ¥30 数据库软件的安装方法
  • ¥15 一道以太网数据传输题
  • ¥15 python 下载群辉文件