C++拷贝控制技术

  1. 模板特例如何写忘了
  2. 拷贝noexcept

     如果可以确认不会抛出异常,交换两个指针就行了

  3. swap是命名空间里的某个,更改的时候需要加上该命名空间

     特例函数怎么写,就这样。inline的位置值得注意

  4. "=”运算符重载

  5.  

    两种拷贝一致 

  6. 不可拷贝的方式

    1.   编译器会想方设法为我们设置一个默认的拷贝
    2. 有一个不可拷贝的成员对象
    3. 继承自一个不可拷贝的类
    4. 任何对象至少有一字节 空的类也不会0
    5. 空基类优化  继承自一个空类它就真的是空的,编译器帮我们优化
    6. 所以我们采用继承的方式

       因为它的基类无法生成拷贝

  7. 继承是个秘密

     任何依赖于知道继承的关系的操作都不行了

  8. 抽象类操作
    1.   返回值可以是对象的指针,要与抽象类一致或者是斜变
    2.  

    3. const要从逻辑来考虑,不是仅仅是元素

       按理来说可以写成const因为shape类的数据成员是bp,bp其实没有被改变,没有被改变意思是说吧bp指向的对象没变,只是对象的数据改变了。但是用户理解是它伸缩了

  9. 代理类surrogate
    1.   支持动态绑定
    2. 内存管理,不用手动释放

  10. 引用计数
    1.   一个人什么时候真正死亡,是他的肉体死亡吗?不是,当这个世界上没有任何一个人再记住他的时候
    2. 值语义、引用语义
    3. 句柄:一种代理类 添加引用计数,当计数为0销毁对象
    4. 懒惰赋值

  11. 拷贝新的开始 没有销毁就不会创建
    1.   发生了几次拷贝

       自17起不再把返回值拷贝

    2. 拷贝控制
      1.   拷贝构造函数

         写参数的时候一定要首先考虑可不可以用常量引用,如果不写引用,他会首先发生临时变量赋值,这时候就会调用拷贝构造函数,无限递归了。如果不写const首先他不规范,其次去除底层const

      2. 拷贝复制运算符
        1.  返回this引用可以连续赋值,这是一种规范

        2. 赋值运算符重载一定要避免自我复制 V1=V1看起来很蠢,但是V1可能等于它的引用

           当首先销毁自身时也同时销毁了赋值对象

        3.  正确的做法 先复制,异常安全

        4. 不是异常安全的看似的做法

  12. 默认的拷贝构造
    1.   逐个成员复制
    2. 类对象,调用类的拷贝构造
    3. 不可拷贝对象,没办法也不报错
    4. 数组成员可以正确拷贝,编译器知道它是数组,指针就不是数组
  13. 默认函数,编译器有一定能力合成的函数=default

  14. 三大律

     这个类有一定的资源,或者这三个函数不好写、

  15. 禁止拷贝
    1.   比如输入流cin
    2. =delete 所有函数都可以=delete

       如果编译器帮你生成默认函数发生错误时隐式delete

    3. 之前是把拷贝弄成private,类内或者friend 只声明不定义,编译器发生连接错误,连接错误是运行错误,不是编译错误
  16. explicit声明

     显式构造,不允许隐式类型转换

  17. logic const

     不是const,可变对象,这个对象可不变对用户没有任何影响,在逻辑上依然是const,但是如果不写mutable肯定是不行的,因为编译器不允许在const里更改修改值

  18. decltype类型推导

     只用类型,不去计算,完完整整保留

     i加个()就是表达式,表达式的返回值就是左值是引用

posted @ 2023-05-24 20:40  SunShine789  阅读(14)  评论(0)    收藏  举报