复制构造函数- c++按位复制与按成员复制

copy constructor - C++ bitwise vs memberwise copying?

本文关键字:复制 成员 c++ 构造函数      更新时间:2023-10-16

按位复制和按成员复制的区别是什么?当然,如果你复制成员那么你最终会复制代表成员的比特?

class MyClass
{
public:
    MyClass () : m_p (new int (5)) {}
    ~MyClass () {delete m_p;}
    int* m_p;
};
MyClass a;
MyClass b;
memcpy (&a, &b, sizeof (a));

我刚刚泄露了'a'中分配的int,重写了它的成员变量而没有先释放它。现在'a'和'b'有一个指向相同内存位置的m_p,并且在销毁时都将删除该地址。第二次尝试删除内存将会崩溃。

  • 按位复制:将对象的对象表示复制为未解释的字节序列。
  • 成员复制:根据对象的类型复制对象的每个子对象。对于具有重要复制构造函数的对象,这意味着调用复制构造函数。对于普通可复制类型的子对象,这意味着按位复制。

两者是相同的,因此如果所有子对象都是可复制的,则整个对象是可复制的。(类(子)对象也不能有虚成员函数或虚基类。)

如果您是二进制复制对象,那么可能存在不应该复制的内部结构,例如引用计数器。按位复制会破坏这一点。成员副本将使用正确的函数。

按位复制引用类型或指针类型成员时可能会遇到麻烦。

这取决于您真正需要什么,并且可以通过对生成的类实例进行浅拷贝或深拷贝来处理。