赋值运算符重载

时间:2014-08-12 11:29:31

标签: c++

我的课程已分配给string运营商。

class turbo
    {
public:
    operator string   (void) {printf("assignment to string operator\n");return "bla2";}
    };

作业操作很好:

turbo t;
string s;
s=t;

我的输出中有"assignment to string operator"

然后我决定将另一个赋值运算符设为turbo

class turbo
    {
public:
    operator string   (void) {printf("assignment to string operator\n");return "bla";}
    operator turbo   (void) {printf("assignment to turbo operator\n");return *this;}
    };

但下面的代码不会调用turbo赋值运算符。

turbo t;
turbo tt ;
tt=t;

为什么?

我知道我可以重载=运算符,但我希望运算符turbo也能运行,因为string运算符正在运行。

2 个答案:

答案 0 :(得分:2)

您不会重载赋值运算符,而是转换运算符。因此,在转换发生时会调用它们。

请参阅c++: cast operator vs. assign operator vs. conversion constructor priority

答案 1 :(得分:1)

类的隐式声明的复制赋值运算符采用类型为X const&的单个参数(此处为turbo const&)。由于您的RHS操作数已经是turbo类型,因此无需调用转换函数。

实际上,永远不会隐式调用相同类型的转换函数;它只能被显式调用(如turbo::operator turbo())或可能通过基类中的虚拟转换函数调用。这在 [class.conv.fct]

中讨论
  

1 - [...]从不使用转换函数将(可能是cv限定的)对象转换为(可能是cv限定的)相同的对象类型(或对它的引用),转换为(可能是cv) -qualified)该类型的基类(或对它的引用),或(可能是cv-qualified)void。 [...]

请参阅Under what circumstances would a type's conversion operator to itself be invoked?