蛄丶 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日
  • 展开全部

悬赏问题

  • ¥20 Yolov5训练报错
  • ¥15 Unity发布gzip压缩的webgl之后让浏览器可以正常显示画面
  • ¥15 有没有人知道这种提示怎么关?现在不做ts项目了不知道咋关了,求解,现在我以前的js项目都是这种提示了
  • ¥15 为什么mysql做了碎片化处理data_free还是很高
  • ¥15 single positional indexer is out-of-bounds
  • ¥15 LSTM 模型数据量需要多少?
  • ¥15 mysql数据抓包开发报表
  • ¥15 linux系统下安装office打不开
  • ¥20 rsync脚本分发错误,文件不齐全
  • ¥15 labview顺序结构与时间延时