根据Deitel的9ed C ++如何编程,p。 439-440:
二进制运算符可以作为非静态成员函数重载 使用一个参数或作为具有两个参数的非成员函数 (其中一个参数必须是类对象或引用 到一个类对象)。
那么,类对象或类对象的引用旁边还有其他类型的对象?我什么都想不到。
答案 0 :(得分:13)
那么,在类对象旁边还有对类对象的引用还有什么其他对象?
语言定义了基本类型,例如int
,double
。基本类型的实例也是对象。
假设你有:
struct Foo { ... };
您可以将operator+
函数重载为非成员函数
Foo operator+(Foo , int);
Foo operator+(Foo& , int);
Foo operator+(int, Foo);
Foo operator+(int, Foo&);
等。在所有这些情况下,其中一个参数是Foo
或Foo&
。它也可以是Foo const&
。但是,你不能超载
int operator+(int, int);
因为参数类型都不是类或对类的引用。
答案 1 :(得分:8)
这意味着您无法(重新)定义内置运算符,例如int operator+(int a, int b);
。请注意,描述不完整,其中一个或两个参数也可以是enum
。
答案 2 :(得分:4)
支持@ user657267的回答
如果表达式中的运算符的操作数的类型不是a 类或枚举,假设运算符是内置的 运算符并根据[expr.compound]
进行解释
struct String {
String (const String&);
String (const char*);
operator const char* ();
};
String operator+ (const String&, const String&);
void f() {
const char* p = "one" + "two"; // ill-formed because neither operand has class or enumeration type
int I = 1 + 1; // always evaluates to 2 even if class or enumeration types exist
// that would perform the operation.
}
因此,对原始数据类型的重载operator+
是不正确的。
答案 3 :(得分:-1)
这是一份详细的文件。这意味着静态二元运算符的至少一个操作数必须是当前类(引用/值)类型;否则它被认为是一个无关的运营商。