在C++中,常数据成员(constant data members)和常成员函数(const member functions)是两种用于提高程序安全性和清晰性的特性。它们各自有不同的用途和限制。
常数据成员
首先,需要明确的是,C++标准并不直接支持在类中声明常数据成员(即,在类定义中直接声明为const的数据成员)。这是因为常数据成员的值必须在构造函数初始化列表中设置,而在类的定义中无法提供这样的初始化。
然而,你可以通过以下几种方式在类中实现类似常数据成员的效果:
使用静态常数据成员:静态常数据成员可以在类定义外部初始化,并且对所有对象共享。
class MyClass {
public:
static const int MAX_SIZE; // 声明
};
const int MyClass::MAX_SIZE = 100; // 定义和初始化
在构造函数初始化列表中初始化非静态成员:虽然你不能直接在类定义中声明常数据成员为const,但你可以在构造函数中通过初始化列表来“模拟”这种行为。
class MyClass {
private:
const int value; // 注意:这里只是声明,没有初始化
public:
MyClass(int v) : value(v) {} // 在初始化列表中初始化
};
常成员函数
常成员函数是可以在不修改对象任何成员(静态成员除外)的情况下被调用的成员函数。它们在函数声明时在函数参数列表的末尾加上const关键字来指定。
class MyClass {
private:
int value;
public:
void setValue(int v) {
value = v; // 修改成员
}
int getValue() const { // 常成员函数
return value; // 只读取成员,不修改
}
};
在常成员函数中,你不能修改任何非静态成员变量的值(除非这些成员变量也被声明为mutable)。此外,常成员函数可以被常对象、通过常引用或常指针访问的对象调用。
const MyClass obj(10);
std::cout << obj.getValue(); // 可以调用常成员函数
// obj.setValue(20); // 错误:不能通过常对象调用非常成员函数
总结:
- 常数据成员:虽然C++标准不允许直接在类定义中声明常数据成员,但你可以通过静态- 常数据成员或在构造函数初始化列表中初始化非静态成员来模拟这种行为。
- 常成员函数:通过在函数声明后添加const关键字来声明,表示该函数不会修改对象的任何成员(静态成员除外)。常成员函数可以被常对象、通过常引用或常指针访问的对象调用。