总结:
- C++语言的const修饰的变量有时有空间,有时没有空间(发生常量折叠,且没有对变量进行取地址操作)
- C++中,const修饰的全局变量具有内部链接属性,也就是说,无法使用别的文件的const修饰的变量,但是这种规则依旧可以打破
- const修饰的全局变量永远都没有内存,永远无法修改它的值,但是const修饰的局部变量可以有空间,可以修改它的值
- 不能优化自定义数据类型
- 如果用变量给const修饰的局部变量赋值,那么编译器也不能优化
- 使用extern和voaltile关键字来阻止优化
void test03(){ int a =10; const int b = a; int *p = (int *)&b; *p = 100; cout << b << endl;//输出100}例子二:利用关键字阻止优化
void test04(){ const volatile int a = 7; int *p = (int *)(&a); *p = 8; cout << "a=" << a << endl;//输出8 cout << "*p=" << *p; system("pause"); return 0;}例子三:自定义数据类型不能优化
struct Maker{ Maker() {a = 100; } int a;};void test05(){ const Maker ma; cout << ma.a <<endl; Maker *p = (Maker*)&ma; p->a = 200;//可以修改ma中的值 cout << ma.a << endl;}const修饰指针和引用const修饰指针涉及到两个很重要的概念,顶层const和底层const
从 const 指针开始说起 。
const int* pInt;
和 int *const pInt = &someInt;
,前者是 *pInt
不能改变,而后者是 pInt
不能改变 。因此指针本身是不是常量和指针所指向的对象是不是常量就是两个互相独立的问题 。用顶层表示指针本身是个常量,底层表示指针所指向的对象是个常量 。更一般的,顶层 const 可以表示任意的对象是常量,这一点对任何数据类型都适用;底层 const 则与指针和引用等复合类型有关,比较特殊的是,指针类型既可以是顶层 const 也可以是底层 const 或者二者兼备 。int a = 1;int b = 2;const int* p1 = &a;//指针常量(顶层const)int* const p2 = &a;//常量指针(底层const)1.指针常量(指针不可改,指针指向的对象可改)int a = 10;int b = 5;int * const p1 = &a;p1 = &b; //指针不可改,不合法*p1 = b; //指针指向的对象可改,合法2.常量指针(指针可改,指针指向的对象不可改)int a = 10;int b = 5;const int* p2 = &a;p2 = &b; //指针可改, 合法*p2 = b; //不合法拷贝与顶层和底层 const
int i = 0;int *const p1 = &i; // 不能改变 p1 的值,这是一个顶层const int ci = 42; // 不能改变 ci 的值,这是一个顶层const int *p2 = &ci; // 允许改变 p2 的值,这是一个底层const int *const p3 = p2; // 靠右的 const 是顶层 const,靠左的是底层 constconst int &r = ci; // 所有的引用本身都是顶层 const,因为引用一旦初始化就不能再改为其他对象的引用,这里用于声明引用的 const 都是底层 const
经验总结扩展阅读
- 手机怎么把QQ空间说说一次性全删掉(qq如何恢复删掉的说说)
- 怎么一次性删掉QQ空间里的全部说说(翻看以前qq空间的说说)
- 怎么把空间说说全部清空(qq空间一键清空所有说说)
- 手机QQ空间怎么一次性删除说说求解(怎么一键删除qq说说)
- qq空间说说怎么全部删除(怎样一键清空qq空间)
- 小户型卧室如何设计 小户型卧室空间布局设计
- 恋梦空间郭蓉和谁在一起了?
- 空间站是静止的还是运动的
- 如何注销空间 1980717Z空间
- qq空间说说怎么全部删除(qq空间说说一键恢复)