我被问到以下问题Which operators can only be declared as non-static member functions?
我认为=
和()
只能声明为非静态成员函数,是否有其他运算符遵循相同的规则?这有什么特别的原因吗?
答案 0 :(得分:2)
是的,还有其他人有相同的限制。例如,下标运算符(第13.5.5 / 1节):
operator []应该是一个非静态成员函数,只有一个参数。
同样->
。大多数其他人(例如+
,-
,*
,/
,%
)可以是非静态成员函数或非会员功能。对于二元运算符,成员函数必须采用一个参数,而非成员函数必须采用两个参数。
具体规则见C ++标准第13节。
答案 1 :(得分:1)
根据C ++标准§13.5/ 6:
运算符函数应该是非静态成员函数或者是非成员函数,并且至少有一个参数,其类型是类,对类的引用,枚举,或对枚举的引用。无法更改运算符的优先级,分组或操作数。通过定义实现这些运算符的运算符函数,可以针对特定类和枚举类型更改为每种类型预定义的operator =,(一元)&和(逗号)的含义。运算符函数的继承方式与其他基类函数的继承方式相同。
特别是,以下运算符只能声明为非静态成员函数:
作业=
(§13.5.3)
赋值运算符应由具有一个参数的非静态成员函数实现。 因为如果没有声明,则为类隐式声明复制赋值运算符operator = user(12.8),基类赋值运算符总是被复制赋值运算符隐藏 衍生类。
函数调用()
(第13.5.4节)
operator()应该是一个具有任意数量参数的非静态成员函数。
订阅[]
(第13.5.5节)
operator []应该是一个非静态成员函数,只有一个参数。
班级成员访问权限->
(§13.5.6)
操作符 - >应该是一个不带参数的非静态成员函数。
答案 2 :(得分:0)
[],+, - 是所有需要实例化对象才有意义的运算符。因此,它们不能是静态成员函数。