是否无法手动调用C++运算符?

Arv*_*vin 15 c++ operator-keyword

我正在尝试更仔细地理解C++中的运算符.

我知道C++中的运算符基本上只是函数.我没有得到的是,该功能是什么样的?

举个例子:

int x = 1;
int y = 2;
int z = x + y;
Run Code Online (Sandbox Code Playgroud)

最后一行如何翻译?是吗:

1. int z = operator+(x,y);

要么

2. int z = x.operator+(y);

当我尝试了它们时,编译错误.我称他们是错的还是不允许直接调用C++中的运算符?

In *_*ico 17

使用C++标准,函数调用语法(operator+(x, y)x.operator+(y))仅适用于运算符函数:

13.5重载运算符[over.oper]

4.通常不直接调用操作员函数; 相反,它们被调用来评估它们实现的运算符(13.5.1 - 13.5.7).但是,可以使用operator-function-id作为函数调用语法(5.2.2)中函数的名称来显式调用它们 .[ 例如:

    complex z = a.operator+(b); // complex z = a+b;
    void* p = operator new(sizeof(int)*n);
Run Code Online (Sandbox Code Playgroud)

- 末端的例子 ]

并且运算符函数至少需要一个类类型或枚举类型的参数:

13.5重载运算符[over.oper]

6.一种操作功能须是非静态成员函数或是非成员函数和具有至少一个参数,其类型为一个类,一类的引用,枚举,或为枚举的引用.

这意味着每13.5/6 operator+()只能int存在一个只有s 的运算符函数.而且你显然不能在不存在的运算符函数上使用函数调用语法.

  • @Arvin:错了!答案是"它取决于".如果`operator +`定义了一个成员函数,你可以通过`x.operator +(y)`来访问它.如果将它定义为全局函数,则可以通过`operator +(x,y)`访问它. (3认同)
  • @Arvin:你是在思考它.通过使用该类型的对象来调用成员函数.因此,如果operator +是成员函数,则使用成员函数调用语法调用它.如果它是自由函数,则使用自由函数语法调用它.就像任何其他功能一样. (2认同)

iam*_*ind 9

对于基本类型,如int,float,double,运算符已经过载/预定义,因此没有什么特别的.和,

int z = x + y;
Run Code Online (Sandbox Code Playgroud)

是表达/称呼它的唯一方式.

出于解释目的,实际上两个陈述,

int z = operator+(x,y);
int z = x.operator+(y);
Run Code Online (Sandbox Code Playgroud)

是真的(如果它可以超载).


flu*_*ffy 6

运算符重载仅适用于对象和结构,而不适用于基本类型(如int或float).如果你有一个像这样的对象类:

  class A {
    A operator+(const A& rhs) {
      return someComputedValue;
    }
  }
Run Code Online (Sandbox Code Playgroud)

那么你确实可以打电话myA.operator+(anotherA),这相当于myA + anotherA.

  • 你不能重新定义1 + 2,但你可以这样做:`struct POD {int i; POD operator +(POD const&o)const {POD r = {i + oi}; return r;}};`.在这种情况下你可以写:`POD podA = {2}; POD podB = {3}; POD podC(podA.operator +(podB));`. (2认同)
  • 请参阅:http://stackoverflow.com/questions/146452/what-are-pod-types-in-c (2认同)