显式 operator= call (T::operator=)
Explicit operator= call (T::operator=)
我正在阅读 qt 源代码,我已经多次看到这样的代码:
buttonOpt.QStyleOption::operator=(*opt);
所以,我猜它类似于 buttonOpt = *opt
但为什么他们使用这种语法而不是默认和用户友好的语法?这样更快还是有其他收益?
这是因为他们明确地从 buttonOpt
的基数 class 调用 operator=
,即 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"
}
您显示的代码显式调用基 class 赋值,即仅对 QStyleOptionButton
的基 class 部分进行赋值,而不是对象的成员变量。
从文档中可以看出,没有为 QStyleOptionButton
声明 operator=
,因此如果要对此类对象调用通常的赋值,编译器将尝试生成此类运算符,由每个基 class 子对象和每个成员变量的赋值组成。
此类生成的运算符可能会或可能不会编译,具体取决于所有成员和基 classes 是否可复制。在这种情况下,如果 class 应该是可复制的,通常手动定义运算符以正确进行赋值。
然而,显式调用基 class 赋值的可能原因是实际上只有基 class 部分需要复制,而其他 class 成员不应该被复制改变了,所以这不是语义意义上的 "real assignment"。
我正在阅读 qt 源代码,我已经多次看到这样的代码:
buttonOpt.QStyleOption::operator=(*opt);
所以,我猜它类似于 buttonOpt = *opt
但为什么他们使用这种语法而不是默认和用户友好的语法?这样更快还是有其他收益?
这是因为他们明确地从 buttonOpt
的基数 class 调用 operator=
,即 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"
}
您显示的代码显式调用基 class 赋值,即仅对 QStyleOptionButton
的基 class 部分进行赋值,而不是对象的成员变量。
从文档中可以看出,没有为 QStyleOptionButton
声明 operator=
,因此如果要对此类对象调用通常的赋值,编译器将尝试生成此类运算符,由每个基 class 子对象和每个成员变量的赋值组成。
此类生成的运算符可能会或可能不会编译,具体取决于所有成员和基 classes 是否可复制。在这种情况下,如果 class 应该是可复制的,通常手动定义运算符以正确进行赋值。
然而,显式调用基 class 赋值的可能原因是实际上只有基 class 部分需要复制,而其他 class 成员不应该被复制改变了,所以这不是语义意义上的 "real assignment"。