初始化和const
const只会在执行改变的时候发挥作用,在初始化其他变量时,两个变量是否有const不影响。
多文件中同名的const变量
默认情况下,视为不同的变量,虽然他们名字相同。通过在声明和定义前加extern可以实现多文件使用通过一个const变量。
const的引用
可以定义常量引用,但是不可以用这个引用修改原变量的值;也不能用非常量引用来引用常量,因为如果可以引用,就可以用这个引用修改原变量的值,这是不允许的
const int a = 1; const int &b = a; b = 2;//这里是错误的,不能用常量引用修改原变量的值 int &c = a;//错误,不能用非常量引用来引用常量例外情况:常量引用可以引用非常量,但是非常量引用不可以引用常量
指针和const
可以定义指向常量的指针,指向常量的指针可以不指向常量,但是非指向常量的指针一定不可以指向常量。
与const一样,常量指针不可以改变原变量的值。
const int pi = 1; const *p = π
tips:
可以这样理解常量const和常量指针,他们只是自以为是,自己约束自己不去改变变量的值,实际并不能保证变量不被改变。
const指针
也成为常量指针,表明指针本身的值不变,而非指向的值不变
int a = 0; int *const p = &a;//指向非常量的常量指针,指针本身不能修改,但是可以修改a的值 *p = 2;//正确 const int b = 0;//定义常量 const int *const q = &b;//指向常量的常量指针,指针本身不能修改,而且b也不能修改 *q = 3;//错误
用来定义指针本身和指针指向对象是否为常量。
指针本身是常量就是一个顶层const,指针指向对象是常量就是一个底层const
更一般的,顶层const的含义从指针指向的对象扩展到了所有对象(算术类型,类,指针),底层const则包含了引用等复合类型。在表达式中,都是通过判断等式左边的是否可以更改来判断是哪种cosnt。
在拷贝中,顶层const不会有什么影响,底层const则需要有相同的底层资格,还需要注意类型。
constexpr常量表达式
如果认为一个变量是常量表达式,就可以声明成constexpr。constexpr会把它定义的指针赋予顶层const
全部评论
(0) 回帖