C++ 为什么称之为运算符重载?

C++ 为什么称之为运算符重载?,c++,c++11,C++,C++11,如果定义了以下类,Foo。据说它重载了一元符号(&)运算符: class Foo { public: Foo* operator&() { return nullptr; } }; 我认为在这种情况下,(尽管您可以通过std::addressof()和其他惯用技巧获得这样一个对象的地址),但无法访问/选择返回被调用对象地址的原始一元符号和运算符,我错了吗 然而,通过重载,我了解到有一组函数将在编译时根据某些标准选择其中一个。但这种想法似乎与上述情景不符 为什么称之为重载而不是重新

如果定义了以下类,
Foo
。据说它重载了一元符号(
&
)运算符:

class Foo {
public:
   Foo* operator&() { return nullptr; }
};
我认为在这种情况下,(尽管您可以通过
std::addressof()
和其他惯用技巧获得这样一个对象的地址),但无法访问/选择返回被调用对象地址的原始一元符号和运算符,我错了吗

然而,通过重载,我了解到有一组函数将在编译时根据某些标准选择其中一个。但这种想法似乎与上述情景不符


为什么称之为重载而不是重新定义或替换?

考虑以下代码:

int x;
Foo y;
&x; // built-in functionality
&y; // y.operator&();
我们有两个不同类型的变量。我们将相同的
&
运算符应用于它们两个。对于
x
它使用运算符的内置地址,而对于
y
它调用用户定义的函数


这正是你描述的重载:有多个函数(其中一个是内置函数,而不是真正的“函数”),它们是根据操作数的类型来选择的。

< P>你不能重新定义C++中的函数或运算符,你可以只给它添加新的用法,定义新的参数集。这就是为什么它称为重载而不是重新定义

当您重载运算符作为类的成员时

1) 使用假定为该类实例的第一个参数定义它

2) 允许该类的所有成员访问它


仍然有操作符的定义&参数不同,您有非零的机会创建使用操作符不明确的情况。

@Zereges我不是要获取对象的地址,而是调用原始的
&
操作符。使用
Foo:public Bar
Bar*x=new Foo
&*x
将不使用重载运算符;它不会被覆盖。“您需要通过包含它的类型来访问它,所以它是超负荷的。”Ryan有趣的观察抱歉,仔细想想,这是误导。术语很简单:它是操作符本身,而不是操作符本身,在特定类型上重载以执行不同的操作
int+int
string+string
等都是
+
的重载。如果你把它看作是“
符号(…)”
和“
加上(…,…)
”,这和函数重载是一样的。也就是说,你说了:你只能给它添加新的用法,定义新的参数集。这就是为什么它称为重载而不是重新定义。这是关于扩展,而不是替换。