拷贝控制相关

  1. 拷贝构造函数
    形式是普通构造函数的参数列表表中有常对象的引用。
    为什么是引用?如果不是引用,拷贝构造函数的参数是值传递,值传递又会调用拷贝构造函数,陷入死循环。

    直接初始化与拷贝初始化
    string str(“hello”) 直接初始化
    string str = "hello"是拷贝初始化
    要求编译器将右侧运算对象拷贝到正在创建的对象中

    拷贝初始化不仅在我们使用=定义变量时发生,
    还有:将一个对象作为实参传递给一个非引用类型行参数(就是上面的拷贝构造函数为什么是引用)
    返回非引用类型的函数返回一个对象
    列表初始化是拷贝

2.拷贝赋值运算符
重载运算符本质是函数,与拷贝构造函数类似。

  1. 析构函数
    销毁类类型的成员需要执行成员自己的析构函数。内置类型没有析构函数,因此销毁内置类型成员什么都不需要做。
    容器、变量和临时对象都会自动销毁,动态分配的对象,指针需要手动delete销毁。
    析构函数并不直接销毁成员,而是析构函数执行之后,各成员调用自己的析构函数。

4.三/五法则
有析构函数就一定需要拷贝和赋值操作,定义析构,说明有指针,有指针的话,拷贝和赋值就不可以使用合成的。合成的拷贝和赋值的对象撤销时,会两次delete指针

  1. 解决方法
    定义自己的拷贝构造函数,不是直接拷贝指针,而是拷贝指针指向的对象。
    之前 p1 = p2;
    现在 p1 = new string(*p2)
    6.移动构造函数
    移动构造函数的第一个参数是该类类型的一个右值引用。
    移动后,源对象处于这样一个状态,销毁它是无害的。
    (str &&s):a(a1),b(b1),c(c1){
    a1 = b1 = c1 = nullptr
    }
    nullptr是保证析构时,是无害的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值