MST

星途 面试题库

面试题:C++ 中const修饰成员函数的作用及原理

在C++中,const关键字可以用来修饰成员函数。请解释const修饰成员函数的作用是什么,并且说明编译器是如何保证这种特性的实现的。另外,一个const对象可以调用非const成员函数吗?为什么?
40.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. const修饰成员函数的作用
    • 保证对象状态不变:const修饰的成员函数承诺不会修改调用该函数的对象的成员变量(除非成员变量被声明为mutable)。这有助于维护对象的常量性,提高代码的安全性和可维护性。例如,对于一个表示只读数据的对象,通过将其成员函数声明为const,可以确保在调用这些函数时对象的状态不会被意外改变。
  2. 编译器保证这种特性的实现方式
    • 隐式传递this指针:在C++中,成员函数实际上有一个隐式的this指针参数,指向调用该函数的对象。当成员函数被声明为const时,this指针的类型实际上是const ClassName*,而不是普通的ClassName*。这意味着在const成员函数内部,不能通过this指针修改对象的成员变量(除非成员变量是mutable),因为this指针指向的是一个常量对象。如果试图在const成员函数中修改非mutable成员变量,编译器会报错。
  3. 一个const对象不可以调用非const成员函数
    • 原因:非const成员函数有可能修改对象的状态,而const对象代表其状态应该是不可变的。如果允许const对象调用非const成员函数,就会违背const对象的常量性原则。编译器会阻止这种调用,因为非const成员函数的this指针类型是普通的ClassName*,而const对象的this指针类型是const ClassName*,类型不匹配。例如:
class MyClass {
public:
    void nonConstFunction() {
        // 可以修改成员变量
    }
    void constFunction() const {
        // 不能修改非mutable成员变量
    }
};

int main() {
    const MyClass obj;
    // obj.nonConstFunction(); // 编译错误,const对象不能调用非const成员函数
    obj.constFunction(); // 合法,const对象可以调用const成员函数
    return 0;
}