C++ 关于对象的复制

少于 1 分钟阅读

通常我们使用对象内的拷贝构造函数和拷贝构造符来进行初始化和拷贝。

class A
{
public:
    /// 拷贝构造函数
    A(const A& other)
    {
        i = other.i;
        vec = other.vec;
    }

    /// 拷贝赋值符
    A& operator=(const A& other)
    {
        if(this != &other)
        {
            i = other.i;
            vec = other.vec;
        }
        return *this;
    }
private:
    int i;
    std::vector<int> vec;
};

A foo;
A bar(foo); ///< 在这里调用拷贝构造函数
A bar2;
bar2 = foo; ///< 这里调用拷贝赋值符

关于memset

首先说结论,不推荐使用memset对某个对象进行擦写内存。因为可能导致未定义行为。 具体可以查看stackflow上的这个问题 memset for initialization in C++Use memset or a struct constructor? What’s the fastest?

你可以使用构造函数进行初始化,也可以定义成员函数clear(), 或是使用std::fill, std::fill_n。 在使用函数memset时,有部分限定条件,只有目标对象为POD类型才可以使用。

简单来说就是,该对象如果没有继承,都是基础类型(如: intchar或其他POD类型), 没有包含如std::array, std::vector等STL容器, 该对象可以称为POD类型。如下面示例

class pod
{
  char ac[12];
  int i;
  float f;
  long l;
};

关于POD具体查看C++ named requirements: PODType

关于memcpy

结论是,不推荐使用,同样除了你能确保该对象为POD类型,否则则会导致未定义现象。 可以使用拷贝构造函数或拷贝赋值符,或是std::copystd::copy_n来代替memcpy;

更新时间: