c++ - C++中的运算符重载

标签 c++ operator-overloading

如果我想重载运算符+,哪个原型(prototype)是正确的?

  1. D运算符+(const D& lhs, const D& rhs);
    然后将其声明为 D 的友元函数。

  2. D运算符+(const D& s);
    然后声明为D的成员函数。

最佳答案

第一个是正确的,第二个是完全错误的。你可以通过写这个来改进第二个

D operator+(const D& s) const;

但还是错了。原因是编译器将在第二个版本中对 + 运算符的左右两侧应用不同的规则。例如给出这段代码

class C
{
};

class D
{
public:
  D(const C&);
};

C c;
D d;

d = d + c; // legal with both versions
d = c + d; // not legal with the second version

不同之处在于,编译器将从 C 对象创建临时 D 对象作为方法或函数参数,但不会对临时对象进行方法调用。

简而言之,第一个版本平等对待左侧和右侧,因此更符合编码人员的期望。

关于c++ - C++中的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7013786/

相关文章:

C++ nlohmann/json 如何使用运行时提供的 json_pointers 来读取 json 值

c++ - << 运算符在 C++ 中重载用于日志目的

ruby - 无法重载运算符 +=

c++ - 在 C++ 中,如何在不通过参数传递对象的情况下重载运算符?

具有隐式参数的 C++ 函数模板实例化

c++ - 在对象工厂中注册一个对象创建者

c++ - 合并排序 C++ 1 参数 - vector

c++ - 运算符重载的基本规则和惯用法是什么?

c++ - 流式传输到异常类

c++ - 显示导致垃圾的大整数