对象作为函数的参数或者作为返回值可能会产生中间对象
代码示例:
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();