const 用法

来源:互联网 发布:ugm和mac队关系 编辑:程序博客网 时间:2024/06/11 21:11
const修饰的变量时只读变量,它推出的目的是取代预编译指令。注意,define并不是关键字!const的作用有很多,修饰只读变量,这个就不说了。其还有一点好处就是和define相比,能够避免不必要的内存分配,提高效率。c++编译器通常不为const只读变量分配内存,而是将他们保存在符号表之中(编译器只将基本类型的const变量放入符号表中,而非基本类型的const变量,编译器会为其分配空间)。比如:
[cpp] view plaincopyprint?
  1. const long lng = 100; 
  2. long * pLng = (long *)&lng; 
  3. *pLng = 20; 
  4. cout<<*pLng<<endl;  //输出20 
  5. cout<<lng<<endl;    //输出100 
但是如果用c编译器编译运行上面这段程序,会输出两个20。因为c编译器为const变量分配了空间。于是可以通过指针修改const变量的值。
[cpp] view plaincopyprint?
  1. class _MyClass 
  2. public
  3. _MyClass(int var):m_var(var){} 
  4. public
  5. int m_var; 
  6. }; 
  7.  
  8. const _MyClass myCls(23); 
  9. _MyClass* pMyCls = (_MyClass*)&myCls; 
  10. pMyCls->m_var = 45; 
  11. cout<<myCls.m_var<<endl;       //输出45 
  12. cout<<pMyCls->m_var<<endl;     //输出45 
这两个例子证实了上面的道理。另外,如果const变量是全局变量,那么该变量放在文字常量区(用来存放常量,如常量字符串),一般来说是修改不了的(黄色这段话被实验证明是错误的,照样可以修改)如果const变量是局部变量,那么自然存放在栈区。这种情况下,非基本类型的const变量的意义就不大了,因为可以通过指针消除const的只读性质。
[cpp] view plaincopyprint?
  1. #define M 5 
  2. const int N = 3;  //此时没有为N分配内存 
  3. int i = N;         //为N分配内存,为i分配内存 
  4. int I = M;          //为M分配内存,为I分配内存 
  5. int j = N;          //为j分配内存 
  6. int J = M;          //为M分配内存,为J分配内存 

另外就是
[cpp] view plaincopyprint?
  1. const int size = 100; 
  2. int Array[size]; 
c++中是可以的,在c中是编译不过的。因为在ANSI C中,size的定义是一个只读变量。而在c++标准中,size的定义是一个常量也就是说,c编译器会为size分配内存空间;而c++编译器将size保存在了符号表中,使得他成为了一个编译期间的常量。但是c++编译器也有两种情况:声明一个外部的const变量(extern const int b)会分配内存,直接定义一个const基本类型变量,不会分配内存。

const修饰数组,和const修饰一般变量一样,可以用
[cpp] view plaincopyprint?
  1. const int a[5] = {1,2,3,4,5}; 
  2. int const b[5] = {1,2,3,4,5}; 
两种形式。
const修饰指针只需要记住一条规则:忽略掉类型名称(如int,编译器在解析的时候也是忽略类型名称的),const离哪个近,就修饰哪个。
[cpp] view plaincopyprint?
  1. const int *p;       //*代表值,p代表指针,const离*近,表示p指向的值不可变,p可变 
  2. int const *p;       //同上 
  3. int *const p;       //往右边看,const离p近,所以p不可变,p指向的值可变 
  4. const int*const p;  //指针p和p所指向的值都不可变 
const修饰函数参数,表示参数在函数体内不可变。
const修饰函数返回值,表示函数的返回值不可变。
原创粉丝点击