如何在复制控制功能中处理C ++数组成员?

时间:2010-11-12 11:50:07

标签: c++ arrays copy-constructor assignment-operator

这是我长期以来所想的。请看以下示例:

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::copystd::uninitialized_copymemcpymemmove或是什么?

2 个答案:

答案 0 :(得分:40)

这是标准在12.8(复制类对象)中所说的内容。复制结构:

  

以适合其类型的方式复制每个子对象:

     
      
  • 如果子对象是类类型,则使用该类的复制构造函数;
  •   
  • 如果子对象是一个数组,则以适合于元素类型的方式复制每个元素;
  •   
  • 如果子对象是标量类型,则使用内置赋值运算符。
  •   

复制作业:

  

每个子对象都以适合其类型的方式分配:

     
      
  • 如果子对象是类类型,则使用该类的复制赋值运算符(就好像通过显式限定;即忽略更多派生类中的任何可能的虚拟覆盖函数);
  •   
  • 如果子对象是一个数组,则以适合于元素类型的方式分配每个元素;
  •   
  • 如果子对象是标量类型,则使用内置赋值运算符。
  •   

答案 1 :(得分:0)

两者都复制数组中的元素(而不是不执行任何操作或复制指针)。

struct X
{
    char data_[100];
};


int main () 
{
    X orig, copy_assign;
    orig.data_[10] = 'a';
    copy_assign = orig;
    X copy_constructor(orig);
    printf("orginal10:%c, copy_assign10:%c, copy_constructor10:%c\n",orig.data_[10],copy_assign.data_[10],copy_constructor.data_[10]);
    copy_assign.data_[10] = 'b';
    printf("original10:%c, copy_assign10:%c, copy_constructor10:%c\n",orig.data_[10],copy_assign.data_[10],copy_constructor.data_[10]);
    copy_constructor.data_[10] = 'c';
    printf("original10:%c, copy_assign10:%c, copy_constructor10:%c\n",orig.data_[10],copy_assign.data_[10],copy_constructor.data_[10]);
    return 0;
}

运行结果:

orginal10:a, copy_assign10:a, copy_constructor10:a
original10:a, copy_assign10:b, copy_constructor10:a
original10:a, copy_assign10:b, copy_constructor10:c
  • 从结果的第一行中,我们可以看到至少已复制了某些内容(它是数组中的元素,还是数组指针已复制)。
  • 在接下来的两行中,我们可以看到更改副本分配的对象和副本构造对象的数组不会更改原始数组。因此,我们得出结论,复制了元素而不是复制数组指针。

希望这个例子很清楚。