对于自定类型, 则应该在构造函数完善地初始化
对于类的成员, 尽可能不要在构造函数内再初始化自己的元素, 因为在进入构造函数之前自定类型就会被调用默认初始化了, 构造函数内进行的实际上是拷贝构造, 但又要注意内置类型并不会调用默认初始化...这个方法顺便解决了证同问题
证同+备份: 如果对效率要求很高的话可以在备份指针的方法最前面再引入证同测试, 但是要衡量引入额外的if语句是否值得
复制构造并交换: 用赋值构造的方法构造一个当前类型的副本...如果有一些成员变量没有在初值列中进行拷贝, 那么此时对象将会进入局部拷贝状态
如果只拷贝了成员变量而没有调用基类的拷贝函数, 那么此时基类部分将会被默认初始化, 也属于一种局部拷贝
很多时候基类的拷贝函数与派生类的拷贝函数会有很多代码的重叠部分...相当于以前的auto_ptr, 只能移动而不可复制(复制操作默认是移动语义的), 没有其它成员变量, 可以用make_unique来初始化数组
shared_ptr: 有引用计数的指针, 因此可以复制...不允许是模板类是因为std的设计协议就是不要为std添加任何额外的模板, 函数, 类等等, 我们只允许添加新的模板特化版本
最后在我们需要调用swap的时候, 先using std::swap;暴露出std