10

const 参照の代わりにポインターを渡すだけでコピー コンストラクターを作成できますか? (ただし、値を変更しないことを確認しても問題ありませんか?)

そのようです:

SampleClass::SampleClass(SampleClass* p)
{
 //do  the necessary copy functionality
}

それ以外の:

SampleClass::SampleClass(const SampleClass& copyObj)
{
//do the necessary copy
}

前もって感謝します。


みんな、ありがとう。したがって、ポインターを受け取るコンストラクターを記述した場合 (それが私のコピー コンストラクターであると考えた場合)、コンパイラは引き続き既定のコピー コンストラクターを提供します。デフォルトのコピー コンストラクターが呼び出されます。とった。

4

9 に答える 9

19

はい、オブジェクトへのポインターを受け取るコンストラクターを作成できます。ただし、コピーコンストラクタとは言えません。コピー コンストラクターの定義そのもので、同じクラスのオブジェクトを渡す必要があります。それ以外のものを渡す場合、はい、それはコンストラクターですが、コピー コンストラクターではありません。

于 2009-04-14T03:33:50.053 に答える
4

ポインターを引数として取るコンストラクターを作成できます。
しかし、コピー コンストラクターは、特定のコンストラクターに付ける名前です。
同じクラスの参照 (const が望ましいが必須ではない) を引数として受け取るコンストラクターは、コピー コンストラクターと呼ばれます。

于 2009-04-14T03:33:32.270 に答える
2

明示的に無効にしない限り、コピー コンストラクターではなく、コンパイラーがコピー コンストラクターを生成するという事実以外に、得るものも失うものもありません。null ポインターからのコンストラクターの正しいセマンティクスは何ですか? これにより、クラスのユーザーに何が追加されますか? (ヒント: 何もありません。ヒープ オブジェクトから構築したい場合は、ポインターを逆参照して、通常のコピー コンストラクターを使用できます)。

于 2009-04-14T06:31:28.130 に答える
1

いいえ。コピーコンストラクターは、値渡しなどに役立つ場合は、ポインターではなく参照を取る必要があります。

于 2009-04-14T03:31:46.470 に答える
1

定義上、コピー ctor は const 参照を使用します。ポインターを受け取る ctor を作成することを妨げるものは何もありませんが、参照を使用する場合には存在しないいくつかの問題が発生します。

于 2009-04-14T03:33:52.020 に答える
1

値パラメーターはコピーを作成する必要があるため、コピー コンストラクターには参照が必要です。これにより、コピー コンストラクターが呼び出され、そのパラメーターのコピーが作成され、コピー コンストラクターが呼び出されます。

于 2009-04-14T03:34:09.630 に答える
1

そのようなコンストラクターを作成できますが、技術的にはコピー コンストラクターではありません。たとえば、STL コンテナーは、コンパイラーによって生成されたコピー コンストラクターを引き続き使用します (ユーザーが作成しなかったため、コンパイラーによって生成されます)。

于 2009-04-14T03:34:59.737 に答える
1

コピー コンストラクターは、次の 2 つの場合に暗黙的に使用されます。

  • クラスのインスタンスが値によって関数に渡されるとき。
  • クラスのインスタンスが関数から値によって返される場合。

他の人が述べたように、記述されたシグネチャ (または const ポインター) を使用してコンストラクターを作成できますが、上記のいずれの場合にも使用されません。

于 2009-04-14T12:41:56.897 に答える
-1

完全に有効なコピーコンストラクターを記述しても、NULLの参照を渡すことができます。NULLをテストできますが、コンストラクタ初期化リストを使用しない場合に限ります。

例:

MyClass::MyClass( MyClass const& MyClassCopy )
: somevar( MyClassCopy.somevar ) // <- the init list goes here.
{
   // If MyClassCopy is NULL, the initialization above is doomed!
   // However we can check for NULL in the constructor body but
   // the initialization list must be removed ...
   if (&MyClassCopy == NULL ) throw( std::runtime_error("NULL pointer!"));
   somevar = MyClassCopy.somevar;
}

// I'll now do some very dangerous programming to
// demonstrate one way that a NULL can get through ...
MyClass* P = NULL;
MyClass A( *P ); // Bang, you're dead!

私の知る限り、初期化リスト内からNULLをチェックする方法はないので、NULLが通過する状況になる可能性があると思われる場合は、コンストラクター本体でそれをテストして、そこから初期化します。

:: operator =()関数には注意すべきいくつかの落とし穴があることを忘れないでください...

于 2011-11-03T05:43:42.497 に答える