何时使用内部运算符,何时使用外部运算符
When is the internal operator being used and when the external
假设我定义了一个具有内部+
运算符和外部+
运算符的类;
class MyClass {
public:
MyClass operator +();
};
MyClass operator +(const MyClass& a);
如果在我的主程序中我调用
MyClass a;
MyClass b = +a;
什么是所谓的,这个(内部):
a.operator +()
还是这个(外部)?:
operator +(a)
二元运算符也有同样的问题。
选择成员函数:它可以直接绑定到表达式a
,而非成员函数在绑定到引用参数之前需要将MyClass
转换为const MyClass
。因此,调用成员需要一个更好的转换序列,使其成为最佳重载。
如果您从非成员中删除了const
,或者向成员中添加了const
,那么两者都同样可行;您应该得到一个错误,说明重载是不明确的。
通过修复代码中的一些歧义,并进行一些打印,以下代码将给出答案Internal operator
。
class MyClass {
public:
MyClass operator+() {
std::cout << "Internal operator." << std::endl;
return *this;
};
};
MyClass operator+(const MyClass& a) {
std::cout << "External operator" << std::endl;
return a;
}
int main() {
MyClass a, b;
b = +a;
return 0;
}
使用内部运算符是因为一旦运算符已经存在,就不能用相同的参数重载它:不能为执行疯狂操作的字符串定义+运算符,因为已经有一个运算符将它们连接起来。情况也是如此。您在类中定义了一个+运算符,因此相同的运算符(作为函数原型)将变得毫无用处。
我自己做了一个小测试:
#include <iostream>
#include "MyClass.h"
using namespace std;
MyClass operator +(const MyClass& a, const MyClass& b)
{ cout << "external" << endl; return a; }
int main() {
MyClass foo, bar;
foo + bar;
return 0;
}
class MyClass {
public:
MyClass operator+(const MyClass& a) { cout << "internal" << endl; return a; }
};
该程序的输出是"内部"的。我的结论是,如果有一个内部运算符适合该操作,那么它将是所采用的运算符。如果内部更适合,我看不出有什么方法可以让外部的更适合。但我必须指出的是,我只做了一点测试,还没有从哪里了解到这是100%的答案。
相关文章:
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 如何确保接受的C++模板类型使运算符重载?
- 何时使函数成为类成员函数C++?
- 何时包含内置类型和运算符的标头?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- C++ 运算符"="重载 - 在 lhs 上获取向量中的所有值,使其等于 rhs 上的双精度值
- 如何使 SWIG 绑定类在 Lua 中使用运算符?
- 如何使类定义外的运算符重载优先?
- C++使 ostream 和 istream 运算符过载
- 新的 () 运算符在使用时在哪个内存段为 prgrammer 分配内存
- C++创建新的运算符并使当前运算符重载
- 如何实现赋值运算符,使多个实例共享公共数据
- c++中重载运算符何时通过引用传递
- 赋值(运算符 =)使容器的迭代器失效
- 重载C++赋值运算符,使其行为类似Java
- 如何覆盖已定义类型的 ostream <<运算符 如何使下拉子菜单直接显示在其父菜单下方<li>?
- 与类型转换运算符一起使用时条件运算符"?:"的编译器错误
- 如何重载 << 运算符以使其从流中读取?
- 与条件运算符一起使用时,动作不一致
- 如何重载 ostream 运算符<<以使其在 C++ 中与 log4cxx 一起使用?