/* Note_book_C++Primer */
预备知识:
第一部分:虚拟机
一、虚拟网络名称:VMnet8
二、Shell 的查看网络 IP 命令(二选一即可):
1. ifconfig
2. ip addr
第二部分:Xshell6 的使用方法
一、快捷键
1. Win + ;
跳出一个表情框,鼠标点击选中其中的一个表情图片输入到当前光标位置。
2. Alt + Enter
全屏 —— 窗口布满屏幕。这是个开关键。
3. Alt + O
添加 terminal 窗口。
4. Ctrl + Tab
当开辟了多个 terminal 窗口时,用该快捷键设置当前的活动窗口:在这些窗口之间从左向右顺次跳移,以
设置需要的活动窗口。
5. Ctrl + Shift + Tab
与 Ctrl + Tab 的作用相同,区别在于设置活动窗口的顺序为从右向左跳移。
6. Shift + Tab
在当前 terminal 窗口和前一个 terminal 窗口之间交互跳移。
二、移动 terminal 屏幕窗口的方法 —— 使用鼠标拖动的方式
当打开了超过一个 terminal 窗口时,如果想要将其中某个 terminal 窗口移动到另一个 terminal 窗口的
旁边,只要鼠标左键选中要移动的 terminal 窗口,并按住鼠标左键不放,再拖动该 terminal 窗口到需要到达
的目标位置即可。这样就无需关闭 terminal 窗口后,再重新打开一个新的 terminal 窗口。
第三部分:Linux 的用法
一、在 Linux 的 shell 中显示 ASCII 码的方法(在 shell 命令行输入下面的命令):
man 7 ascii
该命令将显示 ASCII 码的 man 页。
二、一次性创建多级目录的命令:
mkdir -p <dir_1-1>/<dir_1-2>/.../<dir_1-N> <dir_2-1>/<dir_2-2>/.../<dir_2-N> ...
三、一次性复制多级目录内容到另一目录中(目录 dir1 中含有子目录):
cp -r <dir1> <dir2>
如果 dir2 不存在,则会自动创建它后,再将 dir1 中的内容(不含 dir1 本身)复制到 dir2 目录中。
四、一次性输出显示指定目录及其下级目录的全部内容:
ls -R <dir>
如果目录 dir 有下级子目录,则会显示 dir 目录及其子目录的内容(如果含多级,则各级均显示)。
第四部分 Vim 的用法
一、Vim 编辑器的使用(摘录自王桂林老师的《零基础 C 语言入门》,其中标签编号是所引录的该书章节号)
(以下命令中的前置字符 “:”,是 vi 编辑器的 ex 命令类型所特有的命令引导字符,不可以缺省):
2.4.1 vi 编辑器中有三种状态模式:
(进入)vi filename --→ 命 令 模 式 --→ :wq(退出)
i/a/o ↙↗ ESC 键 : ↘↖ 回车键
插入模式 编辑模式
2.4.2 vi 编辑器的启动与退出
命 令 说 明
vi 直接进入编辑环境
vi myfile 进入编辑环境并打开(新建)文件
:q 退出 vi 编辑环境
2.4.3 文件操作
命 令 说 明
:w 保存 vi 编辑器中已打开文件所做的修改
:w myfile 将 vi 编辑器中的内容另存为指定文件名(以 myfile 指代)
:w! myfile 将编辑缓冲区中的数据覆盖一个已存在的文件(以 myfile 指代)
:n w! myfile (若原文件 myfile 已打开,需要先关闭后再执行本命令)1. 若指定行号 n 或指定
:x,y w! myfile 起始行号 x 和截止行号 y(含),则使用指定行号范围内的数据执行覆盖操作。如果
myfile 文件不存在,则创建它,然后执行复制操作,若已存在,则直接执行覆盖操作。
2. 命令字符“w”与“!”之间及“!”与目标文件名 myfile 之间允许不用空格分隔,因为
vi 能分辨命令名各组成要素的界线,但建议添加空格以示区别。
:w >> myfile 将编辑缓冲区中的数据追加到指定文件的末尾
:n w >> myfile 1. 若指定行号 n 或指定起始行号 x 和截止行号 y(含),则使用指定行号范围内的
:x,y w >> myfile 数据执行追加操作。若 myfile 文件不存在,则显示警告信息 Can't open file for
writing,无法保存,若已存在,则执行追加操作。2. 目标文件名称 myfile 与“>>”
之间以及命令字符“w”与“>>”之间都允许不用空格分隔,因为 vi 能分辨命令名各组成
要素之间的界线,但建议添加空格以示区别。
:wq 对 vi 编辑器中的文件进行保存并退出 vi 编辑器
:q! 放弃对文件内容的修改,并退出 vi 编辑器
:e myfile 1. 正在编辑文件时允许不退出 vi 而切换到另一个文件。这时编辑缓冲区原有内容将
丢失,所以要先用“:w”命令将已存在的数据保存到原文件。若已保存原数据,则编辑
指定的文件,若未保存,则显示警告信息而无法执行本命令的操作。若目标文件不存
在,则创建并打开它。2. 若文件名以非字母字符开头,则字符“e”跟文件名之间允许
不用空格分隔,因为 vi 能分辨命令字符各组成要素之间的界线;若文件名以字母字
符开头,则命令名字符“e”和文件名之间必须以空格分隔 —— 否则 vi 不认为字符 e
是命令名的组成部分。
:e! 放弃原来编辑缓冲区内的数据,重新编辑当前文件
:e! myfile 1. 放弃原编辑缓冲区内数据,编辑指定的文件 myfile。若指定切换到的目标文件不
存在,则创建它,并执行命令操作。2. 命令名称字符“e”与 “!”之间及“!”与文件名称
之间都允许不用空格分隔而连续键入,因为 vi 能分辨命令字符的各组成要素之间的
界线。
2.4.4 光标移动操作
在 vi 中,句子是以句号、逗号、问号或感叹号结尾的一个字符串,后面至少跟两个空格或一个新行字符;
vi 所识别的句子必须保证以至少两个空格或一个新行字符结束,而单词之间以一个空格分隔,这样才能使
vi 分辨出光标移动所跨越的是句子还是单词。
命令类型 命令操作 说 明
行内移动光标 h 向左移动光标一个字符
l 向右移动光标一个字符
k 向上移动光标一个字符
j 向下移动光标一个字符
^ 将光标快速跳转到本行的行首字符
0(数字 0) 将光标快速跳转到本行的行首字符(同上)
$ 将光标快速跳转到本行的行尾字符
w 向右移动光标一个单词(词首)
W 向右移动光标一个单词(词首)(含空白符和标点符)
e 向右移动光标一个单词(词尾)
E 向右移动光标一个单词(词尾)(含空白符和标点符)
b 向左移动光标一个单词(词首)
B 向左移动光标一个单词(词首)(含空白符和标点符)
跨行移动光标 ( 向左移动光标到上一个句子的第一个非空白字符
) 向右移动光标到下一个句子的第一个非空白字符
{ 向左移动光标到上一个段落的第一个非空白字符
} 向右移动光标到下一个段落的第一个非空白字符
- 向上移动光标到上一行的开头第一个非空白字符处
+ 向下移动光标到下一行的开头第一个非空白字符处
H 移动光标到屏幕的顶部第一行行首
M 移动光标到屏幕的中间一行行首
L 移动光标到屏幕的最后一行行首
返 回 ``(两个反引号) 将光标返回到光标前一位置所在处
''(两个单引号) 将光标返回到光标前一位置所在行开头
翻 页 Ctrl + f 向下翻整页
Ctrl + b 向上翻整页
Ctrl + u 向上翻半页
Ctrl + d 向下翻半页
文件内跳转 :set nu 在编辑器中显示行号
:set nonu 取消编辑器中的行号显示
1G(gg) 跳转到文件的首行
G 跳转到文件的末尾行
#G 跳转到文件中的第 # 行(# 字符指代一个数字)
# 向下跳至光标所在行下数 # 行(# 字符指代一个数字)
2.4.5 编辑操作
1. 一般编辑操作
命令类型 命令操作 说 明
进入输入模式 i 在当前光标处进入插入状态
I 在当前光标所在行行首进入插入状态
a 在当前光标后进入插入状态
A 在当前光标所在行行尾进入插入状态
o(小写) 在当前行的下面插入新行,光标移动到新行的行首,进入插入状态
O(大写) 在当前行的上面插入新行,光标移动到新行的 行首,进入插入状态
c(n)w 删除当前光标到所在单词尾部的字符,并进入插入状态
c$ 删除当前光标到行尾的字符,并进入插入状态
c^ 删除当前光标之前(不含光标所在字符)到行首的字符,并进入插入状态
删除操作 x 删除光标处的单个字符
(n)dd 删除光标所在向下 n 行
:3,5 d 删除从第 3 行到第 5 行的内容
dw 删除当前字符到单词尾(包括空格)的所有字符
de 删除当前字符到单词尾(不包括单词尾部的空格)的所有字符
d$ 删除当前字符到行尾的所有字符
d^ 删除当前字符到行首的所有字符
J(大写) 删除光标所在行行尾的换行符,相当于合并当前行和下一行的内容
拷贝和粘贴 (n)yy(dd) 复制(yy 为复制,dd 为剪切)当前行整行的内容到 vi 缓冲区
:x,[y] co(m) z 复制(co 为复制,m 为剪切)x~y行,到第 z 行处。另外:“.”(点号)代表当
前行,$(美元符号)代表编辑缓冲区中的最后一行;0(数字零)代表编辑缓冲
区的开头。
p(小写) 读取 vi 缓冲区的内容,并粘贴到光标当前位置(不覆盖文件已有内容)
P(大写) 读取 vi 缓冲区的内容,并粘贴到当前光标所在行的下一行(文件原已有内容下
移相应行数,不会被覆盖)
:[line]r file 将其他文件中的数据插入到当前编辑文件中。line 是当前编辑文件的行号,file
是将要插入到编辑文件的“其他文件”的文件名。命令字符“r”的含义是“read”,意
为读入数据。可用数字“0”作行号,表示编辑缓冲区的开头;用 $ 表示编辑缓冲
区的末尾;省略行号则把新数据插入到光标所在行的次行。文件 file 的名称若
以字母字符开头,则必须在命令名称 r 与文件名之间以空格分隔,否则 vi 无法
分辨命令名和文件名的界线;若文件 file 的名称以数字或下划线等非字母字符
开头,由于 vi 能分辨命令名称 r 与文件名的界线,所以可不用空格将两者分隔
而连续键入命令名 r 和文件名,但建议用空格分隔以利于理解,且更美观。
撤销与恢复 u(小写) 取消最近一次操作并恢复操作结果(可以多次使用 u 命令)
U(大写) 取消对当前整行进行的所有操作
Ctrl + r 对使用 u 命令撤销的操作进行恢复
2. 在 Vi 编辑器内使用 shell 命令
命令操作 说 明
:!command “!”是命令字符,其后的 command 指代一条 shell 命令。只能键入(使用)一条 shell
命令(这其实是暂停 vi 后返回启动该 vi 程序的那个 shell 中),按任意键返回 vi。
:!! 第 1 个“!”是命令字符,第 2 个“!”,代表一条上一次执行的 shell 命令,按任意键返回
vi。
:sh 启动一个新的默认 shell 的副本。若默认 shell 是 bash(或 csh),则启动的也是
bash(或 csh),在该 shell 中可键入任意 shell 命令,直到按 Ctrl+D 键或键入 exit
命令退出该 shell 后,返回 vi。命令“:!sh”与“:sh”是不同的,“:!sh”启动的是一个新的
名为 sh 的 shell(sh 是最早开发的 shell 之一)。
:[line]r !command 把在 vi 编辑器内使用的 command 这一个 shell 命令产生的输出,插入到指定行号 line
所在行的下一行。若省略行号,则插入到光标所在行的下一行(可以使用数字“0”和字符 $
所代表的行号)。本命令是“:[line]r file”和“:!command”两个命令的组合使用。
n!! command 在 n 个行上执行 shell 命令 command。将指定行数据发送给 shell 程序处理,若数据对
shell 的执行无意义,则忽略它,然后删除编辑缓冲区中指定行数据,并将 shell 命令输
出内容插入到原光标所在行下面。n 是要处理的行数,指光标所在行(含)往下数共计需
处理的 n 行;省略 n 则仅处理光标所在行数据;!!(两个感叹号)是命令名称,command
是处理数据所使用的 shell 命令;键入第二个 ! 字符后光标就移到命令行,并回显所有
输入,在按回车键前可使用删除键和键盘方向键修改命令行字符。
!move command 在指定行范围内执行程序 command。该过程与 !! 命令相同,只是在指定行的范围时所使
用的方法不同。move 代表移动光标命令(在实际输入时以具体的移动光标命令取代),它
与 command 之间的空格是语法分隔符,是为分辨命令要素的不同部分而添加,实际输入命
令字符时不需要键入;字符 !(感叹号)是命令名称,command 是处理数据所用的 shell
命令。键入移动光标命令后光标就移到命令行并回显所有输入,在按回车键前可使用删除
键和键盘方向键修改命令行字符。
2.4.6 查找与替换操作
搜索命令匹配项时,忽略大小写、显示部分匹配、高亮显示的设置和取消:
1. 命令字符及其功能:
ic(ignorecase) 查找时忽略字母大小写
noic(noignorecase) 查找时区分字母大小写
is(incsearch) 查找短语时显示短语中的部分匹配
nois(noincsearch) 查找短语时显示短语的全部匹配
hls(hlsearch) 高亮显示所有的匹配短语
nohls(nohlsearch) 取消高亮显示匹配短语
2. 输入命令:
缩 写 完 整
(1) :set ic 或 :set ignorecase
(2) :set noic 或 :set noignorecase
(3) :set is 或 :set incserach
(4) :set nois 或 :set noincserach
(5) :set hls 或 :set hlsearch
(6) :set no hls 或 :set nohlsearch
命令类型 命令操作 说 明
查 找 /word 从上而下在文件中查找字符串“word”
?word 从下而上在文件中查找字符串“word”
n 定位下一个匹配的被查找字符串
N 定位上一个匹配的被查找字符串
替 换 :s/old/new 将当前行中查找到的第一个字符“old”串替换为“new”
:s/old/new/g 将当前行中查找到的所有字符串“old”替换为“new”
:#,#s/old/new/g 在行号“#,#”范围内替换所有的字符串“old”为“new”(# 字符指代一个数字)
:%s/old/new/g 在整个文件范围内替换所有的字符串“old”为“new”
2.4.7 学习工具 vimtutor
在 shell 命令行中输入 vimtutor,默认是英文版的;输入 vimtutor -g zh 则使用中文版。
2.4.8 vim 最简易配置
在用户当前的家目录中,输入“vim ~/.vimrc”,文件 .vimrc 是一个隐藏文件,如果没有该文件则创建它;
在该文件中保存着 vim 的常用配置。以下是该文件的一个内容范例:
"==============================================================
" Sample vi/Vim initiallization file
"==============================================================
"
set nu " 代码显示行号
syntax on " 关键词高亮显示
set cindent " C 语法自动缩进
set autoindent " 新行自动缩进
set shiftwidth=4 " 缩进宽度 4
set tabstop=4 " tab 键宽度 4
set softtabstop=4 " 制表符宽度 4
set nobackup " 不备份
set nohls " 取消高亮显示搜索项
" End
以上为 .vimrc 文件的一种可能的范例内容。
附录:vim 常用快捷键
1. 变量名补齐功能:Ctrl+P
在当前打开的 c 源文件中,输入某个变量的首字符,按下该快捷键,会弹出以该字符开头的所有名称列表,
即可在该列表中选择所需要的名称。该功能与 shell 的 Tab 键的命令名称(文件名)补齐作用相似。
2. 在已打开的文件中查看命令或选项功能信息:Shift+K
将光标移动到需要查看的命令或选项名称中,按该快捷键,就在当前屏幕弹出该命令或选项相关的 man 文件
信息,由此可以了解其功能和作用等信息。
3. 查看当前正在编辑的文件的信息:Ctrl+G
4. 实现文本对齐的快捷键方法
按 ESC 键进行命令行模式,按 v 键进入可视化模式,再通过光标移动按键选中要执行对齐操作的行(例如
按下 j 键以选择下一行),最后按 = 键即可实现对齐操作。
第五部分 编译命令 g++/gcc 的用法
g++/gcc 有多个命令选项来控制程序检查的彻底程度。使用这些选项可以有效地帮助找出程序中潜在的故障
区域。下面是一些比较常用的选项:
(1) -Wall
使编译器在检测到可能的错误时生成警告消息。(-W 后面可以加上具体的警告信息代码,-Wall 表示“所有
的 -W 选项”。)为了获得最好的效果,该选项应与 -O 选项结合使用。
(2) -W
除了 -Wall 生成的警告消息外,还可以添加需要针对具体情况的额外警告消息。
(3) -pedantic
根据 C++/C 标准的要求生成警告消息。这样可以避免在程序中使用非标准特性。
(4) -ansi
禁用 g++/gcc 的非标准 C++/C 特性,并启用一些不太常用的标准特性。
(5) -std=c++11(或 -std=c99 又或 -std=89)
指明使用 C++11 版本(-std=c99 则为 C99 版本,而 -std=89 则为 C89 版本)编译器来检查程序。
(6) -E
与 -o 选项结合使用,以生成 .i 文件(经预处理后的 C++/C 源代码文件)。该选项后一定是 .cpp(.c)
源文件。
(7) -S
输出经过编译器编译后生成的汇编语言文件。-S 选项所操作的对象文件,是经过预处理器处理后生成的预
处理文件,而不是 .cpp(.c)源文件 —— 即编译预处理文件(而不是编译 .cpp 或 .c 文件),以生成汇编语
言文件。注意,虽然 -S 选项的操作对象是预处理文件,但如果直接对源文件进行编译,则 -S 选项相当于添加
了 -E 选项的 -S 选项,即 -ES;而生成的中间文件 —— 预处理文件,会在生成汇编语言文件后被自动删除。
(8) -c
用汇编器对汇编语言文件进行编译,以生成目标代码(.o)文件。其操作对象是汇编语言文件而不是 .cpp
(.c)源文件。当 -c 选项以源代码文件为操作对象时,就相当于 -ESc 选项,而生成的中间文件 —— 预处理文
件、汇编语言文件,都会在生成目标代码文件(.o 文件)后被自动删除。
(9) -g
调试程序而不输出任何文件。
(10) -o
输出可执行文件。可执行文件名必须紧跟在该选项后面,两者之间以空格分隔。
-o 选项不仅可以生成可执行文件,还可以与其他选项结合使用,以生成指定文件名的其他编译后文件;因
为 -o 选项本质上只是一个指定文件名的选项 —— 其功能仅用于指定文件名,而真正生成可执行文件或其他编译
后的文件的,是 g++/gcc 的其他命令选项(如果不带任何选项,则 g++/gcc 命令将直接执行编译、链接等一系
列过程而直接生成最终的可执行文件;只是如果没有 -o 选项,所生成可执行文件的文件名为默认的 a.out)。
当不带任何选项的 g++/gcc 命令执行后(或只带 -o 选项而指定生成可执行文件的文件名),将生成可执
行文件,而其中的所有中间文件 —— 预处理文件、汇编语言文件、目标代码文件,都会被自动删除。
(11) -O
-O 选项是 -O0、-O1、-O2、-O3、Os 五种选项的统称,作用是在编译过程中控制代码优化操作的等级,各
选项后面的数字和字母字符代表着执行优化的等级。其中 -O0 选项表示不执行优化(关闭所有优化选项),-Os
选项用来优化代码尺寸。详细情况参见 g++/gcc 的 man 手册。
这些选项常常可以结合使用,例如:
g++ -O -Wall -W -pedantic -ansi -std=c++11 -o pun pun.cpp
gcc -O -Wall -W -pedantic -ansi -std=c99 -o pun pun.cpp
g++/gcc 支持的后缀文件包括:
(1) .cpp/.c 文件:C++/C 语言源代码文件。
(2) .h 文件:C++/C 程序代码“包含”(#include 指令)的头文件。
(3) .i 文件:经预处理器执行预处理后产生的 C++/C 代码文件(预处理文件)。(-E 选项)
(4) .s 文件:经汇编器编译后产生的汇编语言源文件。(-S 选项)
(5) .o 文件:经编译器编译后产生的二进制文件(目标文件),虽然是二进制文件,但仍不能被直接执行,因
为该文件还未经过链接器的链接(link)。(-c 选项)
(6) .out 文件:经链接器链接后产生的二进制文件(可执行文件)。(-o 选项,或不添加任何选项 —— 这将生
成默认文件名为 a.out 的可执行文件)
C++/C 源文件以 .cpp/.c 为后缀有一个目的,就是方便编辑器 vi 识别,因为 vi 会根据使用的文件后缀
名来确认文件类型;对于不同的文件类型,vi 会默认设置不同的显示和操作方式。例如对于 .cpp/.c 文件,vi
会对其中的关键字、特殊标识进行高亮显示,以及对括号的匹配进行特殊检查和标记等。
g++/gcc 编译 C++/C 程序的完整过程如下(总结于李慧芹老师视频所述):
编辑 C++/C 源文件 -> 预处理 -> 编译 -> 汇编编译 -> 链接 -> 可执行文件
1. 编辑 C++/C 源文件:.cpp/.c
C++/C 语言并不要求其源文件以 .cpp/.c 为后缀,实际上允许以任何字符为后缀,也可以没有任何后缀。
而 C++/C 源文件以 .cpp/.c 为后缀是应编译器的要求而添加的,也就是说,.cpp/.c 后缀是给编译器看的。编
译器在编译过程的不同步骤会去识别不同后缀的对象文件。
2. 预处理:
g++ -E hello.cpp > hello.i
gcc -E hello.c > hello.i
“>”是重定向字符。若不进行重定向,则预处理后的输出就只会显示在屏幕上,而不会生成预处理后的 .i
文件。
.cpp/.c 文件 -> .i 文件
凡是源文件中包含 # 字符的部分都是在预处理阶段进行处理的。
3. 编译:
g++ -S hello.i
gcc -S hello.i
命令执行后自动生成 hello.s 文件(汇编语言文件)。
.i 文件 -> .s 文件
4. 汇编编译:
g++ -c hello.s
gcc -c hello.s
命令执行后自动生成 hello.o 文件(目标文件:二进制文件)。
.s 文件 -> .o 文件
5. 链接:
g++ hello.o -o hello
gcc hello.o -o hello
命令执行后生成指定的 hello 文件(可执行文件)。如果没有 -o hello,也就是不指定生成的可执行文件
的文件名,即将命令改为:
g++ hello.o
gcc hello.o
则生成以 a.out 为文件名的默认可执行文件。建议使用 -Wall 选项。
.o 文件 -> .out 文件或指定文件名的可执行文件。
以上 5 个步骤可以浓缩为一个步骤(不带任何选项):
g++ hello.cpp
gcc hello.c
这样生成的可执行文件为默认的 a.out 文件。如果要生成指定文件名的可执行文件,例如名为 myhello 的
可执行文件,则:
g++ -o myhello hello.cpp
gcc -o myhello hello.c
或:
g++ hello.cpp -o myhello
gcc hello.c -o myhello
也可以用 make 命令来编译(前提是已经安装了 make 软件包,并编写了 Makefile 文件):
make
还可以用编译 C 程序的编译命令 gcc 来编译 C++ 程序,只需要添加合适的命令选项;例如,当 C++ 源文
件中包含 iostream 头文件时,在用 gcc 编译命令来编译时,就需要添加 -lstdc++ 选项:
gcc hello.cpp -lstdc++
因为与 iostream 头文件功能相似的、具有 I/O 功能的 C 头文件是 stdio.h。
注意,上述代码不能写成:
gcc -lstdc++ hello.cpp
即 -lstdc++ 选项必须放在命令行的末尾,否则报错而无法编译。
再则,还可以使用 cmake 命令来编译(前提是已经安装了 cmake 软件包)。
如果不喜欢使用 cmake 的命令行方式来编译,则可以使用下面的命令来启动 cmake 的图形化界面来编译:
cmake-gui
但前提是已经安装了 cmake-gui 软件包 —— 安装命令:
sudo apt-get install cmake-qt-gui
最后,查看是否已经安装了某个软件包的最简单的方法是,使用软件包相应的命令,添加 -v 或 --version
选项,运行命令后将会显示该软件包的版本信息。如果运行命令后报错,则说明没有安装该软件包,而正常显示
版本信息,则说明已经安装了该软件包。例如:
make -v
cmake --version
第六部分 C++11 新增的运算符 alignof 和 noe×cept(摘录自《C++ Primer Plus》附录 E)
一、alignof 运算符
计算机系统可能限制数据在内存中的存储方式。例如,一个系统可能要求 double 值存储在编号为偶数的内
存单元中,而另一个系统可能要求其起始地址为 8 个整数倍。运算符 alignof 将类型作为参数,并返回一个整
数,指出要求的对齐方式。详细示例参见《C++ Primer Plus》附录 E。
二、noexcept 运算符
关键字 noexcept 用于指出函数不会引发异常。它也可用作运算符,判断操作数(表达式)是否可能引发异
常:如果操作数可能引发异常,则返回 false,否则返回 true。例如下面的声明:
int hilt(int);
int halt(int) noexcept;
如果执行表达式 noexcept(hilt),则其结果为 false,因为 hilt() 的声明未保证不会引发异常;如果执
行表达式 noexcept(halt),则其结果为 true。
End
本书学习建议和说明(摘录自本书的推荐序、前言)
1. 学习语言的一个境界是把自己想象成编译器...。像编译器一样来思考和理解 C++ 语言,如果暂时做不到,
也不要紧,当有了一定的编写程序经验以后,在“揣摩”编译器行为的过程中可逐渐掌握 C++ 语法特性。
2. C 语言给现代计算机提供了一个底层的高级抽象:凡是比它低的抽象都过于简陋,凡是比它高的抽象都可以
用 C 语言构造出来。C++ 成功的根本原因,恰恰是因为它虽然试图提供一些高级的抽象机制,但是其根基与 C
却在同一层面。正因为如此,每当需要直接与硬件对话时,C++ 就成为 C 之外唯一有效率的选择。
3. C++ 之所以脱离 C 而存在,正是因为其强大的抽象能力。C++ 同时支持 4 种不同的编程风格:C 风格、基
于对象、面向对象和泛型。事实上,把微软的 COM 也算进来的话,还可以加上一种“基于组件”的风格。这么多
的风格共存于一种语言,就是其强大抽象机制的证明。
4. 本书无论对于初学者还是提高者,都是最经典的教科全书。... 每个具体的技术领域,只需读四五本书就够
了。本书是其中之一,另一本是《C++ 标准程序库》,第三本是 Scott Meyers 的《Effective C++》,第四本
是 Anthony Williams 的《C++ Concurrenсу in Action》—— 它是学习用标准 C++ 开发并发程序的最佳选择。
国内的作品,则推荐陈硕的《Linux 多线程服务端编程》。
5. 本书注意解释规则背后的基本原理,使读者不仅知其然,还能知其所以然。
6. 本书使用的编译器是 GNU 编译器 4.7.0。本书中只有一小部分特性在此编译器中尚未实现:继承构造函数、
成员函数的引用限定符以及正则表达式库。