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

对象型参数和返回值

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()的栈空间中。

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

相关推荐
sTone873751 小时前
QuickJS 的核心概念和核心 API
前端·c++
Forward♞1 小时前
Qt——实现”Hello World“、认识对象树与Qt坐标系
开发语言·qt
草莓熊Lotso1 小时前
《吃透 C++ 类和对象(中):拷贝构造函数与赋值运算符重载深度解析》
开发语言·c++·经验分享·笔记·其他
楚Y6同学1 小时前
QT之键盘控制虚拟遥控系统开发总结
开发语言·c++·qt·串口通信
一百天成为python专家2 小时前
OpenCV图像平滑处理方法详解
开发语言·人工智能·python·opencv·机器学习·支持向量机·计算机视觉
软测进阶2 小时前
【Python】Python 函数基本介绍(详细版)
开发语言·python
啊阿狸不会拉杆2 小时前
《算法导论》第 22 章 - 基本的图算法
c++·算法·排序算法·图论·拓扑学
freed_Day2 小时前
Java进阶学习之Stream流的基本概念以及使用技巧
java·开发语言·学习
java1234_小锋2 小时前
一周学会Matplotlib3 Python 数据可视化-绘制散点图(Scatter)
开发语言·python·信息可视化·matplotlib·matplotlib3
Warren983 小时前
Java后端面试题(含Dubbo、MQ、分布式、并发、算法)
java·开发语言·分布式·学习·算法·mybatis·dubbo