const的用法及部分面试题解析

来源:互联网 发布:程序员办公室图 编辑:程序博客网 时间:2024/06/07 03:10

1、const修饰常量
C++中用const限定符将一个对象转化为一个常量,因为常量是不可以改变的,所以const修饰的变量在定义时必须初始化,否则将会出现错误。在全局范围内定义一个变量,一般是和定义该全局变量得源文件在一个文件夹里面的所有源文件都可以去访问这个全局变量,但是用const限定符修饰的变量就不能在其他文件中被访问。除非你用extend修饰源文件中的全局变量和在访问之前声明一下,也就是说在C++中const修饰的变量是默认内部链接的,把上面的验证一下:
这里写图片描述
这里写图片描述
这里写图片描述
const在C和C++中的区别
在C中 const int i;是对的可以通过编译,因为在C中默认const是外联的,就是外部可以直接访问而不用进行声明,这和C++是不一样的。在C中上面的那一句代码类似于一个声明,说明如果在本源文件中没有该变量
,那么该变量可能存在其他的源文件中。在C中const的意思为一个不能被改变的普通变量,C修饰的变量总是占有空间,C编译器不能把const修饰的变量视为一个编译期间的常量。
const与#define的区别
const最初的动机就是为了取代#define的值替代功能,他还被用于指针,函数变量,返回类型,类对象及其成员函数。所有的这些用法都稍有区别,但是大致上概念都是一致的。
使用const比起使用#define来是有很多优点的:
(1)const是有类型的,而#define是没有类型的,在进行替换时编译器会对const修饰的变量进行类型安全检查,而对于#define修饰本变量只是简单的进行替换,不进行类型检查。没有类型检查,只是简单替换后,会出现意想不到的错误。
(2)对于#define修饰的变量在源文件中每出现一次就要替换一次,如果有1000个就会产生1000个备份,但是用const修饰的变量就不一样了,在一个源文件中有一个就可以了,所以const修饰比#define 修饰产生的目标代码更小
(3)const还可以进行常量压缩,即如果const int i=2*2;在编译的时候就会进行必要的计算把i存储为4。
const修饰符与指针
这个其实很简单的,去掉数据类型就是const所修饰的内容比如:double const cptr;const修饰的是*cptr 也就是说指针指向的内容不能改变,const double *cptr和这个意思是一样的。double*const cptr的意思是指针cptr的指向空间不能变。空间里面的内容可变const double const cptr 是指只想不能变指向空间里的内容也不能不变。这些就不验证了,贼简单。举两个面试题的例子吧
1.给定声明如下:
const char* pp;
下面操作那个是正确的?
A.pp++ B.(*pp)++ C.(**pp)=‘c’ D.以上都不对。
按照上面我说的这个题明显选A,没毛病pp指针指向空间里的内容不能改变,但是pp指针的指向是可以变化的。
2.下面的代码是否正确?
char *const ch[2]={“abc”,”def”};
ch[0]=”ABC”;//语句1
ch[1]=”DEF”;//语句2
解析:语句1、2 都错了,数组中存储的是char类型指针,const修饰下指针的指向是不能改变的,所以将指针指向新的字符串会发生错误。
const修饰函数参数
如果函数是以值传递的可以用const限制函数参数,明确的告诉编译器,这个变量的值在函数体内是不能改变的。但是值传递用const修饰是没什么大的意义的,一般如果是址传递的话都尽量要用const修饰
const修饰成员函数
const修饰成员函数的目的是为了确保该成员函数可以作用于const对象身上。const对象、指向const对象的指针或引用只能调用const成员函数,如果尝试用来调用非const成员函数的话会出现错误。如果不存在const成员函数的话const对象的操作是极其困难的,无法调用任何成员函数。
const成员变量
const成员变量就有一点需要注意的就是初始化的过程,const成员变量在定义时是不能初始化的,这个和static修饰的成员变量是一样的。但是不同的是初始化的位置,const修饰的成员变量是在构造函数的初始化列表里进行初始化的而static修饰的成员函数是在类的定义外进行的初始化,类内只能声明。
const就总结到这里,这个其实也不是很难,有什么问题或者是文章有什么错误,请评论