我正在阅读qt资源,我已经多次看过这样的代码:
buttonOpt.QStyleOption::operator=(*opt);
所以,我想它类似buttonOpt = *opt
,但为什么他们使用这种语法而不是默认和用户友好?这是否更快或存在任何其他利润?
答案 0 :(得分:8)
这是因为他们明确地从operator=
的基类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"
}
答案 1 :(得分:5)
您显示的代码是显式调用基类赋值,即只分配QStyleOptionButton
的基类部分,而不是对象的成员变量。
从文档中可以看出,operator=
没有声明QStyleOptionButton
,所以如果要在这样的对象上调用通常的赋值,编译器会尝试生成这样的运算符,包括每个基类子对象和每个成员变量的赋值。
这样生成的运算符可以编译也可以不编译,这取决于是否所有成员和基类都是可复制的。在这种情况下,通常手动定义操作符,以便正确地执行赋值,如果类应该是可复制的。
但是,显式调用基类赋值的可能原因是,实际上只需要复制基类部分,而不应该更改其他类成员,因此这不是语义中的“实际赋值”。感。