C++ 对象型参数和返回值

1.对象型类型作为函数的参数

使用对象类型作为函数的参数或者返回值,可能会产生一些不必要的中间对象

  • 例子:
// 使用对象类型作为函数的参数
void test1(Car car) {

}

完整代码如下:

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()函数的时候,发现它调用了拷贝调用函数,也就是在这个过程中产生了一个新的中间变量
    在这里插入图片描述
    这样做是不好的,怎么去避免这个问题?

答:把外面的对象传给这个函数,就是希望这个函数里面可以访问到外面对象的一些属性,可以用引用或者指针来代替。

void test1(Car &car) {
}

输出:
在这里插入图片描述
没有调用拷贝构造函数

因此建议函数参数中不要使用对象型类型作为函数参数

2.对象型参数作为函数的返回值

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;
}
  • 这一次在函数里定义了一个对象,并且返回对象
// 对象型参数作为函数的返回值
Car test2() {
	Car car;
	return car;
}

输出结果会发现调用了两次构造函数,一次拷贝构造函数

在这里插入图片描述
首先就是创建对象时,调用了一次

Car car2; // Car()

然后就是在函数里创建对象,又调用了一次

Car test2() {
	Car car;
	return car;
}

第三次是函数的返回值返回来一个car对象,这个返回值赋给了 car2 对象,相当于一次浅拷贝

	car2 = test2();

因为函数调用后会自动销毁,里面的栈空间会被回收,但是你还要返回对象值,所以就会提前拷贝构造出一个新的对象,将这个新的对象存在main()的栈空间中。

所以最好不要以对象型类型为函数参数或为返回值,会产生很多不必要的中间变量

相关推荐

  1. 数组作为参数返回

    2024-05-09 14:02:01       7 阅读
  2. C/C++__VA_ARGS__学习--自动打印函数的参数返回

    2024-05-09 14:02:01       15 阅读
  3. 数学函数的参数返回探秘

    2024-05-09 14:02:01       32 阅读
  4. 【python】给函数参数返回标注类型

    2024-05-09 14:02:01       11 阅读
  5. C++返回返回引用、返回地址

    2024-05-09 14:02:01       36 阅读
  6. c++的传参数传引用参数

    2024-05-09 14:02:01       6 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-09 14:02:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-09 14:02:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-09 14:02:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-09 14:02:01       18 阅读

热门阅读

  1. 跨域问题解决方案

    2024-05-09 14:02:01       8 阅读
  2. wifi执法记录仪移植出现的问题

    2024-05-09 14:02:01       11 阅读
  3. 邮件服务器有什么作用?

    2024-05-09 14:02:01       9 阅读
  4. Tengine安装及负载均衡(带check实现)

    2024-05-09 14:02:01       12 阅读
  5. QT作业3

    QT作业3

    2024-05-09 14:02:01      10 阅读
  6. DAY 3

    DAY 3

    2024-05-09 14:02:01      9 阅读
  7. Spring 框架中用到的设计模式

    2024-05-09 14:02:01       11 阅读
  8. Vue3+Element+TS动态菜单+按钮权限控制实现探索

    2024-05-09 14:02:01       9 阅读
  9. vue从登陆注册开始

    2024-05-09 14:02:01       13 阅读
  10. 前端造轮子神器 —— Hooks

    2024-05-09 14:02:01       12 阅读
  11. C++基础-编程练习题和答案

    2024-05-09 14:02:01       13 阅读
  12. 不可逆加密算法、可逆加密算法

    2024-05-09 14:02:01       9 阅读