处理自我赋值问题有几个方式:
证同测试: 在拷贝构造函数的最前面用if判断目标对象与当前对象地址是否相同, 相同则直接返回*this....这个方法顺便解决了证同问题
证同+备份: 如果对效率要求很高的话可以在备份指针的方法最前面再引入证同测试, 但是要衡量引入额外的if语句是否值得
复制构造并交换: 用赋值构造的方法构造一个当前类型的副本...如果拷贝构造是以值形式传入参数的话, 还可以直接将当前对象数据与传值进入的对象进行交换
12 复制对象时勿忘其每一个成分
当你选择实现自己的拷贝构造函数时, 一定要手动复制所有的局部变量, 同时调用所有基类合适的拷贝函数...如果有一些成员变量没有在初值列中进行拷贝, 那么此时对象将会进入局部拷贝状态
如果只拷贝了成员变量而没有调用基类的拷贝函数, 那么此时基类部分将会被默认初始化, 也属于一种局部拷贝
很多时候基类的拷贝函数与派生类的拷贝函数会有很多代码的重叠部分...相当于以前的auto_ptr, 只能移动而不可复制(复制操作默认是移动语义的), 没有其它成员变量, 可以用make_unique来初始化数组
shared_ptr: 有引用计数的指针, 因此可以复制