如何区分成员和非成员运算符重载?
成员和非成员运算符重载之间的一个区别是,对于声明/定义为成员函数的重载,参数的数量减少了一个。对于一元运算符,您没有参数,对于二元运算符,您有一个。
有一些重载不能在类范围之外声明/定义,operator=() 就是其中之一。
此外,成员函数的作用域不同,如果没有声明类型的实例,就不能调用,除非它是静态的。某些必须是成员函数的运算符,例如 operator=(),但不允许是静态的。
第一个示例是非成员,但它可以访问类实例并与它们一起使用?
operator+() 是带有两个参数的二元运算符表示一个自由函数。
如果该类型定义了一个允许 operator+() 在两个实例上工作的公共接口。或者,如果运算符被声明为友元函数,则授予该函数访问该类型的私有成员和受保护成员的权限。
在您上面的示例中,返回类型非常“有趣”,因为两个 Jazz 实例的总和显然应该是一个 int。您可能想对此提出质疑。
第三个例子也是非成员,但它是 Jazz 类型的?
该运算符通常称为复制赋值运算符,并且如上所述,它必须是某种类型 T 的非静态成员函数。
该标准不强制要求返回类型,它可能只是void,但约定返回一个非常量引用给受让人,即被分配给的类型 T 的实例。
T& T::operator(const T& rhs)
返回 ref 的原因之一是可以进行赋值链接:
T t;
T t2;
T t3;
t = t2 = t3; // assignment chaining
另一个原因是,在某些情况下,标准库期望 operator=() 返回对用户定义类型的受让人的引用。
有关 C 和 C++ 中相当完整的运算符列表,您可以参考此。