私は最近、ここで見られるコピーコンストラクター、代入演算子、コピースワップイディオムを再検討しました: コピーアンドスワップイディオムとは何ですか? と他の多くの場所-
上記のリンクは素晴らしい投稿です-しかし、私はまだいくつかの質問がありました-これらの質問は、stackoverflowや他の多くのサイトで、たくさんの場所で答えられていますが、私は多くの一貫性を見ていません-
1-コピーコンストラクターでディープコピー用に新しいメモリを割り当てる領域の周りにtry
-ある必要がありますか?catch
(私はそれを両方の方法で見ました)
2-コピーコンストラクタと代入演算子の両方の継承に関して、基本クラス関数をいつ呼び出す必要があり、これらの関数をいつ仮想にする必要がありますか?
3- std::copy
コピーコンストラクタでメモリを複製するための最良の方法はありますか?私はそれをで見ました、そして他の人が地球上で最悪のことをmemcpy
言うのを見ました。memcpy
以下の例を考えてみてください(すべてのフィードバックに感謝します)、それはいくつかの追加の質問を促しました:
4-自己割り当てをチェックする必要がありますか?もしそうならどこ
5-トピック外の質問ですが
、swapが「FirsttoLast」から0番目の要素がOther.Dataである場合、次のようstd::copy(Other.Data,Other.Data + size,Data);
に
使用されるのを見てきました。std::copy(Other.Data,Other.Data + (size-1),Data);
6-コメントアウトされたコンストラクターが機能しないのはなぜですか(サイズをmysizeに変更する必要がありました)-これは、作成する順序に関係なく、コンストラクターが常に最初に割り当て要素を呼び出すことを意味すると想定されますか?
7-私の実装に関する他のコメントはありますか?コードが役に立たないことは知っていますが、要点を説明しようとしています。
class TBar
{
public:
//Swap Function
void swap(TBar &One, TBar &Two)
{
std::swap(One.b,Two.b);
std::swap(One.a,Two.a);
}
int a;
int *b;
TBar& operator=(TBar Other)
{
swap(Other,*this);
return (*this);
}
TBar() : a(0), b(new int) {} //We Always Allocate the int
TBar(TBar const &Other) : a(Other.a), b(new int)
{
std::copy(Other.b,Other.b,b);
*b = 22; //Just to have something
}
virtual ~TBar() { delete b;}
};
class TSuperFoo : public TBar
{
public:
int* Data;
int size;
//Swap Function for copy swap
void swap (TSuperFoo &One, TSuperFoo &Two)
{
std::swap(static_cast<TBar&>(One),static_cast<TBar&>(Two));
std::swap(One.Data,Two.Data);
std::swap(One.size,Two.size);
}
//Default Constructor
TSuperFoo(int mysize = 5) : TBar(), size(mysize), Data(new int[mysize]) {}
//TSuperFoo(int mysize = 5) : TBar(), size(mysize), Data(new int[size]) {} *1
//Copy Constructor
TSuperFoo(TSuperFoo const &Other) : TBar(Other), size(Other.size), Data(new int[Other.size]) // I need [Other.size]! not sizw
{
std::copy(Other.Data,Other.Data + size,Data); // Should this be (size-1) if std::copy is First -> Last? *2
}
//Assignment Operator
TSuperFoo& operator=(TSuperFoo Other)
{
swap(Other,(*this));
return (*this);
}
~TSuperFoo() { delete[] Data;}
};