0

別のクラスをメンバー変数として含むクラスを作成しようとしています。そして、次の問題が発生します。

class SubClass{
    ....
};

class MainClass{
   public:
    MainClass(SubClass const & subClass_);
   private:
    SubClass subClass
};

およびコンストラクターの .cpp ファイル内

MainClass::MainClass(SubClass const & subClass_){
   subClass =  subClass_;
}

これにより、コンパイラ エラーが発生します。しかし、次の作品:

MainClass::MainClass(SubClass const & subClass_):
   subClass(subClass_) {}

これら2つの違いは何ですか?

4

3 に答える 3

0
  • 最初のケースでは、クラスの作成済みインスタンスoperator=に適用されます(クラスの最初のデフォルト インスタンスが作成され、次に operator= が呼び出されます)。
  • 2番目のケースでは、メンバーの初期化を使用すると、クラスインスタンスの作成にコピーコンストラクターを使用できるため、最初に必要な値で初期化されます。

違い:
2 番目のケースは、実行に必要な操作が少ないため、より効率的であると見なされます。
最初のケース - クラスにデフォルトのコンストラクターを要求します。

独自のバージョンのコンストラクターを実装している限り、MainClass のデフォルト コンストラクターが実装されていないことが問題の原因である可能性があります。コンパイラーは特別なメンバー関数 (デフォルト コンストラクター) を作成しなくなりました。

解決策:デフォルトのコンストラクターを実装する/メンバー初期化構文を使用する(アプリケーションのロジックに応じてバリアントを選択)

于 2013-10-03T09:59:42.903 に答える
0

これは、SubClass が代入演算子をサポートしていないことを示している可能性があります (以前のコードでは必要でした)。後者のコードは代入を呼び出さず、むしろ subClass_ から subClass メンバーをコピーして初期化します

SubClass の定義を入れると、さらに多くのことが言えます

于 2013-02-25T02:37:05.140 に答える