声明关键字 extern
extern int a; //声明
int a; //声明并定义
extern int a = 1; //定义
变量可以被多次声明,仅可定义一次
若想在多个文件中同时应用const 对象,需要在const前加extern
extren const int a = 100;
例:
int i = 42;
const int &r1 = i;
const int &r2 = 42;
const int &r3 = r1 * 2;
常量引用可以对非常量执行,但是无法修改引用值,也不能通过引用值修改常量.
const 可以令指针指向常量或非常量.
不过指针不能修改所指对象的值.
const double pi = 3.14;
const double *cptr = π
printf("%.2lf\n",*cptr);
double dval = 3.16;
cptr = &dval;
printf("%.2lf\n",*cptr);
output:
3.14
3.16
所谓指向常量的指针,仅仅是指不能通过该指针改变常量的值,但是可以通过其他方式改变
即指针是对象,把指针本身定位常量
即指针本身指向不可更改,但可通过其改变其指向的非常量的值
int a = 0;
int *const pa = &a; //常量指针
const double pi = 3.14;
const double *const ppi = &pi //指向常量的常量指针
目前所见有
int *const p = &i; //顶层const
const double pi = 3.14; //顶层const
const double *ppi = π//底层const
const int &r = i; //用于声明引用的const均为底层const
分别const是底层或顶层时,按定义区分即可.
在底层const对象的拷贝中,拷入与拷出必须拥有相同的底层const资格,或两者两者类型可以进行转换.
即值不会改变,且值在编译过程中就可得到
例如
const int mx = 100;
const int mxx = mx + 10;
而如下表达式就不是
const int x = get_size(); //编译过程无法得到其值,须运行时确定
int y = 10; //值不确定
将变量声明为constexpr类型,可由编译器来验证变量的值是否是个常量表达式.
且可用于声明函数,但此类函数须足够简单,能让编译器编译后即可得到结果.这样的函数,就可以去初始化constexpr变量
constexpr int mf = 20;
constexpr int limit = mf + 1;
constexpr int sz = size(); //size() 为constexpr函数
constexpr 定义的指针和引用初始值受到严格限制.
即定义在任何函数中的变量均不可被constexpr修饰,因为函数体内的变量定义一般并不会存放在固定地址.
注意: 若constexpr定义中存在指针,则此指针为常量指针,即与其指向的对象无关.
const int *p = &i; //指向常量的指针
constexpr int *q = &j; //常量指针
原文:https://www.cnblogs.com/rainyy/p/11516466.html