const 用法

const修饰的变量时只读变量,它推出的目的是取代预编译指令。注意,define并不是关键字!const的作用有很多,修饰只读变量,这个就不说了。其还有一点好处就是和define相比,能够避免不必要的内存分配,提高效率。c++编译器通常不为const只读变量分配内存,而是将他们保存在符号表之中(编译器只将基本类型的const变量放入符号表中,而非基本类型的const变量,编译器会为其分配空间)。比如:
  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变量的值。
  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的只读性质。
  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分配内存 

另外就是
  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修饰一般变量一样,可以用
  1. const int a[5] = {1,2,3,4,5}; 
  2. int const b[5] = {1,2,3,4,5}; 
两种形式。
const修饰指针只需要记住一条规则: 忽略掉类型名称(如int,编译器在解析的时候也是忽略类型名称的),const离哪个近,就修饰哪个。
  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修饰函数返回值,表示函数的返回值不可变。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值