面试题答案
一键面试- 常对象只能调用常成员函数的原因:
- 常对象的状态是不可修改的。非常量成员函数可能会修改对象的成员变量,这与常对象不可变的特性冲突。而常成员函数承诺不会修改对象的成员变量(除了
mutable
修饰的变量),所以常对象只能调用常成员函数,以确保对象状态的一致性和安全性。
- 常对象的状态是不可修改的。非常量成员函数可能会修改对象的成员变量,这与常对象不可变的特性冲突。而常成员函数承诺不会修改对象的成员变量(除了
- 常量引用指向对象时调用成员函数的规则:
- 当常量引用指向对象时,只能调用对象的常成员函数。因为常量引用意味着不能通过该引用修改对象的状态,所以调用非常量成员函数可能导致状态改变,不符合常量引用的特性。
- 示例代码:
#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
和一个常量成员函数getData
。constObj
是常对象,只能调用getData
;constRef
是常量引用,也只能调用getData
。而非常量对象obj
可以调用setData
来修改数据成员。