显式operator = call(T :: operator =)

Vic*_*voy 5 c++ qt assignment-operator

我正在阅读qt资源,我已经多次看过这样的代码:

buttonOpt.QStyleOption::operator=(*opt);
Run Code Online (Sandbox Code Playgroud)

所以,我想这是类似的,buttonOpt = *opt但为什么他们使用这种语法而不是默认和用户友好?这更快还是存在任何其他利润?

Sin*_*all 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"
}
Run Code Online (Sandbox Code Playgroud)


Arn*_*rtz 5

您显示的代码是显式调用基类赋值,即只QStyleOptionButton分配get赋值的基类部分,而不是对象的成员变量.

从文档中可以看出,没有operator=声明QStyleOptionButton,因此如果在这样的对象上调用通常的赋值,编译器将尝试生成这样的运算符,包括每个基类子对象和每个成员变量的赋值.

这样生成的运算符可以编译也可以不编译,这取决于是否所有成员和基类都是可复制的.在这种情况下,通常手动定义操作符,以便正确地执行赋值,如果类应该是可复制的.

但是,显式调用基类赋值的可能原因是,实际上只需要复制基类部分,而不应该更改其他类成员,因此这不是语义上的"实际赋值".