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

本文介绍了C++中的构造函数,包括单一构造函数、拷贝构造函数和移动构造函数。单一构造函数允许隐式转换,但可使用`explicit`关键字禁止。拷贝构造函数在对象传递时被调用,而移动构造函数(C++11引入)则用于优化效率,通过转移资源而非复制。移动构造函数通常声明为`noexcept`且接收右值引用。
摘要由CSDN通过智能技术生成

在这里插入图片描述
拷贝构造函数也是构造函数,所以一但声明,默认构造函数就失效了

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可峰科技

生活不易

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值