我的课程已分配给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
运算符正在运行。
答案 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?