C++ 关于对象的复制
通常我们使用对象内的拷贝构造函数和拷贝构造符来进行初始化和拷贝。
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类型才可以使用。
简单来说就是,该对象如果没有继承,都是基础类型(如: int
、char
或其他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::copy
或std::copy_n
来代替memcpy
;