1 动态构造的返回值是一个 指针类型
动态构造是在函数运行过程中分配内存,返回指针。
int* ptr;
ptr = new int(x);
Point* points;
points = new Point[x];
2 移动构造函数
见注释
&&是右值引用,即将消亡的值是右值:函数返回的值就是一种右值,函数以值传递的方式返回对象时就会调用移动构造函数。
而&普通引用可以绑定右值
移动构造不发生内存分配,简而言之就是已有对象的资源通过“指针对指针初始化的方式”转移给新对象,效率更高。
#include <iostream>
using namespace std;
class IntNum {
public:
IntNum(int x = 0) : ptr(new int(x)) { //构造函数,动态分配内存构造int类型的变量x,返回指针用以初始化ptr
cout << "调用构造函数" << endl;
}
IntNum(const IntNum & n) : ptr(new int(*n.ptr)) {
//深层复制,重新构造一个int对象吗,其初始值是参数n的ptr指针所指向的对象值,所以新的int对象与参数n的int对象的值是相等的,用新int对象的指针初始化当前对象的ptr
cout << "调用复制构造函数" << endl;
}
IntNum(IntNum && n) : ptr(n.ptr) { // &&表示右值引用
n.ptr = nullptr; //参数n的ptr指针指向空指针
cout << "调用了移动构造函数" << endl;
}
~IntNum() {
delete ptr;
cout << "调用了析构函数" << endl;
}
int return_ptr() {
return *ptr;
}
private:
int* ptr;
};
IntNum return_temporary(){
IntNum a;
return a;
}
int main()
{
cout << return_temporary().return_ptr() << endl;
return 0;
}