我正在阅读qt源代码,并且多次看到这样的代码:
buttonOpt.QStyleOption::operator=(*opt);所以,我想这有点像buttonOpt = *opt,但是为什么他们使用这种语法而不是默认的和用户友好的呢?这是更快还是有其他利润存在?
发布于 2015-10-09 09:16:47
这是因为它们从buttonOpt的基类(即QStyleOption )中显式地调用buttonOpt。
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"
}发布于 2015-10-09 09:42:52
您显示的代码显式地调用基类分配,即只分配QStyleOptionButton的基类部分,而不分配对象的成员变量。
从文档中可以看出,没有为operator=声明任何QStyleOptionButton,所以如果要调用这样一个对象的通常赋值,编译器将尝试生成这样一个操作符,包括每个基类子对象和每个成员变量的赋值。
这种生成的运算符可以编译也可以不编译,这取决于所有成员和基类是否都是可复制的。在这种情况下,通常是手动定义操作符,如果类应该是可复制的,则正确地执行赋值。
然而,显式调用基类分配的可能原因是实际上只需要复制基类部件,而其他类成员不应该被更改,因此这不是语义意义上的“真正分配”。
https://stackoverflow.com/questions/33034344
复制相似问题