1. 成员函数的 const
限定符
当在类的成员函数声明或定义中使用 const
时,表示该成员函数不会修改对象的状态(即不会修改对象的非静态数据成员)。
示例
class MyClass {
public:void nonConstMethod(); // 非 const 成员函数void constMethod() const; // const 成员函数
};void MyClass::nonConstMethod() {// 可以修改对象的状态someData = 10;
}void MyClass::constMethod() const {// 不能修改对象的状态// someData = 10; // 编译错误
}private:int someData;
};
2. 函数返回值的 const
限定符
当函数返回一个 const
类型的值时,表示该返回值不能被修改。
示例
class MyClass {
public:const int getData() const {return data;}
private:int data;
};
在这个例子中,getData
函数返回一个 const int
,这意味着调用者不能修改返回的值。
即使成员函数被声明为 const
,如果该函数返回一个非 const
引用,调用者仍然可以通过返回的引用修改对象的状态。这是因为 const
限定符只限制了函数内部的行为,而不影响返回值的性质。
- const 成员函数:
int& funci() const
声明为const
成员函数,表示该函数不会修改对象的状态。 - 返回非 const 引用:函数返回一个非
const
引用int&
,这意味着调用者可以通过这个引用修改对象的内部状态。 - 修改对象状态:即使对象本身是
const
的(如const MyClass obj
),调用者仍然可以通过返回的引用修改对象的状态。
如果你不希望调用者通过返回的引用修改对象的状态,可以返回一个 const
引用:
const int& funci() const { return array[1]; }
3. 指针参数的 const
限定符
对于指针参数,const
可以应用于指针本身或指针所指向的对象。
示例
- 指向常量的指针(指针本身可以改,但指向的数据不能改)
void func(const int* ptr) {// *ptr = 10; // 编译错误ptr = nullptr; // 允许
}
- 常量指针(指针本身不能改,但指向的数据可以改)
void func(int* const ptr) {// ptr = nullptr; // 编译错误*ptr = 10; // 允许
}
- 常量指针指向常量(指针本身和指向的数据都不能改)
void func(const int* const ptr) {// ptr = nullptr; // 编译错误// *ptr = 10; // 编译错误
}