34

これは私が長い間疑問に思っていたことです。次の例を見てください。

struct matrix
{
    float data[16];
};

この特定の例でデフォルトのコンストラクターとデストラクターが何をするかは知っていますが (何もありません)、コピー コンストラクターとコピー代入演算子はどうでしょうか。

struct matrix
{
    float data[16];

    // automatically generated copy constructor
    matrix(const matrix& that) : // What happens here?
    {
        // (or here?)
    }

    // automatically generated copy assignment operator
    matrix& operator=(const matrix& that)
    {
        // What happens here?

        return *this;
    }
};

std::copyそれは、またはstd::uninitialized_copyまたはmemcpyまたは何を含みますmemmoveか?

4

2 に答える 2

46

これは、標準が 12.8 (クラス オブジェクトのコピー) で述べていることです。コピー構築:

各サブオブジェクトは、そのタイプに適した方法でコピーされます。

  • サブオブジェクトがクラス型の場合、クラスのコピー コンストラクターが使用されます。
  • サブオブジェクトが配列の場合、要素の型に適した方法で各要素がコピーされます。
  • サブオブジェクトがスカラー型の場合、組み込み代入演算子が使用されます。

課題のコピー:

各サブオブジェクトは、そのタイプに適した方法で割り当てられます。

  • サブオブジェクトがクラス型の場合、クラスのコピー代入演算子が使用されます (明示的な修飾によるかのように。つまり、より派生したクラスで可能な仮想オーバーライド関数は無視されます)。
  • サブオブジェクトが配列の場合、要素の型に適した方法で各要素が割り当てられます。
  • サブオブジェクトがスカラー型の場合、組み込み代入演算子が使用されます。
于 2010-11-12T11:54:25.547 に答える