变量和基本类型
NULL是一个预处理变量,用NULL初始化指针和用0初始化指针是一样的(但是不可以直接用值为0的int变量来初始化),应该尽量用nullptr,避免使用NULL
指向指针的指针
声明符中修饰符的个数并没有限制,当有多个修饰符连写在一起时,按照逻辑关系解释就可以了
**表示指向指针的指针,***指向指针的指针的指针
指向指针的引用
引用本身不是一个对象,因此不能定义指向引用的指针,但指针是对象,所以存在对指针的引用
const限定符
默认状态下,const对象仅在文件内有效
如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字
指针和const
指向常量的指针不能用于改变其所指对象的值,要想存放常量对象的地址,只能使用指向常量的指针
指针的类型必须与其所指对象的类型一致,但是允许令一个指向常量的指针指向一个非常量对象,指向常量的指针仅仅要求不能通过该指针改变对象的值,而没有规定那个对象的值不能通过其他途径改变
常量指针必须初始化,初始化后就不许更改 写作:*const
顶层const
用名词顶层const表示指针本身是一个常量,也可以表示任意的对象是常量。名词底层const表示指针所指对象是一个常量
拷贝的时候底层const的限制不能忽略,当执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换
constexpr和常量表达式
常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式
用字面值初始化的const对象是常量表达式,用被初始化的常量表达式初始化的也是
允许将变量声明为constexpr类型以便由编译器来验证变量的值是都是一个常量表达式,声明为constexpr的变量一定是一个常量,而且必须用常量表达式来初始化
字面值类型
算术类型,引用和指针都属于字面值类型,自定义类,IO库,string类型不属于字面值类型,也就不能被定义为constexpr。
函数体内定义的变量并非存放在固定地址内,因此constexpr指针不能指向这样的变量
处理类型
类型别名:
using SI = Sales_item; //SI 是 Sales_item 的同义词
auto 类型说明符
用auto来让编译器替我们去分析表达式所属的类型
复合类型,常量和 auto
编译器推断出来的auto类型有时候和初始值的类型不是完全一样,编译器会适当的改变结果类型使其更符合初始化规则
auto 一般会忽略掉顶层 const,保留底层 const
defltype 类型指示符
希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量
decltype 说明符可以选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型,但是不实际计算表达式的值
decltype(f()) sum = x; // sum的类型就是函数f的返回类型
编译器并不实际调用函数f,而是使用当调用发生时 f 的返回值类型作为 sum 的类型
如果 decltype 使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层 const 和引用在内)
decltype 和 引用
如果 decltype 使用的表达式不是一个变量,则 decltype 返回表达式结果对应的类型
预处理器概述