2

C++ で既存のオブジェクトの正確なレプリカを作成する高速な方法はありますか?

たとえば、ほとんどの変数を初期化せずに残したデフォルトのコンストラクターがあり、それらの変数はプロセスの後半で設定されます。次に、すべてのデータが既に初期化された状態で、そのオブジェクトの正確なコピーを作成したいと考えています。

C++ にはコピー コンストラクターがあると聞きましたが、それを使用する方法がわかりませんし、自分の状況に適合するかどうかもわかりません。すべてのデータを手動でコピーする以外に、これを行う便利な方法はありますか?

編集: このオブジェクトには多くのユーザー定義型があります(グラフなどの複雑なもの)

4

4 に答える 4

1

コピー コンストラクターを使用する必要があります。実装しない場合、コンパイラはデフォルトのものを考え出します。値によってコピーできないメンバー (動的に割り当てられるポインターなど) がある場合は、それを自分で実装し、ディープ コピーが作成されていることを確認することをお勧めします。

ただし、コピー コンストラクターの実装を選択した場合は、コピー代入演算子とデストラクタも実装する必要がある可能性が高いことを忘れないでください。これは一般に、C++ では3 つのルールと呼ばれます。

于 2013-03-27T17:43:15.147 に答える
1

メンバーが POD 型であるか、それ自体がコピー可能である場合、コンパイラは既定のコピー コンストラクターを生成します。

class Foo
{
public:
   Foo(int x, int y, int z, const std::string& name)
      : x_(x), y_(y), z_(z), name_(name)
   {
   }

private:
   int x_, y_, z_;
   std::string name_;
};

この例のクラスは、デフォルトのコピー コンストラクターを使用してコピーできます。以下はすべて正しいです。

Foo a(1, 2, 3, "four");

// copy construct b from a, using the compiler provided default copy constructor
Foo b(a);

Foo c(5, 6, 7, "eight");

// copy c from b, c's current values are "lost"    
c = b;

浅いコピーで期待どおりに動作しないユーザー定義型を含むクラスがある場合は、独自のコピー コンストラクター、代入演算子、およびデストラクターを記述する必要があります。これが、ほとんどの経験豊富な C++ 開発者が、可能な限り生のポインター (および他の同様の概念) を避ける理由です。

class BadFoo
{
public:
   BadFoo() : x_(new int(5))
   {
   }

   // ... You need to manage the memory of x_ on your own
   // This means following the rule of 3 (C++03) or 5 (C++11)

private:
   int* x_;
};

参照: 3 のルール

于 2013-03-27T17:45:46.357 に答える
0

コピーコンストラクターは行く方法です。

class MyObject
{
    public:
        MyObject(const MyObject& other);    
    private:
        int x;
        float y;
        std::string s;
}
MyObject::MyObject(const MyObject& other)
    : x(other.x), y(other.y), s(other.s)
{}

ここで他の例を参照してください

于 2013-03-27T17:44:24.080 に答える
0

コピー プロセスを手動で定義する必要があります。同じリソースを再利用している場合、またはそのリソースのコピーが必要な場合、コンパイラは他にどのように知るでしょうか?

デフォルトのコピー コンストラクター (独自のコンストラクターを定義しない限り、常にそこにあります) は、単純な代入によってすべてのデータをコピーします。これは、ポインター、ファイル、接続、およびその他すべての外部リソースに悪影響を与える可能性があります。

于 2013-03-27T17:45:49.223 に答える