const和指针的问题是笔试里经常出现的问题。这里综合一下各种不同的情况。
首先是几种const与指针组合的区分,比如:
int b = 500;
const int* a = &b; [1]
int const *a = &b; [2]
int* const a = &b; [3]
const int* const a = &b; [4]
[1]和[2]其实是一样的,都是指向int型常量的指针,而[3]是int型常量指针,两者的区别是指向常量的指针本身可以指向别的,所指向的数据不能被修改,而常量指针本身不能被修改。[4]就不用说了,啥都甭想改。
至于例子,可以举下面的一个例子(以[1]为例)。这里小小的牵扯了一点优先级的问题。
#include <iostream>
using namespace std;int main(int argc,char* argv[])
{
int a=1;
const int *b=&a;
*b++;//成立
(*b)++;//编译器错误
}
那么我们能不能突破const去修改一个值呢?虽然这件事情本身并没有多大意义,但是还是可以做的。我们可以用const_cast来去掉一个const或者volatile限制。const_cast的作用主要分如下三种:
转化一个常量指针为非常量指针
转化一个常量引用为非常量引用
转化一个常量对象为非常量对象
至于例子
我们举如下一个例子:
#include <iostream>
using namespace std;class Test
{
public:
const int a ;
Test(int b):a(b)
{
}
};int main(int argc,char* argv[])
{
Test t(1);
//t.a=2;//出错
int b=const_cast<int&>(t.a);
int& c=const_cast<int&>(t.a);
int* d=const_cast<int*>(&t.a);
b=2;
c=3;
cout<<t.a;
*d=4;
cout<<t.a;
return 0;
}
源码借用了一个微软今年的笔试题,当然原题只是想说明const的成员变量可以被:a(b)这种初始化方式初始化。这里主要是想说const_cast有三种转换方式,需要注意的是b其实是一个新的变量了,而c和d仍然引用和指向了原来的那个常量。