当一个函数以对象为参数传递时,传递的是对象的副本或引用。下面分别讨论这两种情况:
1. 传递对象的副本: 如果函数接受的是对象的副本(通过值传递),在函数结束时,传递的副本的析构函数会被调用。这是因为传递的是实际对象的拷贝,函数执行完毕后,该拷贝会被销毁。
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "Constructor called." << std::endl;
}
~MyClass() {
std::cout << "Destructor called." << std::endl;
}
};
void myFunction(MyClass obj) {
// 函数接受对象的副本,函数结束时 obj 的析构函数被调用
}
int main() {
MyClass originalObj;
myFunction(originalObj);
return 0;
}
2. 传递对象的引用: 如果函数接受的是对象的引用,即通过引用传递,那么在函数结束时,被引用的原始对象的析构函数不会被调用。因为引用本身并不拥有对象的所有权,它只是对象的别名。
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "Constructor called." << std::endl;
}
~MyClass() {
std::cout << "Destructor called." << std::endl;
}
};
void myFunction(MyClass& objRef) {
// 函数接受对象的引用,函数结束时原始对象的析构函数不会被调用
}
int main() {
MyClass originalObj;
myFunction(originalObj);
return 0;
}
总体而言,如果通过值传递对象,会调用对象的复制构造函数和析构函数,而通过引用传递对象,仅调用复制构造函数。在后者的情况下,被引用的原始对象在函数结束时并不会被销毁。