C++拷贝构造函数移动拷贝函数

Posted COCO_PEAK_NOODLE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++拷贝构造函数移动拷贝函数相关的知识,希望对你有一定的参考价值。


拷贝构造函数也是构造函数,所以一但声明,默认构造函数就失效了

1、单一构造函数
  • 是指只有一个参数的构造函数,C++中可以用此类型隐式转换为该类
class Str

Str(int a)


fun(Str x)



int main()
 //隐式转换
 Str x = 1;
 //隐式转换
 x.fun(2);


  • 如果不想被隐式转换,则可以加上explicit关键字
class Str

explicit Str(int a)



2、拷贝构造函数:接收一个当前类对象的构造函数
  • 会在涉及到拷贝初始化的场景被调用,比如:参数传递。因此要注意拷贝构造函数的形参类型
class Str

Str() = default;
//默认拷贝构造函数
//Str(const Str&) = default;
//自定义拷贝构造函数
Str(const Str& a)
   //




int main()
//使用默认的无参构造函数初始化
Str a;
//使用拷贝构造函数初始化
Str b(a);
//使用拷贝构造函数初始化


  • 如果提供拷贝构造函数,则系统会自动生成,自动生成的拷贝构造函数会调用各个成员的拷贝构造函数进行拷贝,如果没有,系统则会报错。
3、移动构造函数(C++11)

接收一个当前类右值引用对象的构造函数,它的出现是为了方便程序使用,同时更好的优化速度,移动构造函数移动数据到另一个变量,速度很快,应该就是换了个名字继续用,但是原先的变量就失效了,这个和引用有区别。

class Str

Str() = default;
//拷贝构造函数
Str(const Str&) = default;

//默认的移动构造函数,注意这里没有const
Str(Str&&) = default;
//自定义的移动构造函数,注意这里没有const
Str(Str&& a)



int main()

Str a;

//调用移动构造函数
//注意当没有移动构造函数时,会调用拷贝构造函数
//当既没有移动构造,也没有拷贝构造时,则会自己合成一个默认的移动构造函数,
//默认的移动构造函数会调用每个成员的移动构造函数
Str b = std::move(a);


  • 通常移动构造函数会被声明为不可抛出异常的函数,这一点也不是很重要,就是加上noexcept
  • 注意右值引用对象用作表达式时是左值
    有点绕口,其实就是说当数据传进去之后,你可以像普通左值变量一样使用
class Str

Str() = default
//,注意这里没有const
void fun(Str && data)
     
     //这里data可以直接像普通左值变量一样使用
     std::cout << data.x << std::endl;


public:
int x;

以上是关于C++拷贝构造函数移动拷贝函数的主要内容,如果未能解决你的问题,请参考以下文章

c++复习笔记——右值引用(概念,使用场景),移动拷贝构造函数,赋值拷贝构造函数。

关于C++默认拷贝构造函数

C++类的特殊成员-默认/拷贝/移动构造函数

C++ Primer笔记14---chapter13 拷贝控制1

C++析构拷贝赋值移动拷贝函数的几个知识点(不全)

浅谈C++类的拷贝控制