C++ Pirmer 读书笔记-第二章

来源:互联网 发布:java的tostring方法 编辑:程序博客网 时间:2024/05/29 19:56

C++ Pirmer 读书笔记-第二章

 121人阅读 评论(0) 收藏 举报
读书c++编译器headerfloattypes

 第2章 变量和基本类型

⒉⒈ 基本内置类型
⒈ 算数类型(arithmetic types):表示数值(即整数和浮点数)的类型

⒉⒈⒈ 整型
⒈ 整型(Integral Types):表示整数、字符和布尔值的算数类型。包括:
⑴ 
char: 字符型,通常单个机器字节,最小8
wchar_t:
宽字符型,最小16
用于扩展字符集,如汉字和日语
⑵ short:
短整型,通常半个字长,最小16
由于范围较小容易越界,执行整型算数运算时很少使用
int:
整型,通常1个字长,最小16位,大多数机器使用32位表示
用于整型运算时不易出错
long:
长整型,通常12个机器字长,最小32
对用32位表示 int 而用64位表示 long 的机器,后者代价远高于前者,使用时如何选择应视情况而定
⑶ bool:
布尔型,赋值时0值算数类型为 false, 其余为 true
⒉ 带符号(signed)和无符号(unsigned)类型
⑴ 带符号类型可以表示正数、0和负数; 无符号只能表示非负数
⑵ int,short,long 都默认为 signed
⑶ char 有3种不同类型: 普通, unsignedsigned, 但只有2种表示方式
char 使用哪一种表示方式由编译器决定
⒊ 整型值的表示
⑴ unsigned 型中,所有位都用来表示数值
⑵ signed 型如何用位由编译器决定。常见策略为使用其中一个位作符号位,该位为1则值为负,为0则值为0或正
⒋ 将一个越界值赋给一个指定类型的变量时:
⑴ 若类型为 unsigned, 编译器通过对越界值取模来满足要求
⑵ 若类型为 signed, 行为未定义

⒉⒈⒉ 浮点型
⑴ float:
单精度浮点数,一般一个字长,最小6位有效数字
其可能的精度损失不可忽视
⑵ double:
双精度浮点数,一般两个字长,最小10位有效数字
其计算代最小8位价与 float 相当,使用它基本不会错
⑶ long double:
扩展精度浮点数,一般三或四个字长,最小10位有效数字
其提供的额外精度往往无必要,且需承担额外的运行代价

⒉⒉ 字面值常量
⒈ 整数字面值
⑴ 定义字面值整型常量可以使用十进制、八进制(以0开头表示)和十六进制(以0x或0X开头表示)中的任意一种
⑵ 默认为 int 或 long 型(值适合 int 就为 int 型,比 int 大最小8位就为 long 型)
⑶ 数值后加上后缀 U, L, UL 分别表示 unsignedlongunsigned long
⒉ 浮点数字面值
⑴ 可以使用普通的十进制表示法或科学计数法表示。使用后者时,用E或e来标示指数
⑵ 默认为 double 型
⑶ 数值后加上后缀 F, L 分别表示 floatlong double
⒊ 布尔字面值: truefalse
⒋ 字符字面值
⑴ 通过用单引号引起的字符或转义字符定义
⑵ 前面加上L表示wchar_t型
⑶ C++中定义的转义字符有:
/’ 单引号
/” 双引号
// 反斜杠
/0 空字符
/a 响铃
/b 后退
/f 走纸
/n 换行
/r 回车
/t 水平制表符
/v 垂直制表符
/oct 编号为oct的字符(oct表示一个八进制数,不必以0开头)
/xhex 编号为hex的字符(hex表示一个十六进制数,不以0x或0X开头)
⒌ 字符串字面值
⑴ 通过用双引号引起的若干个字符或转义字符定义
⑵ 类型为以 NULL 结束的 const char 型数组(结尾的空字符由编译器自动添加)
⑶ 前面加上L表示宽字符串面值
⑷ 两个相邻的仅由空格、制表符或换行符分开的(宽)字符串面值,可连接成一个新(宽)字符串字面值
这一特性可用于处理长字符串字面值
试图连接一个字符串字面值和一个宽字符串字面值将导致未定义行为
⑸ C++代码中,在一行末尾加反斜线符号(其后不可再出现空格或注释)可将该行与下一行当作同一行处理(因此第二行可能不允许有正常的缩进)
这一特性也可用于处理长字符串字面值,但并不常用

⒉⒊ 变量
⒈ 左值(lvalue)和右值(rvalue)
⑴ 左值:可以出现在赋值操作的左边或右边的值。非 const 左值可读可写。
⑵ 右值:可以出现在赋值操作右边但不能出现在左边的值。可读不可写。
变量是左值
⒉ 变量名,可由字母或下划线开头,用字母、数字和下划线组成;大小写敏感
⒊ 变量的定义
⑴ 变量的定义为变量分配存储空间,还能同时指定其初始值。在程序中,一个变量有且仅有一个定义
⑵ 变量的初始化
① 提供初始化式时,支持两种初始化形式:
a. 复制初始化:用等号(=) (注:不是赋值)
b. 直接初始化:将初始化式放在括号中;更灵活,效率更高
对内置类型而言,二者几乎没有差别;对类类型而言,有时必须用后者
② 不提供初始化式:
a. 对内置类型变量:在函数体外定义的自动初始化为0,在函数体内定义的不进行自动初始化
b. 对类类型变量:若该类提供默认构造函数则调用它,否则必须提供显式初始化式
③ 同时定义多个变量时,以上各种初始化形式(包括不提供初始化式)都可混用;可以用同一定义中前面已定义变量的值给后面的变量初始化
⑶ 在变量首次使用处定义变量往往能增加代码可读性,减少开销
⒋ 变量的声明
⑴ 变量的声明向程序表明变量的类型和名字。声明可以在程序中出现多次。定义也是声明
⑵ 使用 extern 关键字可声明一个变量而不定义它,常用于使数据横跨多个文件的作用域
⑶ 若声明有初始化式,则被当作定义,即使使用了 extern 关键字也一样
⑷ 在全局作用域中定义的非 const 对象在整个程序的各个文件中都可见,只要在其它文件中声明它就可以访问;
但全局作用域中的 const 对象默认为其定义所在文件的局部对象,只有在定义前指定它为 extern 才能在其它文件中访问

⒉⒊⒍ 名字的作用域
⒈ 作用域(scope):程序的一部分,名字在其中有意义。
C++中的作用域有以下几种:
⑴ 全局:名字定义在任何其他作用域外
⑵ 类:名字由类定义
⑶ 命名空间:名字在命名空间中定义
⑷ 局部:名字在函数中定义
⑸ 块:名字定义在语句块中(即定义在一对花括号里)
⑹ 语句:名字在语句(如 if 、 while 、 for 语句)的条件内定义
⒉ 作用域可嵌套,外层作用域的名字在内层可见。内层作用域中的名字可以屏蔽(hide)外层中同样的

⒉⒌ 引用
⒈ 引用(reference)是一种复合类型(即用其它类型定义的类型),表示另一个(非引用)对象的别名,对它的所有操作都直接作用在该对象上
引用主要用作函数形参
⒉ 引用定义格式为
类型名& 标识符
( 数组的引用定义格式: 类型名 (&标识符)[维度]
指针的引用定义格式: 类型名*& 标识符         )
同时定义多个引用时每个引用的标识符前都要加&(以及[维度]和*)
定义引用必须用对应类型的对象初始化,表示绑定到该对象,且一经绑定不可更改
⒊ const 引用是只读的,可以绑定到不同但相关类型的对象,也可绑定到右值;
非 const 对象只能绑定到与该引用同类型的对象

⒉⒍ 定义类型名
⒈ typedef 用于定义一个类型的同义词。定义格式为:
typedef 类型 标识符;
⒉ 常为以下3种目的使用 typedef :
⑴ 隐藏特定类型实现,强调使用类型的目的
⑵ 精简类型定义以便理解
⑶ 多次使用同一类型,保持每次使用目的明确

⒉⒎ 枚举
⒈ 枚举(enumeration)类型由一组枚举成员(enumerator)组成
其中每个枚举成员都有自己的名字,初始化为整型 const 值(值可重复,但初始化后不能修改)
⒉ 定义格式: enum 枚举类型名 {用逗号分开的枚举成员列表};
可以用常量表达式通过赋值操作符为列表中某些枚举成员提供初始值,未提供初值的默认每个值比前一个大1(第一个默认为0)
⒊ 每个 enum 都唯一定义一种类型,枚举类型的对象初始化或赋值时只能通过该类型的枚举成员或另一对象进行

⒉⒐ 头文件
⒈ 因为头文件包含在多个源文件中,故一般只应包含对象和函数的声明而不包含定义,但以下除外:
⑴ 类
⑵ 用常量表达式初始化的 const 对象
(若不是用常量表达式初始化,则应和其它对象一样在一个文件中定义并初始化,并在头文件中添加 extern 声明以便多文件共享)
⑶ inline 函数
以上都可以在多个文件中定义(只要定义一致)。需要在头文件定义是因为编译器需要它们的定义来产生代码
⒉ 预处理器
⑴ #include 只接受一个头文件名作为参数
头文件名在尖括号中被认为是标准头文件,编译器将在预定义位置查找
头文件名在引号中被认为是非系统头文件,通常在源文件所在位置查找
⑵ 可使用预处理器定义头文件保护符(header guard)避免多重包含,如:
#ifndef XXX_HEADER_H
#define XXX_HEADER_H
// 头文件内容,包括类等的定义
#endif

0 0
原创粉丝点击