以下のコピーコンストラクタ関数に何か問題があるのだろうか?
class A
{
private:
int m;
public:
A(A a){m=a.m}
}
以下のコピーコンストラクタ関数に何か問題があるのだろうか?
class A
{
private:
int m;
public:
A(A a){m=a.m}
}
2つのこと:
コピーコンストラクターは、パラメーターとして参照を取得する必要があります。そうしないと、無限に再帰的になります(実際、言語では、そのようなコンストラクターを宣言できません)。
デフォルトのcopyctorが実行しないことは何も実行しませんが、実行が悪くなります。可能な限り、copyctorで初期化リストを使用する必要があります。また、デフォルトのコピーコンストラクターが希望どおりの動作をする場合は、自分でバージョンを作成しようとしないでください。おそらく間違いを犯すだけであり、それを維持する必要があります。
3つの問題があります。
まず、「;」を忘れてしまいました m = amの最後にあるため、コードはコンパイルされません。
次に、プラットフォーム上のレジスタのサイズよりも大きいサイズの何かを渡す場合、ほとんどの場合、参照による受け渡しが推奨されます。
第三に、ソースオブジェクトを変更するつもりはないので、constを使用することをお勧めします。だから、最後にこれは私たちが持っているものです:
A(const A&a):m(am){}
問題は、値によって渡されたパラメーターに対してコピーコンストラクターが呼び出されることです。したがって、非終了の再帰が必要ない場合は、コピーコンストラクターのパラメーターを参照(通常はconst参照)で渡す必要があります。マイナーな問題は、初期化リストを使用していないことです。これは、メンバーを初期化するために望ましい方法です。両方の問題の修正:
A(A const& a)
: m(a.m)
{}