前言
该系列是《C++Primer第五版》的笔记,包含本人认为值得记录和整理的主要的知识点,并不是全部内容,也不是具体的内容。
该系列文章的作用应该是作为复习或预习的参考,有哪些知识点忘记或想学,可以大致浏览下该文章,然后再去书中寻找详细解答。(本系列文章基本是按书本顺序罗列的知识点,便于大家去书中寻找)
所以看该文章前,需要有一定的C++基础,否则阅读起来可能有困难。
本文大致整理了第五章的知识点,属于C++的语法,没有难点,本章后面提及的异常处理,简单了解即可,后续有更详细的介绍。
链接目录
- 第二章:变量与基本类型
- 第三章:字符串、向量和数组
- 第四章:表达式
- 第五章:语句
- 第六章:函数
- 第七章:类
- 第八章:IO库
- 第九章:顺序容器
- 第十章:泛型算法
- 第十一章:关联容器
- 第十二章:动态内存
- 第十三章:拷贝控制
- 第十四章:重载运算与类型转换
- 第十五章:面向对象程序设计
- 第十六章:模板与泛型编程
- 第十七章:标准库特殊设施
- 第十八章:用于大型程序的工具
- 第十九章:特殊工具与技术
语句块
复合语句(块):用花括号括起来的,一个块就是一个作用域。
语句作用域:块内定义的变量在块外无法访问。关于作用域更详细的阐述,可以在第十八章找到。
条件语句
C++提供了if
和switch
两种条件语句。
if
语句中的悬垂else
:当if
语句进行嵌套时,没有用花括号明确匹配,则else
与离它最近的尚未匹配的if
匹配。
switch
语句:
switch(expr){
case constexpr:
break;
default:
break;
...
}
先对括号内表达式求值,然后转换成整数类型,对case
标签值进行比较匹配(case
标签必须是整型常量表达式,可以是布尔值,隐式转换为整型)。
switch
内部的控制流:
如果某个case
匹配成功,将从该标签开始往后顺序执行所有case
分支(无论条件是否满足),除非显示中断。所以大多数情况case
块内的结尾应该有一条break
语句。除非我们需要多个标签值共享同一组操作,就可以故意省略break
语句。
例如:
switch(expr){
//case0和case1共享同样的操作
case 0:
case 1:
...
break;
case 2:
...
break;
}
default
标签:没有任何一个case
标签匹配上,则执行default
标签后的语句。
switch
内部的变量定义:每个case
块为一个作用域。
迭代语句
while
语句:表达式为真时执行,如果表达式第一次求值为false
,则循环体一次都不执行。(do while
不管条件如何都至少执行一次循环体)
传统的for
语句:
for(init-statement; condition; expression)
statement
范围for
语句:
for(declaration : expression)
statement
expression
必须是一个序列(数组、vector
或string
等类型的对象,这些类型的共同特点是能返回迭代器的begin
和end
成员)。
注意:范围for
语句内不能动态添加vector
对象的元素,循环在一开始就预存了迭代器end
的值,可能影响后续结束及相关条件的判断。
跳转语句
C++有四种跳转语句:break
、continue
、goto
和return
break
负责终止离它最近的while
、do while
、for
或switch
语句,并从这些语句之后的第一条语句开始执行。
continue
终止最近循环的当且迭代并立即开始下一次迭代,只能出现在for
、while
和do while
循环的内部。
goto
语句的作用是从goto
语句无条件跳转到同一函数内的另一条语句。
label:
...
goto label;//可以向上也可以向下
//假如有下
label:
...
try语句块和异常处理
异常处理在第十八章有更详细的介绍。
C++的异常处理包括:
throw
表达式:throw
引发异常,表示遇到无法处理的问题try
语句块:一个try
语句有一个或多个catch
子句,try
语句块抛出的异常会被某个catch
子句处理- 一套异常类,用于在
throw
表达式和相关catch
子句之间传递异常的具体信息
例如:
try{
...
//遇到无法处理的问题,抛出异常,并中断后续代码的执行
throw runtime_error("some message");
...
}catch(runtime_error e){
//捕获并处理该异常
...
}catch(othererror){
handle-statements
}
一个try
语句块可能调用另一个包含try
语句块的函数,产生嵌套,则异常抛出时,首先搜索抛出该异常的函数,如果没有匹配,则继续往上寻找(调用该函数的函数)。如果都没匹配,则转到标准库函数terminate
,通常就会导致程序非正常退出。
标准异常
标准库异常类:
exception
:定义在exception
头文件中,只报告异常的发生,不提供额外信息stdexcept
:定义在stdexcept
头文件中,定义了几种常用的异常类bad_alloc
:定义在new
头文件中bad_cast
:定义在type_info
头文件中
标准库中定义的具体的错误类型,可以查阅书本(176页),本文不提供。
注意:只能以默认初始化的方式初始化exception
、bad_alloc
和bad_cast
对象,不允许提供初始值。其他则必须提供含有错误相关信息的初始值。
异常类型中的what()
函数:返回一个指向C风格字符串的const char*
,返回内容与异常对象有关,如果异常对象有字符串初始值,则返回,如果没有则由编译器决定。