c ++指针赋值运算符重载(不仅仅是对象赋值,而是指针赋值)

时间:2018-01-26 01:22:17

标签: c++

有没有办法重载指针赋值运算符? 例如

时,为A类重载指针赋值运算符
A *x, *y;
x = y;

3 个答案:

答案 0 :(得分:2)

不,这是不可能的。指针类型是标量类型,但重载运算符需要非标量参数。特别是([over.oper] p6):

  

运算符函数应该是非静态成员函数或者是非成员函数   至少一个参数,其类型是类,对类的引用,枚举或对引用的引用   枚举。

如果你有一个二元运算符,其中一个参数是用户定义的类型而另一个是指针,那就可以了,但在你要问的情况下,两个操作数都是指针。

答案 1 :(得分:0)

没有"指针赋值运算符"。这是赋值运算符,您将它与指针操作数一起使用。

除非至少有一个操作数具有类或枚举类型,否则无法重载运算符。 (指针类型不是类类型)。

答案 2 :(得分:0)

不,因为只有当至少一个参数具有类或枚举类型时才会考虑重载运算符。 (指向类类型的指针被认为是一种基本类型,并不算作“类类型”本身。)

C ++标准[over.match.oper] / 1-2:

  

如果表达式中的运算符的操作数没有类型或枚举类型,则假定运算符是内置运算符并根据子句[expr]进行解释。

     

如果任一操作数具有类或枚举类型,则可能声明用户定义的操作符函数来实现此运算符,或者可能需要用户定义的转换将操作数转换为适合于内置运营商。在这种情况下,重载决策用于确定调用哪个运算符函数或内置运算符来实现运算符。

(尽管您可能会鼓励A的用户使用类似智能指针的类APtr而不是原始指针来获得所需的行为。)