const关键字可以修饰类的:
- 数据成员
- 成员函数
- 对象
const修饰类的数据成员
示例:
class A
{
public:
A():num(100)
{
}
private:
const int num;
};
注意:
- 在定义数据成员前用const修饰
- 被const修饰后的数据成员只能读取,不能修改
- 定义的数据成员必须要在参数列表上初始化,因为如果不在参数列表上初始化,那对象分配完空间后,你就不能对他赋值了。
const修饰类的成员函数
示例:
class A
{
public:
A()
{
}
void test() const
{
}
};
注意:
- 在定义成员函数的参数括号后用const修饰
- void test() const{}等同于void test(const A *this){},A是自己的类,
- 当调用函数的时候是把自己对象的地址传进this里
- this又被const修饰
- 只能读取类中的数据,不能修改类中的数据
- 不能在函数里调用非const函数
- 被const修饰后的函数只能读取类中的数据,不能修改类中的数据
- 不能在const函数里调用非const函数
应用场景:
只需要返回成员数据时就可以使用const来修饰函数,以免改动数据
const修饰类的对象
示例:
class MyClass {
public:
void foo() {
// 非const成员函数
}
void bar() const {
// const成员函数
}
int getValue() const {
return value;
}
private:
int value;
const int value1;
};
int main() {
const MyClass obj;
obj.bar(); // 可以调用const成员函数
obj.getValue(); // 可以调用const成员函数来访问成员变量
obj.foo(); // 错误!不能调用非const成员函数
obj.value1; // 可以访问const成员变量
obj.value = 10; // 可以对value进行写入操作
return 0;
}
注意:
-
只能调用其成员函数:
const
对象只能调用其成员函数中被声明为const
的函数。这是因为const
对象是只读的,而调用非const
成员函数可能会修改对象的状态,违反了const
的约束。 -
访问其成员变量:
const
对象可以访问和读取其同样const成员数据,但不能修改它们。可以写入和读取非const的成员数据。 -
不能调用非
const
成员函数:const
对象不能调用其成员函数中未被声明为const
的函数,因为这些函数可能会修改对象的状态。 -
可以调用
const
成员函数:const
对象可以调用其成员函数中被声明为const
的函数,因为这些函数不会修改对象的状态。