const关键字限定一个值不能被修改,产生静态作用。const修饰的数据类型是常类型,
C语言const 常变量
编译阶段,判断常变量是否做左值,其他处理与变量一样。
当我们试图修改常变量时系统会提示我们错误,
const int a = 10;
a = 20; //试图直接修改a的值,1,3错误
int *p = &a;//试图通过指针的解引用来修改a的值,2、4错误
*p = 20;
C++ const 常量
编译阶段,把用到常量的地方替换成常量初始化的值
- 一定要初始化
- 不能做左值,常量禁止修改
- 不能间接修改,杜绝间接访问来修改常量内存的风险
#include<iostream>
using namespace std;
int main()
{
const int a = 10;
int *p = (int *)&a;
*p = 20;
cout<<*p<<endl;
cout<<a<<endl;
return 0;
}
先定义一个整形常量 a,并将其初始化为10,整形产量不可修改,将整形常量强制转换为整形指针类型,解引用来修改a的值,修改成功,*p的值已经为20,但a的值输出结果还是初始化的值,因为在编译阶段编译器已经将用到常量的地方替换为常量初始化的值。
执行结果如下
Const函数
常函数是类的成员函数,常函数不能修改本类的数据成员,除非本类数据成员有“mutable”关键字修饰
- 常函数声明样式:返回类型<类标识符::>函数名称(参数列表)const。void Show()const{}
- const关键字可以重载同名但未加const关键字的函数
- 常对象在对象前面加const修饰 const Test test(20); 常对象不能调用普通函数,只可以调用常函数
下面是一个简单的常对象调用常方法的实例,常对象stu调用常方法void Show()const;
#include<iostream>
using namespace std;
class Stu
{
public:
Stu(int a) :id(a){}
void Show()const
{
std::cout << "id:" << id << std::endl;
}
public:
int id;
};
int main()
{
const Stu stu(123);
stu.Show();
return 0;
}
当将常方法void Show()const中的const去掉时即该方法为一个普通方法或函数。程序就会出错,编译器告诉我们对象的类型和成员函数的类型不兼容,即常对象不能调用普通的成员函数。