火羽白142 2020-02-22 17:31 采纳率: 0%
浏览 398

初学C++,搞不太懂移动构造函数与运算符的实现机理,求解答,谢谢各位。。?

class Test {
public:
using strvec = vector*;
Test() = default; //默认初始化
Test(const strvec &d, const strvec &m): dat(d), mes(m) { }

Test(const Test &t): dat(t.dat), mes(t.mes) { } //拷贝构造函数
Test(Test &&t) noexcept : dat(t.dat), mes(t.mes) { //移动构造函数
t.dat = nullptr;
t.mes = nullptr;
}
Test &operator=(const Test &t){
dat = t.dat;
mes = t.mes;
}

    Test &operator=(Test &&t) noexcept {    //移动运算符 
        if (this != &t) {   
        dat = t.mes;                    //这里故意颠倒赋值,检验是否使用了移动运算符            
        mes = t.dat;
        t.dat = t.mes = nullptr;
        }

    }
    vector<string> *dat;
    vector<string> *mes;

};

int main()
{
vector x({"ab", "cd"}), y({"ef", "gh"});
Test a(&x, &y); //初始化a
const auto *ip = &a.dat;

cout << ip << " "; //指针指向a.dat的地址
Test b;
cout << &b.dat << endl; //输出b.dat的地址,和ip不一样
b = std::move(a); //移动操作符赋值
if (a.dat == nullptr)
cout << "a.dat指向空指针" << endl; //检查,确实用到了移动操作符
for (auto it : *b.dat)
cout << it << " ";
cout << endl;

cout << ip << " " << &b.dat << endl; //输出, b.dat的地址没变 !!!
if (ip != &b.dat)
cout << "1" << endl;

return 0;

}
运行结果:
0x6ffe34 0x6ffe2c
a.dat指向空指针
ef gh
0x6ffe34 0x6ffe2c
1

个人理解:移动运算符是将等号右边对象的成员直接送给左边。
可为什么b.dat的地址没变原,那移动运算符和拷贝运算符又有什么区别?不都是拷贝了指针吗,只不过多了一个指向空指针的操作,这又是如何实现“大幅度提高性能的”。。。

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2020-02-22 23:55
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 Oracle触发器记录修改前后的字段值
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器