1.类禁用拷贝赋值 注意点
- 但是这样可以,原因:A a3 = a1;调用的是拷贝构造
struct A
{
A()
{
cout << "构造函数!" << endl;
}
A(const A&)
{
cout << "拷贝构造!" << endl;
}
A(const A&&)
{
cout << "移动构造!" << endl;
}
~A()
{
cout << "析构函数!" << endl;
}
A& operator = (const A&) = delete;
};
int main()
{
A a1;
A a2(move(a1));
A a3 = a1;
}
输出:
构造函数!
移动构造!
拷贝构造!
析构函数!
析构函数!
析构函数!
2.移动语义
struct A
{
A()
{
cout << "构造函数!" << endl;
}
A(const A&)
{
cout << "拷贝构造!" << endl;
}
A(const A&&)
{
cout << "移动构造!" << endl;
}
~A()
{
cout << "析构函数!" << endl;
}
A& operator = (const A&)
{
cout << "拷贝赋值!" << endl;
return *this;
}
int a = 1;
};
int main()
{
{
A a1;
A a3(a1);
{
A&& a2(move(a1));
cout << a2.a << endl;
a3 = a2;
}
cout << a1.a << endl;
}
cout << "----------------------------分隔符--------------------------------" << endl;
int&& rRef1 = 2;
std::cout << rRef1 << std::endl;
int val = 8;
int&& rRef2 = std::move(val); //使用std::move将左值所有权转移到右值,但并不改变原变量的所有权
{
std::cout << rRef2 << std::endl;
std::cout << val << std::endl;
}
std::cout << val << std::endl;
std::cout << rRef2 << std::endl;
}
输出:
构造函数!
拷贝构造!
1
拷贝赋值!
1
析构函数!
析构函数!
----------------------------分隔符--------------------------------
2
8
8
8
8