MST

星途 面试题库

面试题:C++ 常对象、常量引用与成员函数的相互关系

在 C++ 类中,常对象只能调用常成员函数。请解释为什么会有这样的限制?如果一个类中有非常量成员函数和常量成员函数,在常量引用指向对象时,调用成员函数的规则是什么?请编写一个包含常对象、常量引用以及不同类型成员函数的类,并展示其调用关系。
21.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 常对象只能调用常成员函数的原因
    • 常对象的状态是不可修改的。非常量成员函数可能会修改对象的成员变量,这与常对象不可变的特性冲突。而常成员函数承诺不会修改对象的成员变量(除了mutable修饰的变量),所以常对象只能调用常成员函数,以确保对象状态的一致性和安全性。
  2. 常量引用指向对象时调用成员函数的规则
    • 当常量引用指向对象时,只能调用对象的常成员函数。因为常量引用意味着不能通过该引用修改对象的状态,所以调用非常量成员函数可能导致状态改变,不符合常量引用的特性。
  3. 示例代码
#include <iostream>

class MyClass {
private:
    int data;
public:
    MyClass(int value) : data(value) {}
    // 非常量成员函数
    void setData(int value) {
        data = value;
    }
    // 常量成员函数
    int getData() const {
        return data;
    }
};

int main() {
    MyClass obj(10);
    const MyClass& constRef = obj;
    // 常对象调用常成员函数
    const MyClass constObj(20);
    std::cout << "常对象调用常成员函数: " << constObj.getData() << std::endl;
    // 常量引用调用常成员函数
    std::cout << "常量引用调用常成员函数: " << constRef.getData() << std::endl;
    // 以下代码会报错,因为常量引用不能调用非常量成员函数
    // constRef.setData(30);
    // 非常量对象可以调用非常量成员函数
    obj.setData(30);
    std::cout << "非常量对象调用非常量成员函数后: " << obj.getData() << std::endl;
    return 0;
}

在上述代码中,MyClass类包含一个非常量成员函数setData和一个常量成员函数getDataconstObj是常对象,只能调用getDataconstRef是常量引用,也只能调用getData。而非常量对象obj可以调用setData来修改数据成员。