11右值引用下的移动构造(132)

先看代码++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class HasPem {
public:
HasPem() : d(new int(3)) { cout << "construct:" << ++n_cstr << endl; }
HasPem(const HasPem& h) : d(new int(*h.d)){ cout << "copy construct:" << ++n_cptr << endl; }
HasPem(HasPem&& h) :d(h.d){ h.d = nullptr; cout << "move construct:" << ++n_mvtr << endl; }
HasPem& operator=(const HasPem& h) { d = h.d; delete h.d; cout << "deque construct:" << ++n_mvtr << endl; return *this; }
~HasPem() {
delete d;
cout << "destruct:" << ++n_dstr << endl;
}
int* d;
static int n_cstr;
static int n_dstr;
static int n_cptr;
static int n_mvtr;
};
int HasPem::n_cstr = 0;
int HasPem::n_dstr = 0;
int HasPem::n_cptr = 0;
int HasPem::n_mvtr = 0;
HasPem getemp() {
HasPem h;
cout << "resource form" << endl;
return h;
}
int _tmain(int argc, _TCHAR* argv[])
{
HasPem d = getemp();
system("pause");
return 0;
}

先说下自己的错误

居然会忘:

HasPem d;HasPem p = d;//这个调用的是复制函数;
HasPem d; HasPem p; d=p;//这个才是调用的赋值函数;
//也就是只要跟类初始化没关的才走赋值,其他就复制。

再说下移动函数

首先,移动构造函数是基于右值引用。
第一它是为了操作临时变量,(98里面,函数结束会对临时变量内存释放)。第二当出现减少复制函数带来的多余内存开辟。(当然如果用指针new就可以解决,但是对象可以自己释放内存)

然后,复制函数为了安全等考虑一般会开辟内存的复制。

当程序猿希望在复制的时候能走节约内存的移动函数路线时,就可以用std::move

Moveable a; Moveable c(std::move(a));//这样c就完全是走a的移动路线得到的。
//但是依旧有内存问题,那就是a的成员改变,生命周期内的调用。
// //