第2章.变量和基本类型
bit(比特、位):非0即1
byte(字节):可寻址的最小内存块,大多由8bit构成
word(字):存储的基本单元,4或8字节
一. 基本内置类型
1. signed和unsigned
① 特殊:与其他内置类型不同,char类型不等同于signed char,由编译器决定其为signed还是unsigned
② 赋值溢出:赋给带符号变量超过其范围的值,结果是未定义的;赋给无符号变量超过其范围的值,结果是对该无符号类型表示的数值总值取模后的余数
③ 类型转换
2. 字面值常量
- 十进制字面值常量的类型为int、long、long long中能容纳该值的尺寸最小类型,除非有u、l、ll等后缀
- 八进制和十六进制字面值常量(如:0123、0x2f等)为int、unsigned int、long、unsigned long、long long、unsigned long long中能容纳该值的尺寸最小类型
- 浮点字面值常量(如:1.08e2、1.08E2、.3、2.、1.34f、1.34l等)默认为double
- 字符串字面值常量实际上是由常量字符组成的数组,编译器会在每个字符串的结尾处添加一个空字符’\0’
- 泛化的转义字符:/后面1-3位8进制数字(如/123),/x后面1-多个十六进制数字(如/x4d)
- bool:true、false
- 指针:nullptr
二. 变量
1. 初始化
初始化不同于赋值:初始化是创建变量时赋予其一个初值,而赋值则是把对象的当前值擦掉,以一个新值代替。
初始化方式 | 例子 | 说明 |
---|---|---|
拷贝初始化 | int a = 2; | 只能提供一个初始值 |
()初始化 | int a(2); | 类内的初始化不能用该样式 |
列表初始化 | int a{2}; vector<int> a = {2, 3} | 如果存在信息丢失的风险,编译器会报错,如int a = {3.14}; 如果提供的是初始元素值的列表,应使用该方式,如vector |
2. 变量声明extern
变量声明一般放在头文件中。
extern int value;
任何含有显式初始化的声明将会成为定义。
3. 标识符
4. 全局作用域、块作用域;内层作用域、外层作用域
三. 复合类型
int value = 100;
基本数据类型 | 声明符 | 变量名 |
---|---|---|
int | * | pointer |
double | & | reference |
1. 引用
引用必须在定义时即被初始化,之后无法令其重新绑定
int value1 = 100;
int value2 = 200;
int &reference = value1;
reference = value2; // 这句话并不是将引用reference重新绑定至value2,而是相当于value1 = value2;
2. 指针
指针(及引用)的类型要和它指向(引用)的对象类型严格匹配。
例外:具有底层const的指针(或引用)可以指向(或引用)非const对象。
const int constValue = 3;
int value = 4;
int &ref1 = constValue;// Error
const int &constRef1 = constValue;
const int &constRef2 = value;空指针
nullptr、NULL、0
野指针
解指针:解指针得到其所指向的对象
int integer = 3;
int *pointer = &integer;
*pointer = 10;
四. const
const对象必须初始化,且初始化之后其值不能再改变
1. extern
默认情况下,const对象被设定为仅在文件内有效
如果想要在其他文件中使用,则必须在定义和声明的时候都加上extern
2. 顶层const和底层const
顶层const,表示对象本身(这里是指针)是个常量
int *const pointerHaveTopLevelConst = &unConstInteger;
底层const,表示指针指向的对象是个常量(即便不是常量也当做常量解引用后不能改变其值)
const int *pointerHaveLowLevelConst = &constValue;
拷贝不能忽略底层const。但是没有底层const的指针(或引用)可以被拷贝给具有底层const的指针或引用。
拷贝忽略顶层const。
3. constexpr和常量表达式
常量表达式:值不会改变,在编译期间就能得到计算结果
constexpr和const的不同之处在于,前者编译器会验证变量的值是否是一个常量表达式
五. 处理类型
1. 类型别名
typedef int number;
typedef double *pointerToDouble;
using pointerToInt = int *;
特别注意,下语句表示的时一个具有顶层const还是底层const的指针
const pointerToInt pointer = &value;
2. auto类型说明符
- 使用auto会忽略顶层const,如果希望保留则使用const auto
- 底层const会被保留下来
- 使用auto在同一条语句声明多个变量,这些变量的数据类型必须相同
3. decltype类型指示符
- 引用从来都作为其引用对象的同义词出现,仅在decltype是一个例外
- decltype(*pointer) 表示的是一个引用类型
- decltype((value)) 表示的引用类型
六. 自定义数据结构
头文件通常包含那些只能被定义一次的实体,如类、const和constexpr变量等
头文件保护符