c++基础第四次

空语句就是光写一个分号。
一个块就是一个作用域,通常,名字在有限的区域内可见,该区域从名字的名字定义处开始,到名字所在的块的结尾为止。

悬垂else
c++规定,else与离它最近的尚未匹配的if匹配。

在switch中,case标签必须是整数常量表达式。
漏写break语句,会导致下穿现象。
如果没有任何一个case标签能匹配上switch表达式的值,程序将执行紧跟在default标签后面的语句。

如果switch结构以一个空的default标签作为结束,则该default标签后面必须跟上一条空语句或者一个空块。

switch中case中变量定义和跨作用域使用。
如果在某处一个带有初值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处的行为是非法行为。
c++规定,不许跨过变量的初始化语句直接跳转到该变量作用域的另一个位置。

如果需要为某个case分支定义并初始化一个变量,应该把变量定义在块内,从而确保后面的所有case标签都在变量的作用域。

定义在while条件部分或者while循环体内的变量每次迭代都经历从创建到销毁的过程。

for语句中的init-statement只能有一条声明语句,因此所有变量的基础类型也必须相同。

还记得之前说过的范围for语句吗?
for(declaration : expression)
statement

其中expression表示的必须得是一个序列,其中序列类型的共同特点是拥有能返回迭代器的begin和end成员。declaration定义一个变量,序列中的每个变量都得能转换成该变量的类型。其中为了确保类型相容的最简单方法就是使用auto类型说明符。如果需要对序列中的元素进行写操作,循环变量必须声明为引用类型。

使用范围for语句:

vector<int> v = {1,2,3,4,5,6};
for(auto &r : v)
	r *= 2;

接下来看对应于等价的for循环语句

for(auto beg = v.begin(),end = v.end();beg != end; ++beg){
	auto &r = *beg;
	r *= 2
}

可见需要begin和end成员,所以之前强调的不能用范围for语句增加vector对象的元素。

在范围for语句中,预存了end()的值,一旦在序列中添加或删除元素,end函数的值就可能变得无效。

break语句

break语句只能出现在迭代语句或者switch语句内部,作用范围仅限于最近的循环或switch。

continue语句

continue语句终止最近的循环中的当前迭代并立即开始下一次迭代。continue语句只出现在for,while,do-while循环的内部。


try语句和异常处理

异常处理机制为程序中异常检测和异常处理两部分的协作提供支持。
在c++中,异常处理包括
1.throw表达式,异常检测部分使用throw表达式表示遇到了无法处理的问题,通常说throw引发了异常。
2.try语句块,异常处理部分使用了语句块。try语句块以关键字try开始,并以一个或多个catch子句结束。try语句块中代码抛出的异常通常会被某个catch子句处理。
3.一套异常类,用于在throw表达式和相关的catch子句之间传递异常的具体信息。

1.throw表达式
程序的异常检测部分使用throw表达式引发一个异常,throw表达式包含关键throw和紧跟其后的一个表达式,其中表达式的类型就是抛出的异常类型。throw表达式后面通常跟上一个分号。

if(item1.isbn() != item2.isbn())
	throw runtime_error("data must refer to same isbn");
else
	cout << item1 + item2 <<endl;

try 语句块

try{
	program-statements
}catch(exception-declaration){
	handler-statements
}....

catch语句执行完成之后,程序跳转到try语句块最后一个catch子句之后的那条语句继续执行。
和其他一样,try语句块内声明的变量在块外部无法访问,在catch子句内也无法访问。

while(cin >> item1 >> item2){
	try{
		program
	}catch(runtime_error){
		cout << err.what()
	}
}

err的类型是runtime_error,所以what是runtime_error类的一个成员函数。

每个标准库异常类都定义了名为what的成员函数,这些函数没参数,返回值是C风格字符串(const char*)

其中runtime_error的what成员返回的是一个具体对象时所用的string对象的副本。

注意try语句的嵌套:一个try语句可能调用了包含另一个try语句块的函数
寻找处理代码的过程与函数调用过程链刚好相反,当异常被抛出时,首先搜索抛出该异常的函数,如果没找到匹配的catch子句,终止该函数,并在调用该函数的函数中继续寻找,以此类推,沿着程序的执行路径逐层回退,直到找到适当类型的catch子句为止。

如果最终还是没有找到任何匹配的catch子句,程序转到terminate的标准库函数。该函数的行为与系统有关,一般情况下,执行该函数导致程序非正常退出。

最后有一些标准异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值