什么是const
自从接触到c++后就对const这个关键词很是看不上,但是接触到的很多大神的项目都需要用到它,于是就求助于万能的度娘。
在 C++ 中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。它限定一个变量不允许被改变,产生静态作用。C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。
–转载自百度百科
修饰普通变量
总地来说const修饰的变量的值就会被视为一个常量,不能再修改。所以对const修饰的变量赋值后编译器会报错。
然而:
#include<iostream>
using namespace std;
int main(void)
{
const int a = 7;
int *p = (int*)&a;
*p = 8;
cout<<a;
system("pause");
return 0;
}
这里输出的a值仍然是7,但这里实际上内存中的a的那段变量已经改变为8了,因为const编译过程中会将a替换为7,这里的a值已经与原先的内存值不一样了
总之:
1.const全局变量存储在全局存储空间,其值只有可读属性,不能修改;
2.const局部变量存储在堆栈中,可通过指针修改其值;
3.const变量在预处理时处理,编译器只对其值读取一次。
修饰指针变量
- const 修饰指针指向的内容,则内容为不可变量。
指针指向内容8不可改变,被称为左定值const int *p = 8;
int a=8;
int const *p=&a;
const 和int的位置可以互换,但是const int *p内容不可变,其他可变,int const *p内容可变,但是指向的地址不可变。
int a=9;
const int*const p=&a;
此时 *p 和 p 都被修饰了,那么 p 中存放的内存单元的地址和内存单元中的内容都不可变。
修饰引用
把对常量的引用绑定到const对象上,就像绑定到其他对象上一样,不能被用作修改它所绑定的对象。
在初始化常量引用时允许任意表达式作为初始值,只要该表达式的结果能转换成引用的类型,允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式:
引用(本来想写参考,但是基于大段大段的抄,干脆,就写引用吧):
http://blog.csdn.net/xingjiarong/article/details/47282255
https://blog.csdn.net/a3125504x/article/details/78835973
https://blog.csdn.net/qnavy123/article/details/82183586
https://www.cnblogs.com/CodeWithMe/p/10513522.html