初学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的地址没变原,那移动运算符和拷贝运算符又有什么区别?不都是拷贝了指针吗,只不过多了一个指向空指针的操作,这又是如何实现“大幅度提高性能的”。。。

https://blog.csdn.net/douzhq/article/details/89483947