1.
int i=42;
int *pi=0;//pi被初始化,没有指向任何对象
int *pi2=&i;
pi2=0;//pi2不指向任何对象
2. 对于两个类型相同的合法指针,可以用==或!=来比较它们,比较的结果是布尔类型。
3. void*是一种特殊类型的指针,可以存放任意对象的地址。
4.指针是指向另外一种类型的复合类型
引用是对象的别名
5. int* p1,p2;//p1是指向int的指针,p2是int.
6. 引用本身不是一个对象,因此不能定义指向引用的指针,但指针是对象,所以存在指向指针的引用。
7.面对一条比较复杂的声明语句,从右向左阅读有助于弄清真实含义。
int i=42;
int *p;
int *&r=p;//首先r是一个引用,然后是一个int指针类型的引用。
8.const对象一旦创建后其值就不能被改变,创建时必须被初始化。
初始化常量引用时允许用任意表达式作为初始值。
int i=42;
const int &r1=i;
9. 常量指针:不变的是指针本身而非指向的那个值
int errNum=0;
int *const curErr=&errNum;
顶层const表示指针本身是个常量,底层const表示指针所指的对象是一个常量。
顶层const可以表示任意的对象是常量,这一点对任何数据类型都适用。
底层const则与指针和引用等复合类型的基本类型部分有关。
指针类型既可以是顶层const也可以是底层const.
int i=0;
int *const p1=&i;//顶层const
顶层const不受什么影响,但底层const的限制不能忽视。
10. 常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。
const int sz=get_size();//sz不是常量表达式,因为具体值要在运行时才能获取到。
11.允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。
声明为constexpr的变量一定是个常量,且必须用常量表达式初始化。
constexpr int sz=size();//只有当size是一个constexpr函数时才是一条正确的声明语句。
一般将类型比较简单,值也显而易见、容易得到的类型称为字面值类型。
算术类型、引用和指针都属于字面值类型。
一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象。
函数体内的变量一般来说并非存放于固定地址之中,因此constexpr不能指向这样的变量,而定义与所有函数体之外的对象其地址不变,能用来初始化constexpr指针。
限定符constexpr只对指针有效,与指针所指的对象无关。
constexpr int *q=nullptr;//q是一个指向整数的常量指针
constexpr吧它所定义的对象置为了顶层const.
12.
typedef double *p;//p是double*的同义词
using SI=Sales_item;//SI是Sales_item的同义词
13.auto类型说明符能够让编译器去分析表达式所属的类型。auto定义的变量必须有初始值。
auto能在一条语句中声明多个变量,但该语句中所有变量的初始基本数据类型必须一样。
auto一般会忽略顶层const,保留底层const.
14.decltype选择并返回操作数的数据类型。
const int ci=0 &cj=ci;
decltype(ci)x=0;//x的类型是const int
decltype(cj)z;//z是一个引用,必须初始化。
delctype((var))的结果永远是引用。
15.
struct Sales_item{}accum,trans;
struct Sales_item{};
Sales_item accum,trans;
可以为类的数据成员提供类内初始值用于初始化数据成员,没有初始值的成员将被默认初始化。
类内初始值不可用圆括号。