2.1 基本内置类型
- 算术类型
类型 | 尺寸 |
---|---|
char | 8位 |
wchar_t | 16位 |
char16_t | 16位 |
char32_t | 32位 |
float | 6位有效数字 |
double | 10位有效数字 |
long double | 10位有效数字 |
一个字节(byte)由8 Bit构成,一个字(Word)由2个字节构成。
通常float 1个字,double 2个字,long double 3-4个字。
无符号类型的运算
- 当一个表达式中既有带符号类型又有无符号类型数,一般转化为无符号类型的数,而一旦产生负的无符号类型数,则取模。
- char有时是带符号有时是无符号,一般由编译器决定,故不要用char获取一个小整数。
字面值
- 进制
0开头表示8进制,0x开头表示16进制。 - 小数
科学计数法以小数加e加整数表示。 - 字符及字符串
若干个字符串字面值之间,如果只有空格、制表符(/t)和换行符(/n)存在,那么他们会被自动连接为一个新的字符串字面值。 - 显示指定的字面值类型
- 前缀
- u: char16_t
- U: char32_t
- L: wchar_t
- u8: char
- 后缀
- 整型
- u or U: unsigned
- l or L: long
- ll or LL: long long
- 浮点型
- f or F: float
- l or L: long double
- 整型
- 前缀
- 进制
2.2 变量
初始化
- 方法:直接初始化, 复制初始化, 列表初始化(存在精度丢失会报错)。
- 初始化与赋值有本质区别
- 默认初始化
- 函数体外被初始化为0
- 函数内部的内置型不被初始化,任何调用为未定义。
- 类的数据成员 如果没有人为指定初始值的情况下,会被默认初始化。
声明与定义
- 加extern前缀表明是声明。
- 声明可以多次但定义只能一次。
- 一旦声明的变量被初始化即被定义。
- 区分声明和定义的关键在于是否分配了内存空间。
2.3复合类型
- 引用:初始化一个引用变量必须是一个对象。
- 指针
- 空指针的初始化方法
- 字面值nullptr
- 预处理变量NULL,定义在
- 任何直接把变量赋值给指针都是错的,即使变量值为0。
- void*指针
- 特征
- 可以与其他指针比较,可以作为函数的输入输出,可以赋值给另一个void*。
- 不可以访问指向对象的值
- 可以通过显式转换类型使其转化为任意类型指针,从而访问指向对象。
- 有趣的现象:delete一个void*指针会给出警告。
- 特征
- 存在对指针的引用,但不存在指向引用的指针(因为引用本身不是一个对象)。
- 出现复杂的定义,通常由内向外阅读(int *&r表示一个指针的引用)。
- 空指针的初始化方法
2.4 const限定符
extern const
- 原由:const对象在属于文件(不同于非const对象),不支持文件间的互相访问,而有时恰恰有互相访问的需求。
- 解法办法:无论定义和声明,const前添加extern关键字。
const与引用
允许把const引用绑定到普通对象,但不允许普通引用绑定const对象。顶层const与底层const之分
- 顶层const:限定此变量本身的值不能够被修改(所以要求声明时就初始化)。
- 底层const:限定不能通过此变量修改它指向或者引用的变量(专门限制引用和指针的)。
int i=0; int *const p1 = &i; //p1的值(指向)不能修改,顶层const const int ci = i; //同上,顶层const const int *p2 = &ci; //不能通过p2修改ci,底层const const int *const p3 = p2; //底层const,顶层const const int &r = i; //不能通过r修改i,底层const
- constexpr
- 通过将变量声明为constexpr来表示此变量的值是一个常量表达式。
- constexpr 指针类似于于顶层const指针(指向不能改变),而且它只能指向全局变量或者静态变量,以及nullptr或NULL。
2.5处理类型
类型别名
typedef
typedef double wages; typedef wages base, *p;
using(据说是用来解决typedef与模板的某些问题的)。
auto运算符:自动推断类型
- 忽略顶层const,保留底层const。
- 忽略引用类型,保留值类型。
- auto类型的引用会保留初始化值的顶层const属性
const int ci = 0; auto a = ci; //a是int const auto b = ci; //显式声明b为const auto &r = ci; //r是const引用 const int &ri = ci; auto rc = ri; //rc是int auto &rd = ri; //显式要求rd初始化为引用
- decltype
- 返回表达式的类型,不实际计算表达式
- 只有在被decltype调用时,引用才不返回其绑定的对象,即decltype会得到引用类型。