#include"pch.h"
#include<iostream>
using namespace std;
class A
{
public:
A(int _X, int *_P) :x(_X),p(new int(*_P)) { cout << "构造函数" << endl; };
A(const A &a)
{
if (this == &a)
{
cout << "左值——拷贝构造函数" << endl;
*this = a;
}
else
{
x = a.x;
delete p;
p = new int(*a.p);
cout << "左值——拷贝构造函数" << endl;
}
}
A &operator=(const A &a)
{
if (this == &a)
{
cout << "自己赋值给自己" << endl;
return *this;
}
else
{
cout << "左值——赋值函数" << endl;
x = a.x;
*p = *a.p;//赋值的精髓——在于只赋值内容,不赋值指针;因为赋值的前提:是两个对象都已建立
return *this;
}
}
A(A &&a) //移动拷贝构造函数
{
x = a.x;
delete p;移动拷贝构造函数,
p = a.p;
a.p = nullptr;
cout << "右值——拷贝构造函数" << endl;
}
A &operator=(A &&a)//移动赋值函数
{
if (this == &a)
{
cout << "自己赋值给自己" << endl;
return *this;
}
else
{
cout << "右值——赋值函数" << endl;
x = a.x;
delete p;
p = a.p;
a.p = nullptr;
return *this;
}
}
~A()
{
delete p;
cout << "析构函数" << endl;
}
void show()
{
cout << "x=" << x << endl;
cout << "*p=" << *p << endl;
cout << "————————" << endl;
}
private:
int x;
int *p;
};
void show_1(A &&a)
{
a.show();
}
void show_1(A &a)
{
a.show();
}
int g= 3;
int main()
{
int x = 2;
int y = 111;
A a(10,&x);
A b(60,&y);
A c = a; //调用普通拷贝构造函数
A e(b); //调用普通拷贝构造函数
c = c; //调用左值赋值函数
A d = std::move(a); //调用移动拷贝构造函数
//移动拷贝构造函数,将a转移到d之后,对象a就失效了,这也是和普通的拷贝构造函数的区别;;
c = std::move(b); //调用移动赋值函数
cout << "————————————" << endl;
//a.show();//这句会报错,因为
//b.show();
c.show();
show_1(std::move(a));
show_1(std::move(b));
show_1(std::move(c));
show_1(c);
//show_1(std::move(d));
}
移动拷贝构造函数和移动赋值函数的写法
最新推荐文章于 2023-03-26 15:40:24 发布