primer Day5
除了完成资源移动外 移动构造函数还要保证移动后的对象处于这样一种状态 --- 销毁它是无
如果一个类定义了自己的移动构造函数/移动赋值运算符 则该类的合成拷贝构造函数和拷贝赋值运算符会被定义成删除的
class HasPtr{
public:
//拷贝构造函数
HasPtr(HasPtr&& p) noexcept:ps(p.ps),i(p.i){p.ps = 0;} //移动构造函
HasPtr & operator = (HasPtr rhs){swap(*this,rhs);return *this;}
}
这里的赋值运算符 当rhs是左值的时候 调用拷贝构造函数 当rhs是右值的时候调用的是移动构造函数
基类定义了析构函数 编译器不会合成移动操作 派生类也不会有 如果需要 首先要在基类中定义移动操作
基类默认构造函数将用来初始化派生类对象的基类部分 如果我们想拷贝基类部分 必须在派生类的构造函数初始化值列表中显示调用基类拷贝构造函数
(否则可能出现派生类的成员是拷贝构造而来,基类是默认构造初始化 不是拷贝而来的情况)
D &D::operator=(const D& rhs)
{
Base::operator=(rhs); //为基类部分赋值
}
当派生类对象赋值给基类对象时 其中的派生类部分被“切割” 因此容器和存在继承关系的类型无法兼容 所以面向对象编程 使用指针和引用 动态类型 而不是直接使用对象编程
浙公网安备 33010602011771号