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)中函数的名称来显式调用它们 .[ 例如:
Run Code Online (Sandbox Code Playgroud)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+()只能int存在一个只有s 的运算符函数.而且你显然不能在不存在的运算符函数上使用函数调用语法.
对于基本类型,如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)
是真的(如果它可以超载).
运算符重载仅适用于对象和结构,而不适用于基本类型(如int或float).如果你有一个像这样的对象类:
class A {
A operator+(const A& rhs) {
return someComputedValue;
}
}
Run Code Online (Sandbox Code Playgroud)
那么你确实可以打电话myA.operator+(anotherA),这相当于myA + anotherA.
| 归档时间: |
|
| 查看次数: |
7551 次 |
| 最近记录: |