1. 概述
本文将重点介绍"Move"语义相关的移动构造和移动赋值构造函数,同时也给出了与"Copy"语义的拷贝构造和拷贝赋值构造函数的对比。
2. 拷贝构造和拷贝赋值构造函数
在了解移动构造和移动赋值构造函数之前,我们先来看一下拷贝构造和拷贝赋值构造函数。
- 拷贝构造函数:通过拷贝的方式,用一个相同类的对象去初始化类对象;
- 拷贝赋值构造函数:通过拷贝的方式,用一个类对象赋值给一个相同类且已经存在的类对象。
如果代码中没有显式地给出拷贝构造和拷贝赋值构造函数,并且又会用到时,此时编译器将会生成一套默认的拷贝构造和拷贝赋值构造函数(“浅拷贝”版本)。如果类中又有处理动态分配内存时,我们应该重写自己的“深拷贝”版本。
回忆一下我们之前的文章《Move语义和Smart Pointers先导(以一个例子说明)》中第五章的方案二,当时说采用拷贝构造和拷贝赋值构造函数有代价,我们在这里看一下有什么代价。
#include <iostream>
template<typename T>
struct AutoPtr3
{
AutoPtr3(T* ptr = nullptr)
: ptr(ptr)
{
}
~AutoPtr3()
{
if(this->ptr != nullptr)
{
delete this->ptr;
this->ptr = nullptr;
}
}
AutoPtr3(const AutoPtr3& ptr3) // deep copy
{
this->ptr