const是什么
我们知道const是C++中声明常量的关键字,今天我们来学习一下有关const的用法
使用场景
const修饰普通变量
我们先来说一下const最基本的用法,对于一个普通变量来说,我们在声明之后可以随时修改它的值。
int a = 10;
cout<<a<<endl;//10
a = 20;
cout<<a<<endl;//20
而对于一个const修饰的变量来说,它的值是不可修改的,且必须定义时就初始化,如果我们尝试修改一个const的值,g++编译器会报错:
//const int a; 编译器报错:常量 变量a需要初始值
const int a = 10;
cout<<a<<endl;
a = 20;//报错
cout<<a<<endl;
const修饰指针
用const修饰指针时,也分为两种情况;
顶层const(指针常量):既指针指向的对象不可以修改(注意,这里的不可以修改是不可以通过const修饰的int修改,但如果指向的对象有其他变量名的话,是可以通过其他变量名修改的)
void func1() {
int a = 10;
const int *p = &a;//等同于int const *p = &a;
cout<<*p<<endl;// 输出10
*p = 20;//报错:表达式是必须可修改的左值
cout<<*p<<endl;
a = 20;//可以这样改动
cout<<*p<<endl;//输出 20
}
底层const(常量指针):即指针指向的方向不可以修改,但是指向的内容是可以修改的,同时也意味着不能接收一个const类型的对象
void func2() {
int a = 10;
int* const p = &a;
cout<<*p<<endl;
*p = 20;//正确,可以修改,因为是常量指针
cout<<*p<<endl;
int b = 30;
p = &b;//报错,必须是可修改的左值
const int c = 40;
*p = &c;//不能将 "const int *" 类型的值分配到 "int" 类型的实体
}
如何区分指针常量(指针指向的对象是常量)和常量指针(指针本身是常量):
看const 与 *的位置关系,如:
const 在 * 的左边,指向常量的指针: const int *a; int const *a;
const 在 * 的右边,常量指针:int* const a;
const修饰成员函数
用const修饰的成员函数,不能修改类的成员变量,除非它用mutable修饰;另外,const是函数签名的一部分,也就是说可以因为const实现成员函数重载,调用的时候普通对象可以调用const版本的函数,但是如果有非const版本的重载,那么会选择非const。而
class myClass{
int val;
mutable int ChangbleVal;
void func(int b) const {
val = b;//报错:表达式必须是可修改的左值
ChangbleVal = b;//成功
}
};
与之有关的知识点
1const与static的区别
2constexpr
3const和成员函数重载,const对象和非const对象和 const成员函数和非const成员函数的区别