1-基本内置类型
- char类型, 应该确保可以存放机器基本字符集中任意字符对应的数字值。
float
和double
分别有7和16个有效位(long double
根据硬件,和需求不同,精度不同)。- 字符型分为三种:
char
,signed char
,unsigned char
。
选择类型的经验:
1. 明确数值不为负,选择无符号类型。
2. 使用int不使用short。
3. 浮点运算用double,不用float(计算代价相差无几)。
类型转换
bool b = 42; //b为true
int i = b; //i的值为1
unsigned char c = -1; //假设char占8bit,c的值为225
- 赋值给无符号类型一个超出它表示范围的值时,
结果时初始值对无符号类型表示数值总数取模的余数。 -1%256=255
- 负数b对a取摸,在b上加a,知道b变为正数,再用这个正数对a取摸。
- 取摸方法: 1. 求整数商 c=a/b 2.得余数r=a-c*b
- ps: c++中取摸同取余, python中是真正的取摸
一个算数表达式中既有无符号数
又有int
时,int值转换为无符号数。把负数抓换为无符号数结果等于这个负数加上无符号数的模。切勿混用带符号类型和有符号类型。
字面值常量
以0
开头的整数代表八进制,0x
或0X
开头代表十六进制。八进制和十六进制字面值可以使带符号的。short
类型没有对应字面值。默认的浮点类型字面值是double
。
字符和字符串 如果两个相邻的字符串字面值仅由空格,缩进和换行符分割,他们实际是一个整体。
转义序列 形式:\x
后面紧跟一个或者多个十六进制数字,\
后紧跟1-3个八进制数字。无十进制转义序列。
使用前缀或者后缀,可以改变字面值的默认类型(p37 表2.2)。nullptr
是指针字面值。
2-变量
std::string
代表string
是在命名空间std中定义的。
在C++中,初始化和赋值是两个概念。初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,以一个新值代替。
- 列表初始化 初始值存在丢失风险是,编译器报错
int a = {0};
int a{0}; - 一般初始化?
int a(0); int a = 0; - 默认初始化 定义于任何函数之外的变量被初始化为0。定义于函数内部的内置类型将不被初始化。
分离式编译
C++将声明和定义区分开来。__声明__使名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对呢个名字的生命。__定义__负责创建与名字相关联的实体。
如果想声明一个变量而非定义它,在变量名前面添加关键字extern
,而且不要显式初始化。
extern int i; //声明而非定义
int j; //声明且定义, 默认初始化为0
如果多个文件中包含同一个变量,必须将声明和定义分离。声明可以多次,但定义必须只能有一次。
标识符规范
用户自定义的标识符中不能出现连续两个下划线的情况,也不能以下划线紧接着大写字母开头。定义在函数体外的标识符不能以下划线开头。
- 变量名一般用小写字母, 自定义类名一般以大写字母开头。
名字的作用域
C++大多数作用域以花括号分隔。名字的作用域始于声明的语句,名字所在作用域末端结束。
3-复合类型
引用
引用,为对象起了另一个名字。引用必须被初始化。 程序把引用和它的初值__绑定__在一起,而不是拷贝. 无法让引用重新绑定到另一个对象,因此必须被初始化. (引用被使用的情况,后续汇总)::
引用必须绑定在对象上,不能与字面值或者某个表达式的计算结果绑定在一起. (2.4.1相熟原因)
指针
__空指针__不得到任何对象, 得到空指针的方法就是用字面值nullptr
来初始化指针.
int *p1 = nullptr; // 等价于 int *p1 = 0; int *p1 =NULL;
int zero = 0; p1 = zero; //错误: 不能讲int变量直接赋值给指针.
如果两个指针存放的地址值相同,则他们相等.
void*
指针
void*
可以用来存放人以对象的地址. 它用法比较有限: 和其它指针比较,作为函数的输入输出,复制给另一个void指针. 不能直接操作void*
指针所指对象,因为我们并不知道这个对象时什么类型(19.1.1).从void*的角度来看,内存空间仅仅是内存空间,没办法访问到空间内的对象.
复合类型声明
int *p1, p2; //p1是指针, p2p2时int
int *p; int* p;
//推荐给将*或者&与变量名连在一起.
指向指针的引用
引用本身不是一个对象,所以没有指向指针的引用.
int *p;
int *&r = p; //r是一个对指针p的引用
要理解r的类型究竟是什么,最简单的方法时从右向左阅读r的定义. 距离变量名最近的符号对变量类型有最直接的影响.
面对一条复杂的声明时,从右向左,从内向外的阅读有助于理解真实含义. 就近原则?