2015-10-09 34 views
5

私はQTのソースを読んでいると私はこの何倍ものようなコードを見てきました:だから明示的な演算子=コール(T ::演算子=)

buttonOpt.QStyleOption::operator=(*opt); 

を、私はそれがbuttonOpt = *optのようなものであると思いますが、なぜやりますデフォルトとユーザーフレンドリーの代わりにこの構文を使用していますか?これは速いのですか他の利益が存在しますか?

答えて

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" 
} 
5

あなたが表示されたコードは、明示的に基底クラスの割り当て、すなわち唯一の基底クラスQStyleOptionButton割り当てられますの部分ではなく、オブジェクトのメンバ変数を呼び出しています。

QStyleOptionButtonについてはoperator=が宣言されていないので、コンパイラはそのようなオブジェクトに対して通常の代入を呼び出すと、各基本クラスのサブオブジェクトの割り当て各メンバ変数。

このように生成された演算子は、すべてのメンバーおよび基本クラスがコピー可能であるかどうかによって、コンパイルされる場合とされない場合があります。そのような場合は、通常、クラスを完全にコピー可能にする必要がある場合は、割り当てを正しく行うためにオペレータを手動で定義します。

しかし、基本クラスの割り当てを明示的に呼び出す理由は、基本クラスの部分のみをコピーする必要があり、他のクラスのメンバーを変更するべきではないということです。したがって、これは実際の割り当てではありません。意味的意味

+0

これは素晴らしい答えですが、受け入れられる回答は正しいですが、この回答は理由を説明しています。 –