int a, b, c;
//do stuff. For e.g., cin >> b >> c;
c = a + b; //works
c = operator+(a,b); //fails to compile, 'operator+' not defined.
这另一方面起作用 -
class Foo
{
int x;
public:
Foo(int x):x(x) {}
Foo friend operator+(const Foo& f, const Foo& g)
{
return Foo(f.x + g.x);
}
};
Foo l(5), m(10);
Foo n = operator+(l,m); //compiles ok!
答案 0 :(得分:8)
首先,将内置运算符作为函数调用将不起作用,因为语言规范从未说过存在这样的函数。内置运营商只是运营商。它们背后没有实现功能,因为语言规范从未暗示它们的存在。基于函数的实现仅适用于重载运算符。
其次,在重载解析期间,内置运算符确实由它们虚构的函数类似对应物表示,但禁止“内置运算符”的“显式”函数式调用的措辞存在于13.6 / 1
候选操作员的功能 代表内置运算符 第5条中定义的内容在 这个子条款。这些候选人 功能参与运营商 超载解决过程为 在13.3.1.2 中描述并使用 没有其他目的。
答案 1 :(得分:2)
来自http://www.parashift.com/c++-faq-lite/intrinsic-types.html
不,C ++语言需要这样 您的操作员重载至少需要 “类型”的一个操作数或 枚举类型。 C ++语言 不会让你定义一个运算符 所有的操作数/参数都是 原始类型。
例如,您无法定义 operator ==需要两个char *和 使用字符串比较。非常好 新闻,因为如果s1和s2是类型 char *,表达式s1 == s2已经存在 有一个明确的含义:它 比较两个指针,而不是两个指针 这些指针指向的字符串。 你不应该使用指针。使用 std :: string而不是char *。
如果C ++允许你重新定义其含义 内置类型的运算符,你 我不会知道1 + 1是什么:它 将取决于哪些标题得到 包括和是否其中之一 标题重新定义除了意思, 例如,减法。
运算符函数应该是非静态成员函数或者是非成员函数,并且至少有一个参数,其类型是类,对类的引用,枚举或对枚举的引用。无法更改运算符的优先级,分组或操作数。通过定义实现这些运算符的运算符函数,可以针对特定类和枚举类型更改为每种类型预定义的operator =,(一元)&和(逗号)的含义。运算符函数的继承方式与其他基类函数的继承方式相同。