MST

星途 面试题库

面试题:C++ 中常引用在函数参数传递中的应用场景

请举例说明在 C++ 函数参数传递时,使用常引用相比于值传递和普通引用的优势,并详细解释为何在某些场景下常引用是最佳选择。
34.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 值传递
    • 示例
#include <iostream>
void func1(int num) {
    num = num * 2;
    std::cout << "Inside func1, num: " << num << std::endl;
}
int main() {
    int num = 5;
    func1(num);
    std::cout << "In main, num: " << num << std::endl;
    return 0;
}
- **问题**:值传递会在函数调用时创建参数的副本,对于大型对象,这会消耗大量的时间和内存。比如若传递一个大的结构体或类对象,复制操作开销大。

2. 普通引用传递 - 示例

#include <iostream>
void func2(int& num) {
    num = num * 2;
    std::cout << "Inside func2, num: " << num << std::endl;
}
int main() {
    int num = 5;
    func2(num);
    std::cout << "In main, num: " << num << std::endl;
    return 0;
}
- **问题**:普通引用传递允许函数修改传入的实参,这在某些不需要修改实参的场景下可能会带来意外修改的风险。

3. 常引用传递 - 示例

#include <iostream>
void func3(const int& num) {
    // num = num * 2;  // 编译错误,不能修改常引用
    std::cout << "Inside func3, num: " << num << std::endl;
}
int main() {
    int num = 5;
    func3(num);
    std::cout << "In main, num: " << num << std::endl;
    return 0;
}
- **优势及最佳场景**:
    - **避免拷贝开销**:和普通引用一样,常引用传递不会创建对象的副本,对于大型对象,这大大提高了效率。比如传递一个大的 `std::string` 或自定义的大型类对象时,避免了值传递的拷贝开销。
    - **保护实参**:常引用保证函数内部不会修改传入的实参,明确了函数对参数的只读意图,增强了代码的安全性和可维护性。在函数仅需要读取参数值的场景下,常引用是最佳选择,既能提高效率又能防止意外修改实参。