深拷贝
拷贝构造的深拷贝和重载赋值的深赋值算是理解了,C++编译器做了优化,临时对象作为函数的返回值后,并没有调用拷贝构造函数了,而是在外部对新的对象进行初始化。
#include <iostream>
using namespace std;
class HasPtrMem{
public:
HasPtrMem():_d(new int(0)){
cout<<"HasPtrMem()"<<this<<endl;
}
HasPtrMem(const HasPtrMem& another):_d(new int(*another._d)){
cout<<"HasPtrMem(const HasPtrMem& another)"<<this<<"->"<<&another<<endl;
}
~HasPtrMem(){
delete _d;
cout<<"~HasPtrMem()"<<this<<endl;
}
int *_d;
};
//编译器做了优化,直接将内部对象的创建和初始化移到外部;等同于return HasPtrMem()
HasPtrMem getObject(){
HasPtrMem D;
return D;
}
int main(int argc,char* argv[]){
HasPtrMem A;
HasPtrMem B(A);
cout<<*A._d<<endl;
cout<<*B._d<<endl;
HasPtrMem C=getObject();//HasPtrMem&& C=getObject();
cout<<&C<<endl;
cout<<*C._d<<endl;
return 0;
}
移动构造充分体现了右值引用的设计思想,移动构造通过对指针的赋值,在临时对象析构之前及时接管了临时对象在堆上地址空间,只要针对匿名对象或临时对象。
#include <iostream>
using namespace std;
class HasPtrMem{
public:
HasPtrMem():_d(new int(0)){
cout<<"HasPtrMem()"<<this<<endl;
}
HasPtrMem(const