const
const:只读
1. c中const
1.const修饰的变量
const int a = 1;
int const a = 1;
两种表达方式是一样的,const修饰的变量a的值是只读,不可改变的
但是可以通过指针间接去修改
const int a = 1;
int *p = (int *)&a;
*P = 5;
此时被const修饰的变量a的值就变成了5
那就说明const修饰的变量不存储在常量区。
const修饰的局部变量存储在栈中,初始化一次,生命周期为整个代码块。
const修饰的全局变量存储在、只读数据段,初始化一次,生命周期为整个程序
2.const修饰的指针
const int *p ;
int const *p ;
const修饰的是*p,*p的值不可修改,但是,可以通过对变量重新赋值来修改,
int * const p ;
const 修饰的是p,那么,p的指向是不能修改的
const int * const p;
int const * const p;
const修饰了p和*p,所以,两者都不能改变;
2. c++中const
1.const修饰成员变量
不能作为左值(左值必须能够被修改),只能通过初始化列表来进行初始化
2.const修饰成员函数
在调用成员函数时,编译器会将对象的地址隐式地作为函数的第一个参数传给this指针,this指针的本质是一个指针常量,指针的指向不可修改
(1)在const修饰的成员函数中不能修改任何成员变量的值
在使用const修饰成员函数之后,this指针就成了这样的修饰:const Demo * const this,所以this指针的值和他指向那片地址空间的值都不能修改
(2)如果成员变量被mutable修饰,那么在const修饰的成员函数中这个变量就可以被修改
(3)const修饰的成员函数只能调用const修饰的成员函数,非const修饰的成员函数可以调用const修饰的成员函数
3.const修饰对象
(1)const修饰的对象不能作为左值
(2)const修饰的对象只能调用const修饰的成员函数
(3)const修饰的对象不能修改任何成员变量的值
(4)const修饰的成员函数与非const修饰的成员函数互为重载,如果用非const修饰的对象调用的是非const的成员函数,const修饰的对象调用的就是const修饰的成员函数