要理解某个变量的类型,从右向左读
指针定义即初始化,若不清楚指针指向何处应初始化为nullptr或者0;
警惕!类型混用
如:unsigned i = 48888;
int j = -1;
i > j ? false
j 自动转换为unsigned int;
只有同类型之间可比较;
decltype
如果decltype使用的是一个不加括号的变量,则得到该变量的类型,如果变量加了一个或者多个括号,则视为表达式。
decltype((variable))得到变量的引用类型;
auto
auto忽略掉顶层const,保留底层const
如果希望推断出的auto类型为一个顶层const,则需要明确指出:
const int ci = 0;
const auto f = ci;
constexpr
常量表达式是指值不会改变并且在编译过程中就可以得到计算结果的表达式
constexpr变量:便于编译器来验证变量的值是否符合一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
constexpr int sz = size();//只有当size是一个constexpr函数时才是正确的声明语句
const
顶层const:指针本身是一个常量;
底层const:指针所指的对象是一个常量
常量指针必须初始化,而且一旦初始化,其地址不可改变(其所指的对象可以改变)
多个文件中共享const:
file1.cpp
extern const int bufsize = fcn();//定义,只需定义一次
file1.h
extern const int bufsize;//声明
void* 指针
void* 是一种特殊的指针类型,可以存放任何对象的地址。
可做为函数的输入输出,和别的指针比较,赋给另外一个void*指针
引用
引用即别名;
定义引用时,程序将引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和初始值对象一直绑定在一起。无法将引用重新绑定到另外一个对象。引用必须初始化。
初始化:
int units_sold = 0;
int unit_sold = {0};
int unit_sold{0};
int unit_sold(0);