2016-06-11 13 views
0

私は、オペレータのオーバーロードを示すコードスニペットを見つけたオンラインチュートリアルでC++ OOPの概念を学びたいと考えています。なぜこのオペレータのオーバーロードは機能しますか?

コードを以下に示します。

class MyClass{ 
int var; 
public: 
    Myclass(int value=0){ 
    var = value; 
    } 

    Myclass operator+(Myclass &obj){ 
    Myclass newobj; 
    newobj.var = this->var + obj.var; 
    return newobj; 
    } 
}; 

は、私はそうのような主要機能でオペレーターを呼び出すとしますクラスの以前のチュートリアルの間に

int main(){ 
... 
obj3 = obj2 + obj1; 
... 
} 

、私はコピーコンストラクタは、すべての必要とする理由について読みますパラメータは2つのクラスオブジェクトをどのようにコピーするかの定義であるため、参照渡しされるパラメータです。したがって、私が理解する限り、クラスのオブジェクトをコピーする必要がある場合、コピーコンストラクタは必須です。

上記のコードスニペットでは、コンパイラはnewobjの値をmain()関数(obj3)のL_valueに "コピー"しようとしています。しかし、コピーコンストラクタが定義されていなければ、これはどのように可能ですか?私はここで何か誤解したことがありますか?

ありがとうございました!

+1

コンパイラはあなたのためのデフォルトのコピーコンストラクタを定義します。 – melpomene

+1

場合によっては、コンパイラはコピーctorとコピー代入演算子を生成します。 – Borgleader

+1

related:http://stackoverflow.com/questions/12577907/default-copy-constructor – user463035818

答えて

0

http://en.cppreference.com/w/cpp/language/copy_constructor#Implicitly-declared_copy_constructor

あなたがない限り、任意のクラスTについて(コンパイラによって生成される)は、常に暗黙的に定義されている標準C++ 2003または古いコピーコンストラクタを使用している場合:

  • Tはできない非静的データメンバを持っているがコピーされる(削除された、アクセスできない、または曖昧なコピーコンストラクタを持つ)。
  • Tにはコピーできない直接的または仮想的な基底クラスがあります(削除された、アクセスできない、またはあいまいなコピーコンストラクタを持っています)。
  • Tには、削除またはアクセスできないデストラクタを持つ直接的または仮想的な基底クラスがあります。あなたは、標準C++ 2011以降コピーコンストラクタを使用している場合

は常に暗黙的に任意のクラスのために(コンパイラによって生成される)に定義されてTない限り:

  • Tはコピーできない非静的データメンバを(持っていますアクセスできない、あいまいなコピーコンストラクタを持っている)。
  • Tにはコピーできない直接的または仮想的な基底クラスがあります(削除された、アクセスできない、またはあいまいなコピーコンストラクタを持っています)。
  • Tには、削除またはアクセスできないデストラクタを持つ直接的または仮想的な基底クラスがあります。
  • Tには、ユーザ定義の移動コンストラクタまたは移動代入演算子があります。
  • Tは共用体であり、非自明なコピーコンストラクタを持つバリアントメンバを持ちます。
  • Tには、rvalue参照型のデータメンバーがあります。

また

a = b; 

は、主にコピーコンストラクタが、コピー割り当てを呼び出していないことに注意してください。それはまた、あなたのクラスがの場合にはの場合に暗黙的に(自動生成されて)定義されます。詳細について

は、以下を参照してください。http://en.cppreference.com/w/cpp/language/copy_assignment#Implicitly-declared_copy_assignment_operator

関連する問題