const修饰的变量时只读变量,它推出的目的是取代预编译指令。注意,define并不是关键字!const的作用有很多,修饰只读变量,这个就不说了。其还有一点好处就是和define相比,能够避免不必要的内存分配,提高效率。c++编译器通常不为const只读变量分配内存,而是将他们保存在符号表之中(编译器只将基本类型的const变量放入符号表中,而非基本类型的const变量,编译器会为其分配空间)。比如:
但是如果用c编译器编译运行上面这段程序,会输出两个20。因为c编译器为const变量分配了空间。于是可以通过指针修改const变量的值。
这两个例子证实了上面的道理。另外,
如果const变量是全局变量,那么该变量放在文字常量区(用来存放常量,如常量字符串),一般来说是修改不了的。(黄色这段话被实验证明是错误的,照样可以修改)如果const变量是局部变量,那么自然存放在栈区。这种情况下,非基本类型的const变量的意义就不大了,因为可以通过指针消除const的只读性质。
另外就是
在
c++中是可以的,在c中是编译不过的。因为在ANSI C中,size的定义是一个只读变量。而在c++标准中,size的定义是一个常量。也就是说,c编译器会为size分配内存空间;而c++编译器将size保存在了符号表中,使得他成为了一个编译期间的常量。但是c++编译器也有两种情况:声明一个外部的const变量(extern const int b)会分配内存,直接定义一个const基本类型变量,不会分配内存。
const修饰数组,和const修饰一般变量一样,可以用
两种形式。
const修饰指针只需要记住一条规则: 忽略掉类型名称(如int,编译器在解析的时候也是忽略类型名称的),const离哪个近,就修饰哪个。
const修饰函数参数,表示参数在函数体内不可变。
const修饰函数返回值,表示函数的返回值不可变。
- const long lng = 100;
- long * pLng = (long *)&lng;
- *pLng = 20;
- cout<<*pLng<<endl; //输出20
- cout<<lng<<endl; //输出100
- class _MyClass
- {
- public:
- _MyClass(int var):m_var(var){}
- public:
- int m_var;
- };
- const _MyClass myCls(23);
- _MyClass* pMyCls = (_MyClass*)&myCls;
- pMyCls->m_var = 45;
- cout<<myCls.m_var<<endl; //输出45
- cout<<pMyCls->m_var<<endl; //输出45
- #define M 5
- const int N = 3; //此时没有为N分配内存
- int i = N; //为N分配内存,为i分配内存
- int I = M; //为M分配内存,为I分配内存
- int j = N; //为j分配内存
- int J = M; //为M分配内存,为J分配内存
另外就是
- const int size = 100;
- int Array[size];
const修饰数组,和const修饰一般变量一样,可以用
- const int a[5] = {1,2,3,4,5};
- int const b[5] = {1,2,3,4,5};
const修饰指针只需要记住一条规则: 忽略掉类型名称(如int,编译器在解析的时候也是忽略类型名称的),const离哪个近,就修饰哪个。
- const int *p; //*代表值,p代表指针,const离*近,表示p指向的值不可变,p可变
- int const *p; //同上
- int *const p; //往右边看,const离p近,所以p不可变,p指向的值可变
- const int* const p; //指针p和p所指向的值都不可变
const修饰函数返回值,表示函数的返回值不可变。