很久没写BLOG了,不知道还有没有人对这里有兴趣,呵~
const在面试的时候考得多,特地小结一下。
1,const是修饰符,它表示某个对象是常量,即不能修改,而C++没能彻底抛弃指针这个C留下的遗产而有些尴尬,指针是比较圆滑的家伙,它有双重身份,有时表示它自己,有时表示它所指的对象(所以C++建议我们尽量用引用而不是指针)
const double e;// error
const double pi=3.14;// ok,需要初始化
这样的用法没什么好说的。
2,指针带来的问题
像这样写:
int a,b;
const int *p=&a;
实际上没有定义一个常量指针,而是指向常量对象的指针,这意味着后面可以这样
p=&b;//ok
a,b不是常量而是变量,这是可以的,事实上编译器不管这个,而是管*p和p->这样的运算不能被修改
*p=1;//error
就是说上面那句定义的并不是一个常量,它相当于
int const *p;
实际上是个变量。
而真正的常量指针怎么写?这样
int * const p=&a;//ok
int *const p;// error
它的意思是p不能再改,只能赋值一次,这实际上是什么,是引用。引用和指针有着这样一个巨大的差异。
上面ok的代码,实际上可以写成
int &p=a;
也就是说根本不需要常量指针,因为有引用(?)
3,引用和const
引用有着针指的优点,但是它的身份是确定的,不像指针有双重身份,所以用const修饰没什么问题。
const int &p=a;
它的意思实际上和这样写差不多
int const * const p=&a;
本身一次赋值,所指对象也不能改。这就是喜欢考的那个所谓,一个指向一个常量对象的常量指针。
试一下这么写
int const & const p=&a;
多此一举,在VC上会给出个警告,因为在语义上是重复的。
评论