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++复习笔记——右值引用(概念,使用场景),移动拷贝构造函数,赋值拷贝构造函数。