C语言中const关键字
lee-Macbook-Air:cplusplus lee$ cat tmp.c #include <stdio.h> int main() { const int var = 100; int* p = &var; *p = 200; printf("p = %p, &var = %p\n", p, &var); // printf("%d\n", var); return 0; } lee-Macbook-Air:cplusplus lee$ gcc tmp.c tmp.c:6:7: warning: initializing 'int *' with an expression of type 'const int *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] int* p = &var; ^ ~~~~ 1 warning generated.
在C语言中,非const指针可以指向一个const变量
在编译过程中,会有警告
但是仍然不能修改const的值,仍然var = 100;
p中存放的地址和var的地址也是相同的
C++中const关键字
#include <iostream> #include <cassert> using namespace std; void fun(int& tmp_var) { cout << tmp_var << endl; } int main() { const int var1 = 100; int* p = const_cast<int*>(&var1); *p = 200; assert(p == &var1); // p 存放的地址和var1的地址是相同的 cout << "*p = " << *p << endl; cout << "var1 = " << var1 << endl; // 相同的地址中却存放着不同的内存,这样是不符合规则的 // 所以*p 取出的内容到底是什么呢?为什么不是p指向的地址呢. fun(const_cast<int&>(var1)); // 一个临时值是200 return 0; } /* output: *p = 200 var1 = 100 200 */
为什么会出现这样诡异
的事情呢?
因为const_cast并非用于将const限定的对象用于赋值,所以出现了这样的“不确定性”
IBM的C++指南称呼“*modifier = 7;”为“未定义行为(Undefined Behavior)”。所谓未定义,是说这个语句在标准C++中没有明确的规定,由编译器来决定如何处理。参考:地址:http://www.cnblogs.com/ider/archive/2011/07/22/cpp_cast_operator_part2.html
具有歧义Code
#include <iostream> #include <cassert> using namespace std; void func1(const int& tmp) { cout << "func1 " << tmp << endl; } void func2(int tmp) { cout << "func2 " << tmp << endl; } void func3(const int* tmp) { cout << "func3 " << *tmp << endl; } int main() { const int a = 10; int& b = const_cast<int&>(a); b = 20; cout << a << endl; cout << b << endl; assert(&a == &b); // 断言 a b地址是否相等 func1(a); func2(a); func3(&a); return 0; } /* output: 10 20 func1 20 func2 10 func3 20 */