C++ 显式运算符=调用(T::运算符=)
我正在阅读qt源代码,我已经多次看到类似的代码:C++ 显式运算符=调用(T::运算符=),c++,qt,assignment-operator,C++,Qt,Assignment Operator,我正在阅读qt源代码,我已经多次看到类似的代码: buttonOpt.QStyleOption::operator=(*opt); 所以,我猜这类似于buttonOpt=*opt,但是为什么他们使用这种语法而不是默认的和用户友好的呢?这是更快还是存在任何其他利润?这是因为他们从buttonOpt的基类显式调用操作符=,即QStyleOption buttonOpt.QStyleOption::operator=(*opt); //similar behavior class Base { p
buttonOpt.QStyleOption::operator=(*opt);
所以,我猜这类似于
buttonOpt=*opt
,但是为什么他们使用这种语法而不是默认的和用户友好的呢?这是更快还是存在任何其他利润?这是因为他们从buttonOpt
的基类显式调用操作符=
,即QStyleOption
buttonOpt.QStyleOption::operator=(*opt);
//similar behavior
class Base
{
public:
virtual bool operator<(Base & other)
{
std::cout << "Base";
}
};
class Derived : public Base
{
public:
bool operator<(Base & other) override
{
std::cout << "Derived";
}
};
int main()
{
Derived a;
Derived b;
a < b; //prints "Derived"
a.Base::operator <(b); //prints "Base"
}
buttonOpt.QStyleOption::operator=(*opt);
//相似行为
阶级基础
{
公众:
虚拟布尔运算符显示的代码显式调用基类赋值,即仅分配QStyleOptionButton
的基类部分,而不分配对象的成员变量
从文档中可以看出,没有为QStyleOptionButton
声明operator=
,因此,如果对这样一个对象调用通常的赋值,编译器将尝试生成这样一个运算符,由每个基类子对象和每个成员变量的赋值组成
这种生成的运算符可能编译,也可能不编译,这取决于是否所有成员和基类都是可复制的。在这种情况下,如果类应该是可复制的,则通常手动定义运算符以正确执行赋值
然而,显式调用基类赋值的可能原因是,实际上只需要复制基类部分,而不应更改其他类成员,因此这不是语义意义上的“真正赋值”。这是一个很好的答案,尽管公认的答案是正确的,但这个答案解释了原因。