哪些运算符只能声明为非静态成员函数?

时间:2014-04-13 05:56:39

标签: c++ operators

我被问到以下问题Which operators can only be declared as non-static member functions?

我认为=()只能声明为非静态成员函数,是否有其他运算符遵循相同的规则?这有什么特别的原因吗?

3 个答案:

答案 0 :(得分:2)

是的,还有其他人有相同的限制。例如,下标运算符(第13.5.5 / 1节):

  

operator []应该是一个非静态成员函数,只有一个参数。

同样->。大多数其他人(例如+-*/%)可以是非静态成员函数非会员功能。对于二元运算符,成员函数必须采用一个参数,而非成员函数必须采用两个参数。

具体规则见C ++标准第13节。

答案 1 :(得分:1)

根据C ++标准§13.5/ 6:

  

运算符函数应该是非静态成员函数或者是非成员函数,并且至少有一个参数,其类型是类,对类的引用,枚举,或对枚举的引用。无法更改运算符的优先级,分组或操作数。通过定义实现这些运算符的运算符函数,可以针对特定类和枚举类型更改为每种类型预定义的operator =,(一元)&和(逗号)的含义。运算符函数的继承方式与其他基类函数的继承方式相同。

特别是,以下运算符只能声明为非静态成员函数:

  1. 作业= (§13.5.3)

      

    赋值运算符应由具有一个参数的非静态成员函数实现。   因为如果没有声明,则为类隐式声明复制赋值运算符operator =   user(12.8),基类赋值运算符总是被复制赋值运算符隐藏   衍生类。

  2. 函数调用() (第13.5.4节)

      

    operator()应该是一个具有任意数量参数的非静态成员函数。

  3. 订阅[] (第13.5.5节)

      

    operator []应该是一个非静态成员函数,只有一个参数。

  4. 班级成员访问权限-> (§13.5.6)

      

    操作符 - >应该是一个不带参数的非静态成员函数。

答案 2 :(得分:0)

[],+, - 是所有需要实例化对象才有意义的运算符。因此,它们不能是静态成员函数。