首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显式operator=调用(T::operator=)

显式operator=调用(T::operator=)
EN

Stack Overflow用户
提问于 2015-10-09 09:12:52
回答 2查看 383关注 0票数 5

我正在阅读qt源代码,并且多次看到这样的代码:

代码语言:javascript
复制
buttonOpt.QStyleOption::operator=(*opt);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-09 09:16:47

这是因为它们从buttonOpt的基类(即QStyleOption )中显式地调用buttonOpt

代码语言:javascript
复制
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"
}
票数 8
EN

Stack Overflow用户

发布于 2015-10-09 09:42:52

您显示的代码显式地调用基类分配,即只分配QStyleOptionButton的基类部分,而不分配对象的成员变量。

从文档中可以看出,没有为operator=声明任何QStyleOptionButton,所以如果要调用这样一个对象的通常赋值,编译器将尝试生成这样一个操作符,包括每个基类子对象和每个成员变量的赋值。

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

然而,显式调用基类分配的可能原因是实际上只需要复制基类部件,而其他类成员不应该被更改,因此这不是语义意义上的“真正分配”。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33034344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档