当没有移动构造函数时,调用复制构造函数:
#include <iostream>
using namespace std;
class IntNum {
public:
IntNum(int x=0) :p(new int(x))
{
cout << "调用默认参数构造函数"<<endl;
}
IntNum( const IntNum &v):p(new int(*v.p))
{
cout << "调用复制构造函数" << endl;
}
//也就是申请空间再拷贝数据IntNum(const IntNum &v) :p(new int()) { *p = *v.p; cout << "调用复制构造函数" << endl; }
/*IntNum(IntNum &&v) :p(v.p)
{
v.p = nullptr;
cout << "调用移动构造函数" << endl;
}*/
~IntNum()
{
delete p;
cout << "调用析构函数" << endl;
}
int getInt() { return *p; }
private:
int *p;
};
IntNum getNum()
{
IntNum a;
return a;
}
int main()
{
cout << getNum().getInt() << endl;
return 0;
}
运行结果:
调用默认参数构造函数
调用复制构造函数
调用析构函数
0
调用析构函数
请按任意键继续. . .
移动构造和复制构造函数都有,会调用移动构造
#include <iostream>
using namespace std;
class IntNum {
public:
IntNum(int x=0) :p(new int(x))
{
cout << "调用默认参数构造函数"<<endl;
}
IntNum( const IntNum &v):p(new int(*v.p))
{
cout << "调用复制构造函数" << endl;
}
//也就是申请空间再拷贝数据IntNum(const IntNum &v) :p(new int()) { *p = *v.p; cout << "调用复制构造函数" << endl; }
IntNum(IntNum &&v) :p(v.p)
{
v.p = nullptr;
cout << "调用移动构造函数" << endl;
}
~IntNum()
{
delete p;
cout << "调用析构函数" << endl;
}
int getInt() { return *p; }
private:
int *p;
};
IntNum getNum()
{
IntNum a;
return a;
}
int main()
{
cout << getNum().getInt() << endl;
return 0;
}
运行结果:
调用默认参数构造函数
调用移动构造函数
调用析构函数
0
调用析构函数
请按任意键继续. . .
比较:
IntNum( const IntNum &v):p(new int)//再动态分配一个空间给新的指针
{ p=*v.p//将旧的内容拷贝到新指针指向的空间,深层拷贝
cout << "调用复制构造函数" << endl;
}
IntNum(IntNum &&v) :p(v.p)//转移指针
{
v.p = nullptr; //将原来的指针设置为空指针
cout << "调用移动构造函数" << endl;
}
当需要利用会消亡、临时的资源时,采用移动构造效率高,因为移动构造不需要再动态分配内存