C ++二进制运算符重载

时间:2018-04-10 04:27:29

标签: c++ operator-overloading

根据Deitel的9ed C ++如何编程,p。 439-440:

  

二进制运算符可以作为非静态成员函数重载   使用一个参数或作为具有两个参数的非成员函数   (其中一个参数必须是类对象或引用   到一个类对象)。

那么,类对象或类对象的引用旁边还有其他类型的对象?我什么都想不到。

4 个答案:

答案 0 :(得分:13)

  

那么,在类对象旁边还有对类对象的引用还有什么其他对象?

语言定义了基本类型,例如intdouble。基本类型的实例也是对象。

假设你有:

struct Foo { ... };

您可以将operator+函数重载为非成员函数

Foo operator+(Foo , int);
Foo operator+(Foo& , int);
Foo operator+(int, Foo);
Foo operator+(int, Foo&);

等。在所有这些情况下,其中一个参数是FooFoo&。它也可以是Foo const&。但是,你不能超载

int operator+(int, int);

因为参数类型都不是类或对类的引用。

答案 1 :(得分:8)

这意味着您无法(重新)定义内置运算符,例如int operator+(int a, int b);。请注意,描述不完整,其中一个或两个参数也可以是enum

答案 2 :(得分:4)

支持@ user657267的回答

来自over.match.oper/1

  

如果表达式中的运算符的操作数的类型不是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)

这是一份详细的文件。这意味着静态二元运算符的至少一个操作数必须是当前类(引用/值)类型;否则它被认为是一个无关的运营商。