2016-10-31 32 views
2

私は、次のいるクラス:定義する明示的な過負荷のコンストラクタ問題

class CLASS1 
{ 
     CLASS1(); 
     CLASS1(const CLASS1 &obj); 

    CLASS1 operator +(const CLASS1 &obj) { 
     CLASS1 srcObj; 
     // doing add stuff here 
      return srcObj; 
     } 

    void func() 
    { 
    CLASS1 boj = // some method which returns CLASS1 obj. 
    } 


    CLASS1& operator =(const CLASS1 &obj) { 
     // copy properties 
     } 
} 

okが、これは正常に動作します。しかししばらくして暗黙的な変換を避けるためにクラスを明示的にすることに決めました。私は明示的に割り当てをオーバーロードしてきたのにもかかわらず、

class CLASS1 
{ 
     explicit CLASS1(); 
     explicit CLASS1(const CLASS1 &obj); 

    CLASS1 operator +(const CLASS1 &obj) { 
     CLASS1 srcObj; 
     // doing add stuff here 
      return srcObj;   // compiler gives non-matching errors 
    } 

    void func() { 
     CLASS1 boj = somemethods(); // compiler gives non-matching errors 
    } 

    CLASS1& operator =(const CLASS1 &obj) { 
     // copy properties 
     } 
} 

今、コンパイラは与えない「と呼ぶために一致する機能を...」エラー(上記のコードで指定):したがって、私はそれをこのように作りましたオペレーター。私のミスはどこですか?

答えて

2

オブジェクトを値で返すと、コピーコンストラクタは暗黙的にと呼ばれます。あなたが暗黙のうちに呼び出されることが許されていないと言うなら、あなたは誤りを起こすでしょう。

デフォルト、コピー、または移動コンストラクタにはexplicitを使用しないでください。または、複数の引数を取るコンストラクタの場合単一の引数を取るコンストラクタに対してのみ(例外はあります)

1

技術的に言えば、メソッドからオブジェクトを返すとき、メソッド呼び出しの外に受け取るオブジェクトは、実際にはメソッドの中で宣言するオブジェクトのコピーです。したがって、コンパイラは、メソッド内のオブジェクトからメソッドの結果に "コンテンツを転送"するための許可された方法を持っていなければなりません。イン・メソッドのインスタンスが不要になったので、動きが最善のアプローチ(はい、あなたは移動のコンストラクタを追加する必要があります)ではありません:

CLASS1(CLASS1&& obj); 

一時的に持っている能力を維持しながら、これは、あなたが暗黙の変換を禁止することができますオブジェクト。

実際のところ、このコピー/移動はRVO/NRVOによって最適化される可能性が高いです。