Const int bufsize = 512;
const的值得特定是,一旦创建了这个值之后,const必须进行初始化。
不能只光声明。
Extern const int bufsize = fcn();
Extern const int bufsize;
因为const是在编译期间发生的,在这个过程中,它会被做一个强行的替换。
因此这个作用域只在本文件中。但是程序员懒啊,他们想在更多文件见共享一个值。
要用的时候只要声明一下就可以了。
这个时候就是上述例子了,第一句在cc文件中运行,第二句在其他头文件中运行。
对常量的引用:
Const int &r1 = ci;
这个r1是一个常量。
常量引用
这个常亮引用的特点是允许绑定表达式。
而普通的变量是不允许的。
引用,其目的是为了修改目标变量。
但如果是在类型不符合的情况下 ,可能会出现例外。
典型情况就是 const int &ri = temp;
Const int temp = dval;
Const int &ri =temp;
指向常量的指针,和指向常量的引用,他们的意思其实不是说,指向的东西必须是一个常量,不能动。
而是说透过这个指针,透过这个引用,他指向的东西不能用。
Const double *const pip;
Pip 是一个指向常量对象的常量指针。
Double *const pip,值得是pop指向的那个位置。
顶层const:表示的是:指针本身是个常量
底层const指的是,指针所指的对象是一个常量。
顶层const 和 底层const。顶层const指针本身是个常量,底层const它的对象是一个常量。
所以在处理底层const的时候,我们必须要建立一个const
Const int &r2 = I;
Constexpr 它解决的问题是,初始值到底是不是常量表达式
比如 const int sz = get_size();
最典型的是这种情况,只能在运势是,慈恩给你获得常亮表达式。但也能这么写
比如编译器检测一个东西究竟是不是一个常量表达式,就会很难。
那为了更严格的限定。constexpr就出现了。
constexpr的表达式一定要是一个constexpr函数才行。
constexpr提到的,它指向的东西,是必须受到严格限制的,函数内部的值就会随机内存地址,所以不能用constexor。
Const int *p = nullptr;
Constexpre int *q = nullptr;
两个是完全不同的,consterpre 是一个常量指针,指针自己指向的内存空间不能变。
所以 constexpr只能定义在函数体外。