对于C++ const 需要特别注意的小问题,对于一个变量声明为const的尽量不要出做改变,如果必须改变的话,那么程序中使用的应该是该处的地址,而不是直接使用原先的变量,不然的话,用的是编译时期,编译器直接替换的值。代码如下:
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
const int a = 10;
int * p = const_cast<int *>(&a);
*p = 1;
const int& ref = a;
printf("%d %d %d\n", a, *p,ref);
printf("%p %p %p\n", &a, p,&ref);
system("pause");
return 0;
}
输出结果为:
看到后面a 输出的是10了吧,该值是在编译时期编译器直接替换的结果。再次说明:
const的值是不能重新赋值的!即定义好了一个const的变量,这个变量的值一定是不变的,这是C++的const特性,否则const存在的意义也就没了!
而const_cast可以称为"未定义行为(Undefined Behavior)",所谓未定义,是说这个语句在标准C++中没有明确的规定,由编译器来决定如何处理。
C++中某些时候函数可能声明了一个不是const的参数,而需要传进去的实际参数却是const的,但是我们知道这个函数是不会对参数做修改的。于是我们就需要使用const_cast去除const限定,以便函数能够接受这个实际参数。
还有另一种情况,当定义一个变量的时候,它的地址是一个const的引用,当要修改这个变量的值的时候可以用const_cast,这样可以改变该变量的值,地址仍然是指向const。