例14.1 給出三角形的三邊a,b,c,求三角形的面積。只有a+b>c,b+c>a,c+a>b時(shí)才能構(gòu)成三角形。設(shè)置異常處理,對(duì)不符合三角形條件的輸出警告信息,不予計(jì)算。
先寫出沒有異常處理時(shí)的程序:
#include <iostream>
#include <cmath>
usingnamespacestd;
intmain( )
{doubletriangle(double,double,double);
doublea,b,c;
cin>>a>>b>>c;
while(a>0&& b>0&& c>0)
{cout<<triangle(a,b,c)<<endl;
cin>>a>>b>>c;
}
return0;
}
doubletriangle(doublea,doubleb,doublec)
{doublearea;
doubles=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
returnarea;
}
修改后的程序如下:
#include <iostream>
#include <cmath>
usingnamespacestd;
voidmain( )
{doubletriangle(double,double,double);
doublea,b,c;
cin>>a>>b>>c;
try//在try塊中包含要檢查的函數(shù)
{while(a>0&& b>0&& c>0)
{cout<<triangle(a,b,c)<<endl;
cin>>a>>b>>c;
}
}
catch(double) //用catch捕捉異常信息并作相應(yīng)處理
{cout<<"a="<<a<<",b="<<b<<",c="<<c<<",that is not a triangle!"<<endl;}
cout<<"end"<<endl;
}
doubletriangle(doublea,doubleb,doublec) //計(jì)算三角形的面積的函數(shù)
{doubles=(a+b+c)/2;
if(a+b<=c||b+c<=a||c+a<=b) throwa; //當(dāng)不符合三角形條件拋出異常信息
returnsqrt(s*(s-a)*(s-b)*(s-c));
}
例14.2 在函數(shù)嵌套的情況下檢測(cè)異常處理。
這是一個(gè)簡(jiǎn)單的例子,用來說明在try塊中有函數(shù)嵌套調(diào)用的情況下拋出異常和捕捉異常的情況。請(qǐng)自己先分析以下程序。
#include <iostream>
usingnamespacestd;
intmain( )
{voidf1( );
try
{f1( );}//調(diào)用f1( )
catch(double)
{cout<<"OK0!"<<endl;}
cout<<"end0"<<endl;
return0;
}
voidf1( )
{voidf2( );
try
{f2( );} //調(diào)用f2( )
catch(char)
{cout<<"OK1!";}
cout<<"end1"<<endl;
}
voidf2( )
{voidf3( );
try
{f3( );} //調(diào)用f3( )
catch(int)
{cout<<"Ok2!"<<endl;}
cout<<"end2"<<endl;
}
voidf3( )
{doublea=0;
try
{throwa;} //拋出double類型異常信息
catch(float)
{cout<<"OK3!"<<endl;}
cout<<"end3"<<endl;
}
例14.3 在異常處理中處理析構(gòu)函數(shù)。
這是一個(gè)為說明在異常處理中調(diào)用析構(gòu)函數(shù)的示例,為了清晰地表示流程,程序中加入了一些cout語句,輸出有關(guān)的信息,以便讀者對(duì)照結(jié)果分析程序。
#include <iostream>
#include <string>
usingnamespacestd;
classStudent
{public:
Student(intn,string nam)//定義構(gòu)造函數(shù)
{cout<<"constructor-"<<n<<endl;
num=n;name=nam;}
~Student( ){cout<<"destructor-"<<num<<endl;}//定義析構(gòu)函數(shù)
voidget_data( ); //成員函數(shù)聲明
private:
intnum;
string name;
};
voidStudent::get_data( ) //定義成員函數(shù)
{if(num==0) thrownum; //如num=0,拋出int型變量num
elsecout<<num<<" "<<name<<endl; //若num≠0,輸出num,name
cout<<"in get_data()"<<endl; //輸出信息,表示目前在get_data函數(shù)中
}
voidfun( )
{Student stud1(1101,"Tan"); //建立對(duì)象stud1
stud1.get_data( ); //調(diào)用stud1的get_data函數(shù)
Student stud2(0,"Li"); //建立對(duì)象stud2
stud2.get_data( ); //調(diào)用stud2的get_data函數(shù)
}
intmain( )
{cout<<"main begin"<<endl; //表示主函數(shù)開始了
cout<<"call fun( )"<<endl; //表示調(diào)用fun函數(shù)
try
{fun( );} //調(diào)用fun函數(shù)
catch(intn)
{cout<<"num="<<n<<",error!"<<endl;} //表示num=0出錯(cuò)
cout<<"main end"<<endl; //表示主函數(shù)結(jié)束
return0;
}
例14.4 名字沖突。
程序員甲在頭文件header1.h中定義了類Student和函數(shù)fun。
//header1.h (頭文件1,設(shè)其文件名為cc14-4-h1.h)
#include <string>
#include <cmath>
usingnamespacestd;
classStudent//聲明Student類
{public:
Student(intn,string nam,chars)
{num=n;name=nam;sex=s;}
voidget_data( );
private:
intnum;
string name;
charsex;
};
voidStudent::get_data( ) //成員函數(shù)定義
{cout<<num<<" "<<name<<" "<<sex<<endl;
}
doublefun(doublea,doubleb) //定義全局函數(shù)(即外部函數(shù))
{returnsqrt(a+b);}
在main函數(shù)所在的文件中包含頭文件header1.h:
#include <iostream>
#include "cc14-4-h1.h" //注意要用雙引號(hào),因?yàn)槲募话闶欠旁谟脩裟夸浿械?/p>
usingnamespacestd;
intmain( )
{Student stud1(101,"Wang",18); //定義類對(duì)象stud1
stud1.get_data( );
cout<<fun(5,3)<<endl;
return0;
}
例14.5 利用命名空間來解決例14.4程序名字沖突問題。
修改兩個(gè)頭文件,把在頭文件中聲明的類分別放在兩個(gè)不同的命名空間中。
//header1.h (頭文件1)
#include <string>
#include <cmath>
usingnamespacestd;
namespacens1//聲明命名空間ns1
{classStudent //在命名空間ns1內(nèi)聲明Student類
{public:
Student(intn,string nam,inta)
{num=n;name=nam;age=a;}
voidget_data( );
private:
intnum;
string name;
intage;
};
voidStudent::get_data() //定義成員函數(shù)
{cout<<num<<" "<<name<<" "<<age<<endl;
}
doublefun(doublea,doubleb) //在命名空間ns1內(nèi)定義fun函數(shù)
{returnsqrt(a+b);}
}
//header2.h ((頭文件2)
#include <string>
#include <cmath>
usingnamespacestd;
namespacens2 //聲明命名空間ns2
{classStudent
{public:
Student(intn,string nam,chars)
{num=n;name=nam;sex=s;}
voidget_data( );
private:
intnum;
charname[20];
charsex;
};
voidStudent::get_data( )
{cout<<num<<" "<<name<<" "<<sex<<endl;
}
doublefun(doublea,doubleb)
{returnsqrt(a-b);}
}
//main file (主文件)
#include <iostream>
#include "cc14-5-h1.h" //包含頭文件1
#include "cc14-5-h2.h" //包含頭文件2
usingnamespacestd;
intmain( )
{ns1::Student stud1(101,"Wang",18); //用命名空間ns1中聲明的Student類定義stud1
stud1.get_data( ); //不要寫成ns1::stud1.get_data( );
cout<<ns1::fun(5,3)<<endl; //調(diào)用命名空間ns1中的fun函數(shù)
ns2::Student stud2(102,"Li",'f'); //用命名空間ns2中聲明的Student類定義stud2
stud2.get_data( );
cout<<ns2::fun(5,3)<<endl; //調(diào)用命名空間ns1中的fun函數(shù)
return0;
}
