MST

星途 面试题库

面试题:C++ 按常量引用传递下的函数重载与常量性

假设有如下C++ 代码: ```cpp class MyClass { public: int data; MyClass(int d) : data(d) {} }; void process(const MyClass& obj) { // 函数体1 } void process(MyClass& obj) { // 函数体2 } int main() { const MyClass cobj(10); MyClass obj(20); process(cobj); process(obj); return 0; } ``` 请解释为什么这段代码能够通过编译,并且说明 `process` 函数的两个重载版本分别在什么情况下会被调用,重点阐述按常量引用传递在函数重载解析中的作用。
16.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 代码通过编译的原因

    • C++ 允许函数重载,即同一作用域内的多个函数可以具有相同的名字,但形参列表不同。在上述代码中,process 函数有两个重载版本,一个接受 const MyClass& 类型的参数,另一个接受 MyClass& 类型的参数。
    • 当调用 process 函数时,编译器会根据实参的类型来选择合适的重载版本。
  2. process 函数两个重载版本的调用情况

    • void process(const MyClass& obj) 的调用情况
      • 当实参是 const MyClass 类型的对象,如 const MyClass cobj(10); process(cobj); 时,会调用这个版本。因为 cobj 是常量对象,只能绑定到 const 引用。
    • void process(MyClass& obj) 的调用情况
      • 当实参是 MyClass 类型的非常量对象,如 MyClass obj(20); process(obj); 时,会调用这个版本。非常量对象既可以绑定到 const 引用,也可以绑定到非 const 引用,但编译器会优先选择最匹配的版本,即非 const 引用版本。
  3. 按常量引用传递在函数重载解析中的作用

    • 区分常量和非常量对象的处理:通过提供接受 const 引用和非 const 引用的重载函数,可以对常量对象和非常量对象进行不同的处理。这在实际应用中很有用,例如,对于常量对象可能只进行读取操作,而对于非常量对象可能会进行修改操作。
    • 保持对象的常量性:当函数接受 const 引用时,函数内部不能修改对象的成员变量(除非成员变量被声明为 mutable)。这有助于保证对象的常量性,使得代码更加安全和可维护。同时,这也使得编译器能够更准确地进行类型检查和函数重载解析,提高代码的可靠性。