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