Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 显式运算符=调用(T::运算符=)_C++_Qt_Assignment Operator - Fatal编程技术网

C++ 显式运算符=调用(T::运算符=)

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

我正在阅读qt源代码,我已经多次看到类似的代码:

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=
,因此,如果对这样一个对象调用通常的赋值,编译器将尝试生成这样一个运算符,由每个基类子对象和每个成员变量的赋值组成

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


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

这是一个很好的答案,尽管公认的答案是正确的,但这个答案解释了原因。