C++中的const

关键字const是单词"constant"的简写,它的语意就是"保持不变,不允许修改".

const在C++的代码中是大量存在的,个人认为,const是C++中提供的最优美的机制
首先它足够的简单:
对程序员来说,语意简单,就是保持不变,很少会有歧异
对计算机来说,实现简单,只需要编译器报告那些改变了const的例外情况
其次它足够的高效:
对程序员来说,它为程序员提供了一个非常常用的契约,减少了错误发生的几率,提高了编程效率
对计算机来说,它没有在运行的代码中加入任何东西
最后它足够的强大:
无论是变量,指针,引用,函数参数,函数返回值,成员变量,成员函数,没有什么不能用const保护的

C++中还有比const还优美的东西吗?

const变量:
用const来保护一个变量,象这样:
const double pi = 3.1415926;
这里的变量pi已经不能被修改了,这种用法可以取代旧有的
#define pi 3.1415926

请注意这里,因为C++确实推荐采用这种方式替换掉旧的,不安全的#define,因此它就必须承诺
这里的const变量是编译期就可以知道的,也就是需要把这个const变量放在了"符号表"里面

这里列出C中常量和C++中const常量的区别
在C中,常量需要占用存储空间,而且是全局的
在C++中,const常量不需要占用存储空间,放在了"符号表"里面(编译期就可以知道),而且是内部链接的

但是对于const常量集合,因为无法直接放到"符号表"里面,因此编译期就不知道了
const int arr[] = {1,2,3,4);
float f[arr[2]];//error,编译器不知道arr[2]的值

const指针:
总有人拿下面的题目考C++的初学者
char *p              = "hello";          // 非const指针,非const数据
const char *p        = "hello";          // 非const指针,const数据
char * const p       = "hello";          // const指针,非const数据
const char * const p = "hello";          // const指针,const数据
并有人总结了向左规则,*号规则等等,我也凑凑热闹,提出一个向右规则:const修饰右边的所有声明
举例来说:
const char *p        = "hello"; const修饰*p,所以是const数据,*p='wgs'//error
char * const p       = "hello"; const修饰p,所以p = new char[10]//error
const char * const p = "hello"; *p=//error,p=//error

再来个复杂些的:
 int * const * * const p = NULL;
 p = NULL;//error,p前面有const
  *p = NULL;
  **p = NULL;//error,**p前面有const
  ***p = 10;
  
const引用:
const修饰引用比修改指针可简单多了
int z;
const int& zRef = z; //zRef不可更改

const函数参数:
const可以修饰函数参数
void fun(const string& str)
这里str不允许在函数体内修改,同时它还带来了一项更大的好处
const char* name = "wgs";
fun(name);
按照C++的强制类型限制,fun函数是不能用const char*为参数的,这里必须首先把const char*转换为string,然后才能调用fun
const char* name = "wgs";
string temp(name)
fun(temp);
但是编译器看到这里函数参数被声明为const的引用,函数体内不会修改实参的值,因此它放心大胆,兴高采烈的替你做了这个转换,
这个地方可以参看C++中的临时变量.这种转换总是良性的,因此程序员也乐的坐享其成

const函数返回值:
const可以修饰函数的返回值
const int get();
const int* get();
const int& get();

int  a = get();
int* p = get();
int& c = get();
这里函数的返回值a,p,c不允许被修改

当不得不通过成员函数返回对象中的私有成员变量时,我们常常把返回值声明为const T&以防止外部修改了这个私有成员导致整个对象的异常
const成员函数:
const可以修饰整个函数,这种情况只在成员函数身上发生
class Rect
{
 int getWidth() const;
 int getHeight() const;
}
这里getWidth和getHeight不能修改类中的变量 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值