在C++中,函数的返回值是自定义类型的情况主要分为两种,一种是非引用类型的自定义类;另一种是引用类型的自定义类。
1 返回值是自定义类的非引用类型
在这种情况下,使用该类拷贝构造函数,根据返回值来创建该类的新的对象。
class Person {
Person(int age) {//构造函数
cout << "param constructor!" << endl;
mAge = age;
}
public:
Person(const Person& person) { //拷贝构造函数
mAge = person.mAge;
}
public:
int mAge;
};
Person MyFunc() {//返回值为非引用自定义类的函数
Person q(10);
return q;
}
此时,使用如下代码调用MyFunc()函数
Person p = MyFunc();
在MyFunc()函数返回了Person类的变量q之后,会调用Person的拷贝构造函数,将q的值拷贝给p。需要注意的是,以上代码并没有调用Person类的赋值表达式。即使不处理MyFunc()函数的返回值,直接调用MyFunc()函数
MyFunc();
此时依然会调用Person的拷贝构造函数,只是此时使用Person的拷贝构造函数将q的值拷贝给一个临时变量。
2 返回值是自定义类的引用类型
当函数的返回值是自定义类的引用类型时
Person& MyFunc() {//返回值为引用自定义类的函数
Person q(10);
return q;
}
如果不对MyFunc()函数的返回值进行处理,
MyFunc();
此时,不会调用Person类的拷贝构造函数。而将对MyFunc()函数的返回值赋值给其它对象,
Person p = MyBusiness();
此时依然会调用Person类的拷贝构造函数。