对象型参数和返回值
1.对象型类型作为函数的参数
使用对象类型作为函数的参数或者返回值,可能会产生一些不必要的中间对象
- 例子:
cpp
// 使用对象类型作为函数的参数
void test1(Car car) {
}
完整代码如下:
cpp
class Car {
public:
Car() {
cout << "Car() - " << this << endl;
}
Car(const Car &car) {
cout << "Car(const Car &) - " << this << endl;
}
~Car() {
cout << "~Car() - " << this << endl;
}
void run() {
cout << "run()" << endl;
}
};
// 使用对象类型作为函数的参数
void test1(Car car) {
}
Car test2() {
return Car();
}
int main() {
Car car1; // Car()
test1(car1);
getchar();
return 0;
}
- 输出:
可以看到调用了构造函数,析构函数;
另外还可以看到程序还调用了一个拷贝调用函数
也就是car1对象传给test()函数的时候,发现它调用了拷贝调用函数,也就是在这个过程中产生了一个新的中间变量
这样做是不好的,怎么去避免这个问题?
答:把外面的对象传给这个函数,就是希望这个函数里面可以访问到外面对象的一些属性,可以用引用或者指针来代替。
cpp
void test1(Car &car) {
}
输出:
没有调用拷贝构造函数
因此建议函数参数中不要使用对象型类型作为函数参数
2.对象型参数作为函数的返回值
cpp
class Car {
public:
Car() {
cout << "Car() - " << this << endl;
}
Car(const Car &car) {
cout << "Car(const Car &) - " << this << endl;
}
~Car() {
cout << "~Car() - " << this << endl;
}
void run() {
cout << "run()" << endl;
}
};
// 对象型参数作为函数的返回值
Car test2() {
Car car;
return Car();
}
int main() {
Car car2; // Car()
car2 = test2();
getchar();
return 0;
}
- 这一次在函数里定义了一个对象,并且返回对象
cpp
// 对象型参数作为函数的返回值
Car test2() {
Car car;
return car;
}
输出结果会发现调用了两次构造函数,一次拷贝构造函数
首先就是创建对象时,调用了一次
cpp
Car car2; // Car()
然后就是在函数里创建对象,又调用了一次
cpp
Car test2() {
Car car;
return car;
}
第三次是函数的返回值返回来一个car对象,这个返回值赋给了 car2 对象,相当于一次浅拷贝
cpp
car2 = test2();
因为函数调用后会自动销毁,里面的栈空间会被回收,但是你还要返回对象值,所以就会提前拷贝构造出一个新的对象,将这个新的对象存在main()的栈空间中。
所以最好不要以对象型类型为函数参数或为返回值,会产生很多不必要的中间变量