当前位置:嗨网首页>书籍在线阅读

16-赋值

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

18.2.4 赋值

适用于构造函数的移动语义考虑也适用于赋值运算符。例如,下面演示了如何给Useless类编写复制赋值运算符和移动赋值运算符:

Useless & Useless::operator=(const Useless & f) // copy assignment
{
    if (this == &f)
        return *this;
    delete [] pc;
    n = f.n;
    pc = new char[n];
    for (int i = 0; i < n; i++)
        pc[i] = f.pc[i];
    return *this;
}
Useless & Useless::operator=(Useless && f) // move assignment
{
    if (this == &f)
        return *this;
    delete [] pc;
    n = f.n;
    pc = f.pc;
    f.n = 0;
    f.pc = nullptr;
    return *this;
}

上述复制赋值运算符采用了第12章介绍的常规模式,而移动赋值运算符删除目标对象中的原始数据,并将源对象的所有权转让给目标。不能让多个指针指向相同的数据,这很重要,因此上述代码将源对象中的指针设置为空指针。

与移动构造函数一样,移动赋值运算符的参数也不能是const引用,因为这个方法修改了源对象。