c++Primer第五章:语句

switch语句

1.case后面必须跟常量,必须是整数

int ival = 1;
case 3.14:...;break//Wrong
case ival:...;break//Wrong

2.多个case执行一个语句

switch(ch){
	case 'a':
	case 'e':
	case 'i':
	case 'o':
	case 'u': ++cnt;break;
	default" ++othercnt;break;

}

范围for语句

只有使用引用才能修改元素

for(auto &r : v)
	r *= 2;

break语句

跳出最近的while,do while,for,switch语句

continue

结束当前迭代并立即开始下一迭代,for,while,do while中使用

goto

无条件跳转到同一函数内另一语句

goto label;
begin :
	int sz = get_size();
	if(sz <= 0)
		goto begin; 

try语句块与异常处理

很重要的部分

1.throw表达式:异常检测,表示遇到无法处理的部分

抛出异常将终止当前函数,并把控制权转移至能处理该异常的代码。

#include <stdexcept>
if(item1.isbn() != item2.isbn() )
	throw runtime_error(" Data must refer to same ISBN");
cout<<item1 + item2<<endl;

2.try

try {
	program-statements
} catch (exception-declaration){
	handle-statements
} catch (exception-declaration){
	handle-statements
} 

例子

int a,b;
while(cin>>a>>b){
	try {
		if (b == 0)
			throw runtime_error("number is 0");
		cout<<"result = "<<a/b<<endl;
	}catch (runtime_error err){
		cout<<err.what()<<endl;
		cout<<"try again ? y or n:";
		char c;
		cin>>c;
		if(!cin || c=='n')
			break;
	}
}

运行结果:
在这里插入图片描述
< stdexcept >定义的异常类
都是从exception中派生出来的
在这里插入图片描述

在这里插入图片描述

名称Value
exception最常见的问题
runtime_error只有在运行时才能检测的错误
range_error运行时错误:结果超过了有意义的范围
overflow_error运行错误:上溢
underflow_error运行错误: 下溢
logic_error程序逻辑错误
domain_error逻辑错误:参数对应的结果不存在
invaild_arguement逻辑错误:无效参数
length_error逻辑错误,创建一个超出该类型最大长度的对象
out_of_range逻辑错误:使用一个超出有效范围的值

bad_cast 不需要初始值

父类指针转子类指针一般会失败:由于子类对象大小一般大于父类对象大小,实际指向父类的对象在强制转换为指向子类对象的指针,可能会出现非法地址访问,相当于小空间用大指针。比如下面父类中没有print(),根本无法用b去访问。而子类转父类一般会成功,相当于大空间用小指针。

#include <iostream>
#include <stdexcept>
using namespace std;
class Base
{
    virtual void func() {}
};
class Derived : public Base
{
public:
    void Print() {}
};
void PrintObj(Base & b)
{
    try {
        Derived & rd = dynamic_cast <Derived &>(b);//父类转子类失败
        //此转换若不安全,会拋出 bad_cast 异常
        rd.Print();
    }
    catch (bad_cast & e) {
        cerr << e.what() << endl;
    }
}
int main()
{
    Base b;
    PrintObj(b);
    return 0;
}

bad_alloc 不需要初始值

没有足够的内存空间

#include <iostream>
#include <stdexcept>
using namespace std;
int main()
{
    try {
        char * p = new char[0x7fffffff];  //无法分配这么多空间,会抛出异常
    }
    catch (bad_alloc & e)  {
        cerr << e.what() << endl;
    }
    return 0;
}

out_of_range 也不需要初始值

下标越界

#include <iostream>
#include <stdexcept>
#include <vector>
#include <string>
using namespace std;
int main()
{
    vector<int> v(10);
    try {
        v.at(100) = 100;  //拋出 out_of_range 异常
    }
    catch (out_of_range & e) {
        cerr << e.what() << endl;
    }
    string s = "hello";
    try {
        char c = s.at(100);  //拋出 out_of_range 异常
    }
    catch (out_of_range & e) {
        cerr << e.what() << endl;
    }
    return 0;
}

其他的参考这个网页
链接: link.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值