C++ 常函数、常对象
在C++中,常函数(也称为常量成员函数)和常对象是与对象的不可变性相关的两个概念。它们用于确保对象的状态在特定操作下不会被改变。
常函数(常量成员函数)
常函数是指通过const
关键字修饰的成员函数。这种函数保证不会修改其所属对象的任何成员变量(除非这些成员变量被声明为mutable
)。常函数可以在常量对象上被调用,这是非常有用的特性,因为它允许在不改变对象状态的情况下读取数据。
常函数的声明方式如下:
class MyClass {
public:
void myFunction() const; // 常函数
// ...
};
在常函数内部,不能修改类的任何非mutable
成员变量。尝试这样做将导致编译错误。
常对象
常对象是通过const
关键字修饰的对象。一旦对象被声明为常量,就不能再调用其任何非常量成员函数(即那些没有被声明为const
的成员函数)。这是因为非常量成员函数可能会修改对象的状态,而常对象的状态是不允许被修改的。
常对象的声明方式如下:
const MyClass myObject; // 常对象
或者,你也可以通过指针或引用来声明常对象:
const MyClass* myObjectPtr = &someOtherObject; // 指向常对象的指针
const MyClass& myObjectReference = someOtherObject; // 对常对象的引用
在这种情况下,你只能通过指针或引用调用常成员函数。
示例
下面是一个简单的示例,展示了常函数和常对象的使用:
#include <iostream>
class MyClass {
public:
MyClass(int value) : value_(value) {}
int getValue() const { // 常函数
return value_;
}
void setValue(int newValue) { // 非常量成员函数
value_ = newValue;
}
private:
int value_;
};
int main() {
const MyClass myConstObject(10); // 常对象
std::cout << "Value: " << myConstObject.getValue() << std::endl; // 可以调用常函数
// myConstObject.setValue(20); // 错误!不能调用非常量成员函数
MyClass myObject(5); // 非常量对象
std::cout << "Value: " << myObject.getValue() << std::endl; // 可以调用常函数
myObject.setValue(15); // 可以调用非常量成员函数
std::cout << "New Value: " << myObject.getValue() << std::endl;
return 0;
}
Value: 10
Value: 5
New Value: 15
在这个示例中,MyClass有一个常函数getValue(),它返回对象的值而不修改它。还有一个非常量成员函数setValue(),它用于设置对象的值。在main()函数中,我们创建了一个常对象myConstObject和一个非常量对象myObject。我们可以在常对象上调用常函数,但不能调用非常量成员函数。对于非常量对象,我们可以调用任何成员函数。