对象作为函数的参数或者作为返回值可能会产生中间对象

代码示例:

class Car {
	int m_price;
public:
	Car(int price = 0) :m_price(price) { 
		cout << "Car(int) - " << this << " - " << this->m_price << endl;
	}
    // 拷贝构造函数
	Car(const Car &car) :m_price(car.m_price) {
		cout << "Car(const Car &) - " << this << " - " << this->m_price << endl;
	}
};

对象作为函数的参数

// 相当于 Car car = car
void test1(Car car) {

}

如果外界调用,会调用拷贝构造函数,生成另外一个对象

Car car1(10);
test1(car1);

对象作为参数应该使用引用

void test1(Car &car) {

}

如果希望只是访问这个对象的值,而不能修改这个对象可以使用const修饰

void test1(const Car &car) {

}

对象作为返回值需要注意:

Car test2() {
	Car car(10);
	return car;
}
// 使用test2()函数,拷贝构造函数(编译器做了优化,只调用了一次拷贝构造函数)
Car car2 = test2();

// 这里调用一次构造函数
Car car3;
//test2()这里会调用一次构造函数,一次拷贝构造函数
car3 = test2();