异常
异常概念:程序中可预料但无法避免的错误
异常处理概念:从发生异常的地方开始终止,不再进行正常的流程,去转而执行特定的异常处理流程
关键字:
try: try块,受监控的代码块,它来捕获产生的异常。可以有多个try块,不同的try块监视不同的区域
catch: catch块,紧跟在try块后,且必须成对出现,可以有多个catch块(这点有点类似switch和case)它用来得到并处理try捕获的异常
throw: throw块,主动抛出某个表达式值类型的异常,如果当前没有try块监控,那沿调用链往上级抛该异常
抛出的表达式是什么类型,就由什么参数类型的catch接收并处理.
void Fun()
{
int n;
cin>>n;
if(n==0)
throw "zero";//如果输入0,这里抛出的异常将会向上级抛出,即抛到main函数中
try{ //监控花括号内的全部内容
if(n>20)
throw "overstep";//这里抛出的异常会有try接收,有这里的try后的catch处理
if(n<0)
{
throw n;
}
else
throw 1.23;
}
catch(int n)
cout<<"fun--"<<n<<endl
catch(char * str)
cout<<"fun--"<<str<<endl;
catch(...)
cout<<"fun--"<<"..."<<endl;
}
int main()
{
try {
Fun();
}
catch(char * str)
cout<<"main-"<<str<<endl;
catsh(...)
cout<<"main--"<<"..."<<endl;
}
/*
输入0:输出”main--zero“
输入大于20:输出”fun--overstep“
输入其他:输出”fun--...“
输入小于0:输出”fun--n“(n为输入的值)
*/
C++11标准
这里只选择10个经典的较为常见的几个来说
1.数据初始化列表
//旧:
int a=0;
int b(1.1);
//新
int a={0};
int b={(int)1.1};//不能有精度的缺失
2.空指针
//旧:
int *p=NULL;
//新:
int *p=nullptr;
3.自动类型
//旧:
int a=1;
//新:
auto a=1;
auto b=2.1;
//自动识别推导类型
4.decltype
int a=1;
decltype(a)b;//将a的类型给b做类型声明
b=2;
5.新的for循环规则
//旧的:
char * p= "abcd";
for(int i=0;i<4;++i)
{
cout<<p[i]<<endl;
}
//新的:
std::string srcstr="abcd";
for(auto c:srcstr)//迭代器,新方法
cout<<c<<endl;
6.类型重定义
typedef int I;
//新的:
using I = int;
7.default在类中的用法
class CA
{
public:
CA()
{
//旧方法
}
CA();
}
CA::CA()=default;//新方法,提醒系统用默认的构造函数
8.类中初始化数据成员
class CA
{
public:
int a=10;//类似于函数缺省的作用,如果有构造函数赋值,会替代这里的初始化。
}
9.构造函数委托
class CA
{
public:
int a;
CA(int a){this->a=a;}
CA():CA(1){}
}
10.禁止虚函数重写
class CA
{
public:
virtual void fun()final;//final关键字,如果有类继承与CA在子类中,语法限定不能重写fun函数
}