1. 初始化:在创建的时候同时赋值
1) 初始化中的"="与赋值的"="意义不同
2) 定义一个变量,如果不赋初值
内建类型:函数外定义的初始值为0,函数内定义的不初始化(为undefined,复制或者操作该对象会出错)
2. 声明和定义
1) 带有赋初值的声明(declaration)为定义(definition)
2) 赋初值会覆盖extern,比如extern double pi = 3.14,该语句为definition,
但是该语句只能出现在函数外,出现在函数内会报错。
3) 多文件共享同一个变量,只能在其中一个文件定义(define),而在其他文件中进行声明(但不能定义)
3. 符合类型
1) 引用:引用必须进行初始化,只能绑定一个对象,且绑定后不能再次绑定其他的;本身不是对象
2) 指针:可以不初始化,在声明周期能指向不同的对象;本身也是对象
空指针:int* ptr = nullptr / 0 / NULL
(NULL是通过预处理器转换为0,现在最好使用nullptr)
void*指针:可以指向任意类型的地址,但是可操作的类型少,比较、作为参数传递、返回等,而不能通过它改变所指向的地址的值
指针无法指向引用,因为引用不是对象;而引用可以作为指针的别名
4. 定义变量特殊情况
1) 多个变量:int* p1, p2; p1是指针,p2是整型变量
2) 引用指针,int *&r; 查看一个变量的类型,从右往左读,最接近的一个就是它的数据类型
5. 常数据类型
1) 仅能进行那些不会改变其值的操作
2) 本地变量需在声明时赋初值;extern共享变量可以在头文件声明,在源文件中赋初值
3) const int * p; //指向常量的指针 const int *const p; //指向常量的常指针
6. 类型别名:
两种定义类型别名的方式:typedef int iint; using iint = int;
7. 新的类型指定方式
1) auto告诉编译器从初始值推断出数据的类型,而不用自己去指定;
auto item = val1 + val2;
2) decltype根据表达式来推断类型; decltype(f()) sum = x;则sum的类型由表达式f()决定