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

时间:2011-08-29 04:07:38

标签: c++ operator-keyword

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

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

以例如:

int x = 1;
int y = 2;
int z = x + y;

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

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

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

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

6 个答案:

答案 0 :(得分: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);
     

- 示例]

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

  

13.5重载的运算符[over.oper]

     

6. 运算符函数必须是非静态成员函数   或者是非成员函数,并且至少有一个类型的参数   是一个类,对类的引用,枚举或对它的引用   一个枚举。

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

答案 1 :(得分:9)

适用于intfloatdouble等基本类型;运算符已经过载/预定义,因此没有什么特别的。和,

int z = x + y;

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

对于解释目的,实际上两个语句都是

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

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

答案 2 :(得分:6)

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

  class A {
    A operator+(const A& rhs) {
      return someComputedValue;
    }
  }

然后你确实可以致电myA.operator+(anotherA),这相当于myA + anotherA

答案 3 :(得分:2)

当两个参数都以类型构建时,您不能重载二元运算符。 但是对于您自己的对象,您可以创建它们。

//Simple struct that behaves like an int.
struct A
{
  int v_;
  explicit A(int i) : v_(i) {}  
  // A member operator so we can write a+b
  A operator+(const A & a ) const { return A( v_ + a.v_); }      
};

// A non-member operator, so we can write 1+a
A operator+(int i, const A & a)
{
   return A(i+a.v_);
}

int main()
{
  A a(1);
  A b(2);

  // Call the member version using its natural syntax    
  A c = a+b;
  //Call the member version using function call syntax
  A d = a.operator+(b);
  // Call the non-member version using the natural syntax
  A e = 1 + b;
  // Call the nonmember version using function call syntax.
  A f = ::operator+(1,b);
}

答案 4 :(得分:1)

对于本机类型,运算符不是函数。只有重载的运算符才是函数。内置的操作符是内置的 - 它们没有“函数”,它们通常只编译成一个或两个汇编指令,作为函数调用它将是疯狂的。

因此operator+(x, y)x.operator+(y)都不正确。我认为x.operator+(y)不正确,因为非struct类型不能有成员,但我怀疑这有多大帮助。

答案 5 :(得分:1)

正如评论和其他答案中所提到的那样,基本类型没有operator+。对于课程,operator+(x,y)x.operator+(y)之间的答案是正确的是“它取决于”。特别是,它取决于operator+的定义方式。如果它被定义为成员函数,那么您需要使用x.operator+(y)。如果它被定义为全局函数,那么您需要使用operator+(x,y)

当编译器面对语句z=x+y;时,您的编译器足够聪明,可以查找相应的表单。你不应该期待一个或另一个。您应该使用x+y