面试题答案
一键面试潜在问题
- 无法修改对象状态:如果函数内部需要修改
BigClass
对象的状态,但由于是常引用传递,会导致编译错误。 - 对象生命周期管理:若
BigClass
对象在传递前是通过动态分配内存创建的,函数调用结束后,对象的释放可能出现问题。
解决方法
- 可修改性问题:若函数需要修改对象,不使用常引用传递。
- 生命周期管理:确保对象的内存管理在合适的地方进行,比如使用智能指针管理动态分配的
BigClass
对象。
代码示例
#include <iostream>
#include <memory>
class BigClass {
public:
int data;
BigClass(int value) : data(value) {}
void modifyData(int newData) {
data = newData;
}
};
// 函数接受非常引用,可以修改对象
void modifyBigClass(BigClass& obj, int newData) {
obj.modifyData(newData);
}
int main() {
// 使用智能指针管理 BigClass 对象
std::unique_ptr<BigClass> bigObj = std::make_unique<BigClass>(10);
std::cout << "Before modification: " << bigObj->data << std::endl;
modifyBigClass(*bigObj, 20);
std::cout << "After modification: " << bigObj->data << std::endl;
return 0;
}
在上述代码中,modifyBigClass
函数接受 BigClass
对象的非常引用,从而可以修改对象的状态。同时,使用 std::unique_ptr
管理 BigClass
对象的生命周期,避免了内存管理问题。