东阳的学习笔记
第二章:变量和基本类型
- 基本类型表
- 类型的选择:
- 在明知数值不可能为负的情况下,选用无符号类型
- 在算术表示式中不要使用char、bool
- 执行浮点数运算使用double,一是因为float精度不够;而是因为计算代价相差无几,甚至有些设备上double更高
- 避免无法预知和依赖于实现环境的行为(C++标准所未定义的)
- 避免无符号数和有符号数混用
- C++中初始化和赋值是两个完全不同的操作。(赋值往往是先初始化在赋值)
- 列表初始化可以防止精度丢失
- 全局的变量会被默认初始化,定义在函数体内部的对象将不会被初始化(未初始化的变量含有一个不确定的值)
- 对所有的指针进行初始化
- 空指针(nullptr, 0, NULL),C++中建议使用nullptr
- void*指针, 可以存放任何类型的指针
- const 的顶层和底层(顶层指指针本身是个常量,底层指指针指向的对象个常量)
- const对象默认只在本文件中有效,若要在其他文件中共享,则需要加extern
- auto一般会自动忽略顶层const, 如果需要顶层const,需要明确指出
- decltype的表达式如果加上括号,则是引用
第三章:字符串、向量和数组
- 头文件不应该包含using,避免include进自己不知道的声明
- 直接初始化和拷贝初始化(如果初始化要用到的值有多个,一般来说只能使用直接初始化的方式)
- cin 与 getline: getline会丢弃换行符
- 字符串字面值与string对象是不同的对象,字面值类型不能直接相加
- C++并不对下标进行检查,注意!
- 模板并不是类型
- 注意列表初始化和()和区别
- 在使用vector时不必设定其大小,可能会起到反作用
- 基于范围的for循环中不要想容器中添加元素
- iterator (读 and 写)和 const_iterator(只能读不能写) begin和end根据对象类型自己选择
- 迭代器就是指针
- 数组的指针和引用(这个看代码,直到理解)
- end返回尾后指针
- 使用引用可以避免数组降级(基于范围的for循环)
第四章:表达式
- 尽量不要写有表达歧义的表达式(如果一个地方改变了某个运算对象的值,表达式的其他地方就不要再用了)
- 逻辑运算符的短路求值
- 赋值运算符返回符号左端的运算符
- *pbeg++ 等价于*(pbeg++)
- 对string对象或者vector对象使用sizeof会返回类型固定分布的大小,而不是实际占用的大小
- 隐式转换的过程中,编译器会往尽可能避免精度损失的方向转化
- 整型提升 和 避免有/无符号数的混用
- 显式转换,static_cast(类型明确时使用)、const_cast(将常量对象转换为非常量对象,常使用在函数重载中)
- 尽量避免使用强制类型转换
- 运算符优先级表(P147)