避免程序运行后窗口自动关闭
在主调函数中return
语句前添加cin.get();
;
int main(void)
{
cin.get(); // 避免窗口自动关闭
return 0;
}
异常处理
即事先分析程序运行时可能出现的异常情况,并分别制定处理方法,如拨打电话时拨了一个空号,系统提示此号码为空号,而不是无休止地等待;
异常不完全等于出错,异常是出现与人们期望不同的情况;
异常处理的方法
- 检查(try):把需要检查的语句放入try语块中;
- 捕捉(catch):当try语块出现异常时,捕捉异常信息,并处理异常;
- 抛出(throw):当try语块出现异常时,发出一个异常信息(给上一级函数);
throw
和catch
是独立同步进行的;
try-catch
语句作为整体使用,就像if-else
一样,当然也可以只有try
,就像只有if
;
try-catch
语句中try
只能有一个,但catch
可有多个,便于与不同异常信息进行匹配处理;
- catch语法:
1. 只指定需要捕捉的异常信息类型
catch(double)
catch(char)
2. 指定需要捕捉的异常信息类型和变量名
catch(double a)
catch(char b)
3. ...,表示捕捉任何类型的异常信息,一般放到所有catch的最后,相当于“其他”
catch(...)
4. 把处理异常的任务交给上一级函数
catch(int)
{
throw;
}
- 例程:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double triangleArea(double,double,double);
double a,b,c;
cout<<"请输入三角形的三边长.(Please typing three side length of the triangle.)"<<endl;
cin>>a>>b>>c;
try
{
while(a>0 && b>0 && c>0)
{
cout<<"此三角形的面积为:(Area of this triangle is:)"<<"\n"<<triangleArea(a,b,c)<<endl;
cout<<"请继续输入:(Please go on typing:)"<<endl;
cin>>a>>b>>c;
}
}
catch(double) // 若 try语块中发生异常,则跳到此 catch语块
{
cout<<"a="<<a<<",b="<<b<<",c="<<c<<",报错!这不是一个三角形!(Error!that is not a triangle!)"<<endl;
}
cout<<"程序结束.(program exit.)"<<endl;
return 0;
}
double triangleArea(double a,double b,double c)
{
if (a+b<=c||b+c<=a||c+a<=b)throw a; // 执行完 throw语句,立即结束并离开本函数
double s=(a+b+c)/2;
return sqrt(s*(s-a)*(s-b)*(s-c));
}
// throw 抛出的a是double型,catch捕捉的异常也是double型,两者类型匹配;
在函数声明时指定只能抛出的异常类型
double triangleArea(double,double,double) throw(double);// 该函数只能抛出double类型异常信息;
double triangleArea(double,double,double) throw(double,int,char,float);// 该函数能抛出double,intd等类型异常信息
double triangleArea(double,double,double) throw();// 该函数不能抛出异常信息;
C++头文件
在C++中可以用C语言中的所有头文件,且在C语言库的基础上做了较大改变,为了区分C语言的库,新式C++的头文件不采用后缀.h
,而C语言的头文件保留了后缀它,如C语言中数学函数库为math.h
在C++中作改变后命名其为cmath
;
不需
.h
后缀的前提是使用std
命名空间using namespace std;
命名空间
- 作用一:相当于对某些代码取别名;
- 作用二:用于处理程序中常见的命名冲突;
1. 使用命名空间
#include<iostream>
using namespace std;//std是C++中的标准命名空间
cout<<"age: "<<age<<endl;
2. 不使用命名空间
#include<iostream.h>
std::cout<<"age: ";
std::cout<<age;
std::cout<<endl;
综上,命名空间把std::cout取别名cout,iostream.h命名为iostream,代码更加高效直观;
类和动态内存分配
动态内存分配即在程序运行时按需为数据分配内存,使用完马上释放,而不是在编程的时候把数据的内存大小、建立和释放时间写死;