- 模板特例如何写忘了
- 拷贝noexcept
如果可以确认不会抛出异常,交换两个指针就行了
- swap是命名空间里的某个,更改的时候需要加上该命名空间
特例函数怎么写,就这样。inline的位置值得注意
- "=”运算符重载
-
两种拷贝一致
-
不可拷贝的方式
- 编译器会想方设法为我们设置一个默认的拷贝
- 有一个不可拷贝的成员对象
- 继承自一个不可拷贝的类
- 任何对象至少有一字节 空的类也不会0
- 空基类优化 继承自一个空类它就真的是空的,编译器帮我们优化
- 所以我们采用继承的方式
因为它的基类无法生成拷贝
- 继承是个秘密
任何依赖于知道继承的关系的操作都不行了
- 抽象类操作
- 返回值可以是对象的指针,要与抽象类一致或者是斜变
-
- const要从逻辑来考虑,不是仅仅是元素
按理来说可以写成const因为shape类的数据成员是bp,bp其实没有被改变,没有被改变意思是说吧bp指向的对象没变,只是对象的数据改变了。但是用户理解是它伸缩了
- 代理类surrogate
- 支持动态绑定
- 内存管理,不用手动释放
- 引用计数
- 一个人什么时候真正死亡,是他的肉体死亡吗?不是,当这个世界上没有任何一个人再记住他的时候
- 值语义、引用语义
- 句柄:一种代理类 添加引用计数,当计数为0销毁对象
- 懒惰赋值
- 拷贝新的开始 没有销毁就不会创建
- 发生了几次拷贝
自17起不再把返回值拷贝
- 拷贝控制
- 拷贝构造函数
写参数的时候一定要首先考虑可不可以用常量引用,如果不写引用,他会首先发生临时变量赋值,这时候就会调用拷贝构造函数,无限递归了。如果不写const首先他不规范,其次去除底层const
- 拷贝复制运算符
-
返回this引用可以连续赋值,这是一种规范
- 赋值运算符重载一定要避免自我复制 V1=V1看起来很蠢,但是V1可能等于它的引用
当首先销毁自身时也同时销毁了赋值对象
-
正确的做法 先复制,异常安全
- 不是异常安全的看似的做法
-
- 拷贝构造函数
- 发生了几次拷贝
- 默认的拷贝构造
- 逐个成员复制
- 类对象,调用类的拷贝构造
- 不可拷贝对象,没办法也不报错
- 数组成员可以正确拷贝,编译器知道它是数组,指针就不是数组
- 默认函数,编译器有一定能力合成的函数=default
- 三大律
这个类有一定的资源,或者这三个函数不好写、
- 禁止拷贝
- 比如输入流cin
- =delete 所有函数都可以=delete
如果编译器帮你生成默认函数发生错误时隐式delete
- 之前是把拷贝弄成private,类内或者friend 只声明不定义,编译器发生连接错误,连接错误是运行错误,不是编译错误
- explicit声明
显式构造,不允许隐式类型转换
- logic const
不是const,可变对象,这个对象可不变对用户没有任何影响,在逻辑上依然是const,但是如果不写mutable肯定是不行的,因为编译器不允许在const里更改修改值
- decltype类型推导
只用类型,不去计算,完完整整保留
i加个()就是表达式,表达式的返回值就是左值是引用