面试题答案
一键面试- 优势:
- 避免不必要的拷贝:值传递会对传入的参数进行拷贝,对于复杂对象(如大型结构体、类对象等),拷贝操作可能会消耗大量的时间和内存。而常引用传递不会进行拷贝,直接引用原对象,提高了效率。
- 可接受临时对象:可以接受临时对象作为参数,而值传递通常不可以(除非是右值引用相关的优化等特殊情况)。常引用可以绑定到临时对象,这样在函数调用时更加灵活。
- 举例说明:
#include <iostream>
#include <string>
class BigObject {
public:
BigObject() {
std::cout << "BigObject constructor" << std::endl;
}
BigObject(const BigObject& other) {
std::cout << "BigObject copy constructor" << std::endl;
}
~BigObject() {
std::cout << "BigObject destructor" << std::endl;
}
};
void funcByValue(BigObject obj) {
std::cout << "funcByValue" << std::endl;
}
void funcByConstRef(const BigObject& obj) {
std::cout << "funcByConstRef" << std::endl;
}
int main() {
BigObject obj;
std::cout << "Call funcByValue:" << std::endl;
funcByValue(obj);
std::cout << "Call funcByConstRef:" << std::endl;
funcByConstRef(obj);
std::cout << "Call funcByConstRef with temporary object:" << std::endl;
funcByConstRef(BigObject());
return 0;
}
在上述代码中,funcByValue
采用值传递,每次调用会触发 BigObject
的拷贝构造函数。而 funcByConstRef
采用常引用传递,不会触发拷贝构造函数,并且还能接受临时对象 BigObject()
。
3. 原理:
- 值传递:函数调用时,实参的值被复制到形参中,形参是实参的一个副本。对于复杂对象,拷贝构造函数会被调用,这涉及到内存分配和数据复制等操作,开销较大。
- 常引用传递:引用本质上是对象的别名,常引用传递时,函数形参是实参的别名,它们共享同一块内存地址,不进行数据拷贝。加上
const
修饰,确保函数内部不会修改传入的对象,保证了数据的安全性。所以常引用传递既提高了效率,又保证了对象的只读访问。