3

以下のコピーコンストラクタ関数に何か問題があるのだろうか?

class A
{
   private:
      int m;
   public:
      A(A a){m=a.m}
}
4

3 に答える 3

17

2つのこと:

  • コピーコンストラクターは、パラメーターとして参照を取得する必要があります。そうしないと、無限に再帰的になります(実際、言語では、そのようなコンストラクターを宣言できません)。

  • デフォルトのcopyctorが実行しないことは何も実行しませんが、実行が悪くなります。可能な限り、copyctorで初期化リストを使用する必要があります。また、デフォルトのコピーコンストラクターが希望どおりの動作をする場合は、自分でバージョンを作成しようとしないでください。おそらく間違いを犯すだけであり、それを維持する必要があります。

于 2010-03-11T16:12:20.290 に答える
7

3つの問題があります。

まず、「;」を忘れてしまいました m = amの最後にあるため、コードはコンパイルされません。

次に、プラットフォーム上のレジスタのサイズよりも大きいサイズの何かを渡す場合、ほとんどの場合、参照による受け渡しが推奨されます。

第三に、ソースオブジェクトを変更するつもりはないので、constを使用することをお勧めします。だから、最後にこれは私たちが持っているものです:

A(const A&a):m(am){}

于 2010-03-11T16:09:03.350 に答える
5

問題は、値によって渡されたパラメーターに対してコピーコンストラクターが呼び出されることです。したがって、非終了の再帰が必要ない場合は、コピーコンストラクターのパラメーターを参照(通常はconst参照)で渡す必要があります。マイナーな問題は、初期化リストを使用していないことです。これは、メンバーを初期化するために望ましい方法です。両方の問題の修正:

A(A const& a)
  : m(a.m)
{}  
于 2010-03-11T16:12:13.053 に答える