MST

星途 面试题库

面试题:C++ 中const与指针、引用的复杂结合

请分析以下代码片段中const的作用,并说明每个变量的可修改性: ```cpp int num = 10; const int* ptr1 = # int* const ptr2 = # const int* const ptr3 = # const int& ref1 = num; int& const ref2 = num; // 这行代码是否正确,为什么? ``` 同时,请解释在函数参数传递中,使用const指针和const引用作为参数有什么好处和区别。
28.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 分析代码片段中const的作用及变量可修改性

    • int num = 10;:定义一个普通的int类型变量num,其值可以修改。
    • const int* ptr1 = #
      • const的作用:修饰指针所指向的对象,即指针ptr1指向的int类型对象是常量。
      • 可修改性:num本身的值可以修改(因为它定义时不是const),ptr1可以指向其他int类型变量,但不能通过ptr1修改其所指向的值。例如*ptr1 = 20;会报错。
    • int* const ptr2 = #
      • const的作用:修饰指针本身,即指针ptr2是常量。
      • 可修改性:ptr2不能再指向其他int类型变量,但可以通过ptr2修改num的值。例如*ptr2 = 30;是合法的,而ptr2 = &anotherNum;会报错。
    • const int* const ptr3 = #
      • const的作用:第一个const修饰指针所指向的对象,第二个const修饰指针本身。
      • 可修改性:ptr3不能再指向其他int类型变量,也不能通过ptr3修改其所指向的值。
    • const int& ref1 = num;
      • const的作用:修饰引用所绑定的对象,即引用ref1绑定的int类型对象是常量。
      • 可修改性:不能通过ref1修改num的值,但num本身的值可以修改(因为它定义时不是const)。例如ref1 = 40;会报错。
    • int& const ref2 = num;
      • 这行代码不正确。原因是引用本身一经初始化就不能再绑定到其他对象,所以不需要用const修饰引用本身。const修饰引用通常是修饰引用所绑定的对象,即const int& ref = num;这种形式。
  2. 在函数参数传递中,使用const指针和const引用作为参数的好处和区别

    • 好处
      • 保护数据:使用const指针和const引用作为参数,可以防止函数内部意外修改传入的参数值,保护了调用者的数据。
      • 提高效率:对于较大的对象,通过引用或指针传递可以避免对象的拷贝,提高函数调用效率。使用const修饰可以明确告知调用者函数不会修改传入的对象。
    • 区别
      • 语法和语义:指针可以为空,而引用必须在初始化时绑定到一个对象,并且之后不能再绑定到其他对象。const指针可以重新指向其他对象(如果指针本身不是const),而const引用一旦绑定就无法改变绑定对象。
      • 使用场景:如果需要表示一个可能为空的对象引用,指针更合适;如果确定引用会始终绑定到一个有效的对象,并且不需要重新绑定,引用更简洁且使用起来更安全(因为不存在空引用)。在函数参数传递中,如果参数可能为nullptr,使用const指针;如果参数肯定是有效的对象,使用const引用更自然。