为什么赋值操作符用于深度复制,谁调用它
Why assignment operator is used for deep copy and who calls it
在深度复制过程中,我们编写了重载复制构造函数和赋值操作符。我可以知道为什么我们必须写重载赋值操作符,因为我们在重载复制构造函数中做同样的事情(除了一些检查和返回这个)。
谁在调用赋值运算符
遵循三原则:
如果需要为类编写复制构造函数,还应该编写复制赋值操作符和析构函数。
复制赋值操作符和复制构造函数都称为复制函数。它们基本上有助于从现有对象中获取对象的新副本。它们都是在不同场景中调用的独立实体。因此,就像在Copy构造函数中确保对所有指针成员进行深拷贝而不仅仅是浅拷贝一样,复制赋值操作符也适用。
代码示例:
class MyClass obj1, obj2;
class MyClass obj3(obj1); //Calls Copy Constructor
obj1 = obj2; //Calls Copy Assignment Operator
如果您这样做,则使用赋值操作符:
MyType my1, my2;
my1 = my2; // same as: my1.operator=(my2);
复制构造函数和赋值操作符通常有非常相似的代码,但如果操作正确(初始化器列表),应该以不同的方式编码、使用和执行。
复制构造函数应该使用初始化列表。这用于创建一个新的向量对象,该对象与已经存在的对象相同。
vector::vector(const vector& b)
:size(b.size),
capacity(b.capacity),
data(new TYPE[size])
{
//there should be minimal code here
//I'm skipping copying the data, because doing it right
//is hard and beside the point
}
vector seven;
seven.push_back(7);
vector seven_copy(seven); //make a new one, same as old
赋值操作符可能正是您所拥有的。这用于将一个已经存在的向量对象重新赋值为与已经存在的
相同。vector& vector::operator=(const vector& b)
{
//carefully written so self assignment doesn't crash.
TYPE* temp = new TYPE[b.size];
//I'm skipping copying the data, because doing it right
//is hard and beside the point
delete [] data;
//all exceptions that can be thrown, have, so it's safe to modify members now
data = temp;
size = b.size;
capacity = b.capacity;
return *this;
}
vector nine;
nine.push_back(9);
nine = seven; //make an old one the same as another old
应该注意的是,move构造函数和move赋值可能看起来模糊相似,但也应该有所不同。
vector::vector(vector&& b)
:size(b.size)
capacity(b.capacity)
data(b.data) //different!
{
b.data = nullptr;
}
vector& operator=(vector&& b)
{
//since b.data is tied to b.size and b.capacity, it's safest to just swap
//so if someone calls b.push_back() after, it's all still safe.
std::swap(size, b.size);
std::swap(capacity, b.capacity);
std::data(data, b.data);
return *this;
}
相关文章:
- 当从函数参数中的临时值调用复制构造函数时
- 为什么调用复制构造函数而不是移动构造函数?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 编译器调用复制运算符而不是移动运算符
- push_back std::vector,则重复调用复制构造函数
- 为什么调用复制构造函数来构造空unique_ptr向量?
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 我打算调用initializer_list构造函数,如果存在,则事先调用复制构造函数:为什么?
- C++ - 从移动分配运算符调用复制分配
- 构造函数初始值设定项列表未调用复制构造函数
- 为什么在我的代码中调用复制构造函数而不是移动构造函数?
- std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
- 通过引用传递对象时是否调用复制构造函数?
- 如果函数按值传递并按值返回,将调用复制构造函数多少次
- 为什么要抛出引用调用复制构造函数的异常?
- 为什么即使参数标记为"const",也会调用复制构造函数?
- Clang-Tidy:移动构造函数通过调用复制构造函数来初始化类成员
- 为什么当我添加一个不同的对象(复制构造函数中的参数)时调用复制构造函数?
- 为什么调用复制构造函数,当我只返回对象 c++ 的引用时
- 为什么在下面的代码中调用复制构造函数两次