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()函数的时候,发现它调用了拷贝调用函数,也就是在这个过程中产生了一个
    C++ 对象型参数和返回值-LMLPHP
    这样做是不好的,怎么去避免这个问题?
void test1(Car &car) {
}

输出:
C++ 对象型参数和返回值-LMLPHP
没有调用拷贝构造函数

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;
}

输出结果会发现调用了

C++ 对象型参数和返回值-LMLPHP
首先就是创建对象时,调用了一次

Car car2; // Car()

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

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

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

	car2 = test2();
05-09 14:32