变量
* 类型
基本类型(9种)
◆ 整型
布尔型
布尔型(bool) - true/false
字符型 - 转义字符
字符型(char) 'a'
宽字符型(wchar_t ) L'a'
整型 - 四种表达方式(二进制,八进制,十进制,十六进制)
短整型(short)
整型(int) 1(默认为int)
长整型(long) 1L或者1l
◆ 浮点型 - 两种表达方式(十进制和科学计数法)
单精度浮点型(float) 1.1F或1.1f
双精度浮点型(double) 1.1(默认为double)
长双精度浮点型(long double)
复合类型(7种)
数组
指针*
引用&
非常量左值引用、常量左值引用、非常量右值引用、常量右值引用
以int为例:int&,const int&,int&&,const int&&
共用体(union)
枚举(enum)
结构体(struct)
结构体大小
遵循两个原则+处理器架构+编译器
两个原则
1.结构体每个成员的偏移量是该成员最大对齐方式的整数倍,即offset(member)/align(member)=整数;
2.结构体总大小是该结构体最大对齐方式的整数倍,即sizeof(struct)/align(struct)=整数;
编译器
/* 编译器指定最大对齐方式为1 */
#pragma pack(push)
#pragma pack(1)
// 定义结构体
#pragma pack(pop)
自身对齐值:基本数据类型的变量就是其本身所占字节大小,复合类型的最大对齐值;
指定对齐值:由#pragma pack(value)指定的对齐值value;
有效对齐值:自身对齐值和指定对齐值中较小的值。
类(class)
▶ STL模板类
☞ 序列容器
vector - stack
list
deque - priority-deque/queue
☞ 关联容器
set/multiset
map/multimap
unordered_map/unordered_multiset/unordered_set/unordered_multiset ---> 无序容器(c++11)
PS:对于自定义key,需提供hash函数和比较函数
☞ 函数类
▶ 标准类
std::string
▶ 自定义类和自定义容器
自定义容器
- 容器方法begin,end,size
- begin和end返回迭代器
- 迭代器操作符operator!= operator++ operator*
- 迭代器能定位
STL中最精简容器:std::initializer_list<T>
在构造函数中使用该容器,可以用初始化列表
特殊类型
void
* 标识
数字、字母和下划线组成,不能以数字开头,大小写敏感
* 限定
static
extern 默认
mutable
const - 默认为static const,如需外部引用需显式指定extern const
volatile - 易变性,不可优化性,顺序性(保证编译器语句顺序,不能保证cpu顺序执行)
unsigned(U/u)
类型推导(c++11)
auto
类型指示符,提示编译器对此类型的变量做类型的自动推导。
推导规则:
- 当不声明为指针或者引用时,auto的推导结果和初始化表达式抛弃引用和cv限定符后的类型一致;
- 当声明为指针或者引用时,auto的推导结果将保持cv属性;
// 不声明指针或者引用
int i0 = 1;
int& i1 = i0;
auto i2 = i1; // auto -> int (初始化表达式类型为int&,抛弃了引用后是int)
// 声明指针或者引用
int i3 = 1;
const int& i4 = i3;
auto& i5 = i4; // i5 -> const int& (初始化表达式类型为const int&,保留const属性)
推导限制
- 函数参数类型
- 模板
- 结构体非静态成员
decltype
推导出表达式的类型,编译期完成
推导规则:
- 标识符和类访问表达式,decltype(exp)和exp表达式类型一致;
- 函数调用,若是非类类型纯右值忽略cv,否则跟返回值保持一致;
- 其他运算表达式,若是左值decltype(exp)和exp类型的左值引用一致,否则和exp类型一致;
初始化列表
普通数组
POD(平凡和标准布局)
判断:std::is_pod<T>::value
好处:
- 字节赋值,可以使用memset和memcpy等内存操作
- 与c内存布局兼容,C和C++直接操作安全
平凡 std::is_trivial<T>::value
平凡的默认构造函数和默认析构函数
平凡的默认拷贝构造函数和默认移动构造函数
平凡的默认拷贝赋值函数和默认移动赋值函数
无虚函数和虚基类
标准布局 std::is_standard_layout<T>::value
有待完善。。。
容器和std::initializer_list构造的类