const的对象必须初始化。
一条声明语句由一个基本数据类型,和紧随其后的声明符列表组成,类型修饰符是声明符得一部分。
int *p;
int *&r= p; // r 是一个对指针的引用(从r开始向左看,知道r是一个引用->绑定的是一个指针->指针的类型是int)
引用(左值):
引用必须初始化,引用是和它的初始值绑定在一起
引用不是对象,它只是他所绑定的对象的另外一个名字,所以不能定义一个引用的引用。
除了对常量的引用以及对基类的引用外,引用的类型都要和他绑定的对象的类型一致。
(左值)引用只能绑定在对象上,不能与字面值或某个表达式的计算结果绑定在一起。
指针:
常量指针是指,指针本身是一个常量;指针常量指的是指针指向的是常量。
指针是一个对象,可以不初始化,如果在一个块作用域内,指针不被赋初值,那它将是未定义的。
void*是一种特殊类型的指针,可以用于存放任意对象的地址,但是不能直接操作viod*所指的对象。
对const的引用:
只有常量引用才可以绑定到常量对象上。
允许为一个常量引用绑定一个非常量对象、字面值、甚至是一个一般表达式,只要结果能够转换成引用的类型。
常量引用不能修改他所绑定的对象,但是可以通过其他方式修改该对象。
但一个常量引用绑定到另一种类型上是,引用绑定的其实是一个临时量:该对象的拷贝。
指针和const:
常量指针:指针本身是一个常量,常量指针必须初始化,且之后不可改变。
指针常量:指向一个常量的指针。
只有指针常量能指向一个常量对象,同引用,允许一个指针常量,指向一个非常量对象。
顶层const和底层const:
当修饰的是一个引用或指针指向的对象时,是一个底层const
当修饰的是一个基本数据类型或一个指针时,是一个顶层const
当执行对象的拷贝操作时,顶层const不受影响,但是拷入和拷出的对象必须具有相同的底层const(就是说只有指向const的指针可以拷贝一个指向const的指针)
常量表达式和constexpr:
常量表达式是指值不会改变,且在编译过程就能得到计算结果的表达式
用常量表达式初始化的const对象也是常量表达式。
一个对象(表达式)是不是常量表达式由它的数据类型和初始值共同决定。
将变量声明为constexpr类型,由编译器来验证变量的值是否是一个常量表达式。
字面值类型:声明constexpr时用到的初始化值的类型。
算术类型、指针、引用都是字面值类型。
constexpr类型的指针(0 或者nullptr也可以)和引用只能指向(绑定)存放在固定地址的对象上(不是const对象)。