我正在尝试更仔细地理解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 ++中的运算符?
答案 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)
适用于int
,float
,double
等基本类型;运算符已经过载/预定义,因此没有什么特别的。和,
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
。