明示的な方法とは別に、C++ で暗黙的なオブジェクトを作成する方法は多数あります。それらのほとんどすべては、オブジェクトのクラスのコピー コンストラクターを使用します。注意:暗黙的なコピーでは、コピーが発生する場所に応じて、型のコピー コンストラクターや代入演算子をスコープ内T
で宣言する必要がある場合があります。したがって、もちろん:
a)スタック内の真新しいオブジェクトの明示的な作成:public
T object(arg);
b) 既存のオブジェクトの明示的なコピー:
T original(arg);
...
T copy(original);
クラスにコピー コンストラクターが定義されていない場合T
、デフォルトの実装がコンパイラーによって作成されます。渡されたオブジェクトの正確なコピーを作成しようとします。これは常にプログラマが望むものではないため、カスタム実装が役立つ場合があります。
c) ヒープ内の新しいオブジェクトの明示的な作成:
T *ptr = new T(arg);
d) コンストラクターがパラメーターを 1 つだけ取り、修飾子を持たない新しいオブジェクトの暗黙的な作成explicit
。たとえば、次のようになります。
class T
{
public:
T(int x) : i(x) {}
private:
int i;
}
...
T object = 5; // actually implicit invocation of constructor occurs here
e) 値によって関数に渡されたオブジェクトの暗黙のコピー:
void func(T input)
{
// here `input` is a copy of an object actually passed
}
...
int main()
{
T object(arg);
func(object); // copy constructor of T class is invoked before the `func` is called
}
f) 値による例外オブジェクト処理の暗黙のコピー:
void function()
{
...
throw T(arg); // suppose that exception is always raised in the `function`
...
}
...
int main()
{
...
try {
function();
} catch (T exception) { // copy constructor of T class is invoked here
// handling `exception`
}
...
}
g) 代入演算子を使用した新しいオブジェクトの作成。この場合、特定の型の代入演算子の実装が重要であるため、「コピー」という言葉は使用していません。この演算子が実装されていない場合、デフォルトの実装はコンパイラによって作成されますが、デフォルトのコピー コンストラクタと同じ動作をします。
class T
{
T(int x) : i(x) {}
T operator=() const
{
return T(*this); // in this implementation we explicitly call default copy constructor
}
}
...
int main()
{
...
T first(5);
T second = first; // assingment operator is invoked
...
}
そうですね、Stroustrup の本を調べなくても、私が思い出すことができるのはそのことです。何かが見落とされている可能性があります。
これを書いている間に、いくつかの回答が受け入れられたので、この時点で終了します。私がリストした詳細が役に立ちますように。