const
定义一种变量,它的值不能被改变。
const int a = 0;// 不可改变
const的引用(常量引用)
const int a = 0;
const int &b = a;//正确
严格来说,并不存在常量引用。因为引用不是一个对象,所以没法让引用本身恒定不变,但是c++不允许随意改变引用所绑定的对象,所以所有的引用都算作常量(绑定关系从定义引用之后就不可改变)。引用的对象是常量还是非常量可以决定操作,但是不影响引用和对象的绑定关系本身。
const与指针
- 指向常量的指针或引用,只是他们的“自以为是”
const int a = 12;
int b = 13;
const int *p1 = &a;
const int *p2 = &b;//指针认为不可变,指向的值:那就随你便
int *p = &a;//错误,指针认为可以通过自己改变指向的值,那是非法的
顶层const和底层const(和const位置是相反的)
- 顶层const:指针本身是一个常量,即指向的对象不能换
- 底层const:指向的值是一个常量
int i = 0;
int *const p1 = &i;//顶层const,运行期常量指针p1
const int ci = 12;//顶层const
const int *p2 = &ci;//底层const,认为指向的是常量,指针本身可以改变
constexpr常量表达式和const的区别
const并未区分出编译期常量和运行期常量
constexpr限定在了编译期常量
编译器常量和运行期常量的区别
constexpr int a = 1024;//编译器常量,a会被1024替代
string b;
cin >> b;
const long long c = b.length();//运行期常量,运行时传入b的值才知道其长度