C++ 12.4.2 构造,析构与复制函数

单一参数构造函数

单一构造函数可以实现隐式类型转换

 但是,有些情况我们不希望发生隐式类型转换。因为这会造成一些错误的语法的兼容。

显式的初始化可以避免隐式类型转换。

 用static_cast也可以实现显式的类型转换。

 拷贝构造函数

什么是拷贝构造函数 ?

接收一个当前类对象的构造函数

 

 拷贝构造函数如果进行传值而不是传引用,可能会陷入一种无限递归。

拷贝构造函数不希望对拷贝的值进行修改。

移动构造函数

目的:进一步提升系统性能

场景:把旧对象赋予新对象,并且不再使用旧对象。

构造函数的参数列表中的参数要声明为右值,这样我们可以放心大胆地偷资源。

 当某些特殊成员函数(如拷贝构造)未定义时,编译器可以合成一个移动构造函数。如果没有定义移动构造函数,但是定义了拷贝构造函数,默认的移动构造函数将采用拷贝构造函数。·

移动构造函数通常声明为不可抛出异常的函数。

Str2(Str2&&) noexcept
{
//...
}

什么情况会抛出异常?

分配内存时内存不够。拷贝构造函数可能会出现,移动构造函数一般不出现,但是如果以偶定构造函数调用拷贝构造函数时,可能会出问题。

vector在进行push_back的时候,有一个异常安全机制,就是发生异常时,也会保留原vector的值。注意,如果移动构造函数没有noexcept标志,vector将会调用拷贝构造函数来确保安全。

右值引用对象在表达式中是左值。

Str(str&& x) noexcept
{
    std::string tmp =x.a;
    //x被视为左值去使用
    //想去偷资源 std::string tmp = std::move(x.a);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值