MST

星途 面试题库

面试题:C++ 中引用与指针在函数参数传递上的区别

在 C++ 中,函数参数传递时使用引用和指针各有什么特点?请分别举例说明在何种场景下应优先选择引用传递,何种场景下应优先选择指针传递。
38.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

引用传递特点

  1. 语法简洁:使用引用传递参数时,函数调用和定义都无需显式使用解引用操作符(*),代码更简洁直观。例如:
void swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}
int main() {
    int x = 5, y = 10;
    swap(x, y);
    return 0;
}
  1. 不能为空:引用必须在定义时初始化,且初始化后不能再指向其他对象,所以在函数调用时可确保引用指向有效的对象,减少空指针相关错误。
  2. 语义清晰:传递引用表示函数操作的是实参本身,从语义上明确了函数对实参有直接修改的意图。

优先选择引用传递的场景

  • 修改实参值:当函数需要修改传入的参数值时,引用传递能使代码简洁且语义清晰,如上述swap函数。
  • 避免对象拷贝:对于较大的对象,使用引用传递可避免对象拷贝带来的性能开销。例如:
class BigObject {
    // 假设这里有大量成员变量和复杂构造析构函数
};
void processObject(BigObject& obj) {
    // 处理对象
}

指针传递特点

  1. 灵活性高:指针可以在运行时改变指向,这使得函数能够根据不同条件操作不同对象。例如:
void printValue(int* ptr) {
    if (ptr) {
        std::cout << *ptr << std::endl;
    }
}
int main() {
    int x = 10;
    int* ptr = &x;
    printValue(ptr);
    ptr = nullptr;
    printValue(ptr);
    return 0;
}
  1. 可表示空值:指针可以为空(nullptr),这在某些情况下很有用,例如函数可能接收一个可选的参数,当不需要这个参数时可传入nullptr
  2. 数组传递:在 C++ 中,数组作为函数参数传递时,实际传递的是指向数组首元素的指针,这便于对数组进行操作。例如:
void printArray(int* arr, int size) {
    for (int i = 0; i < size; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
}
int main() {
    int arr[] = {1, 2, 3, 4, 5};
    printArray(arr, 5);
    return 0;
}

优先选择指针传递的场景

  • 动态内存管理:当函数需要处理动态分配的内存时,指针更为合适,因为指针操作更符合动态内存分配和释放的机制。例如:
void deleteObject(int*& ptr) {
    delete ptr;
    ptr = nullptr;
}
int main() {
    int* obj = new int(10);
    deleteObject(obj);
    return 0;
}
  • 可选参数:当函数参数是可选的时候,使用指针可以通过传入nullptr来表示该参数不使用。例如:
void processOptional(int* data) {
    if (data) {
        // 处理数据
    }
}
int main() {
    int x = 10;
    processOptional(&x);
    processOptional(nullptr);
    return 0;
}