易错小问题

来源:互联网 发布:加内特数据统计 编辑:程序博客网 时间:2024/05/21 14:42

  对于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。

原创粉丝点击