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.