(十一)异常处理,函数模板,类模板
2016.7.4
1.异常处理
#include <iostream>
using namespace std;
int func1(int n1,int n2){
if(n2==)
{ throw "f";}
else
return n1/n2;
}
void func2(int n1,int n2){//函数调用函数异常依然可以抛出。
func1(n1,n2);}
void func3() throw(int ,float){//抛出异常类型为int,float.
}
void func4(){//可抛出任何异常。
}
void func5() throw(...){//可抛出任何异常。
}
void func6() throw (){//不抛出任何异常。
}
int main(int argc, const char * argv[]) {
int num1=;
int num2=;
try{
//存放有可能发生错误的代码。
//func1(num1,num2);
func2(num1,num2);
}//try与catch之间不能有其他代码。
catch(const char *error){//catch只能有一个参数。
cout<<"出现异常"<<endl;
cout<<error<<endl;
}
catch(int error){
cout<<"出现整型异常"<<endl;
cout<<error<<endl;
}
catch(...){//default 要写时,要把它放最后。放最前报错。
//...的好处:能匹配任何类错误。
//...的弊端:不能判断出错误的类型。
cout<<"发生错误"<<endl;
}
return ;
}
2.函数模板
#include <iostream>
using namespace std;
/*
函数模板:函数参数不同,函数实现相似,通用函数被称为函数模板
模板关键字:templaate
*/
//第一层封装
void func1(int *array,int size){
cout<<""<<endl;
for(int i=;i<size;i++)
{
cout<<array[i];
}
}
//函数:参数类型确定,值不确定。
//函数模板;参数类型不确定,值也不确定。
template <class T>
void func4(T *array ,int size){
for(int i=;i<size;i++)
cout<<array[i];
cout<<endl;
}
template <class M,class N,class K>//一个模板只能绑定一个函数。
//函数模板可以有多个未实例化参数。
void func5(M n1,N n2,K n3){
if(n1>n2)
cout<<(n3>n1?n3:n1)<<endl;
else
cout<<(n3>n2?n3:n2)<<endl;
}
/*
类模板
*/
template <class P>
class point {
private:
P a;
public:
point(P _a){
a=_a;
}
void print();
};
template <class P> //在类模板中每一个成员函数都是函数模板。
void point<P>::print() //请注意成员函数的书写格式。
{
cout <<a<<endl;
}
int main(int argc, const char * argv[]) {
const int max=;
int array1[max]={,,,,};
char array2[max]={'a','s','d','f','g'};
float array3[max]={,,,,};
func4(array1, );//函数模板。
func4(array2, );
func4(array3, );
int n1=;
int n2=;
int n3=;
float f1=;
float f2=;
float f3=;
char c1='a';
char c2='r';
char c3='k';
func5(n1,n2,n3);//求最大值。
func5(f1, f2, f3);//只有一种类型的参数。
func5(c1,c2,c3);
func5(n1,f1,c1);//多种类型的参数。
point<int> p();//类模板构造对象,用int来实例化P。
p.print();
return ;
}
3.类模板
#include <iostream>
using namespace std;
template <class T>
class Stack {
private:
int size;
int top;
T * stackPtr;
public:
Stack(int s=);
~ Stack();
int push(const T&);
int pop( T&);
int isEmpty()const;
int isFull()const;
void printOn(ostream& output);
};
template <class T>
Stack<T>::~Stack(){
delete [] stackPtr;
}
template <class T>
Stack<T>::Stack(int s){
size=s;
top=-;
stackPtr=new T[size];
}
template <class T>
int Stack<T>::push(const T& item)
{
if(!isFull())
{
stackPtr[++top]=item;
return ;
}
return ;
}
template <class T>
int Stack<T>::pop(T& item)
{
if(!isEmpty())
{
item =stackPtr[top--];
return ;
}
return ;
}
template <class T>
int Stack<T>::isEmpty()const
{
return top==-;
}
template <class T>
int Stack<T>::isFull()const
{
return size==-;
}
template<class T>
void Stack<T>::printOn(ostream & output)
{
output<<"Stack(";
for(int i=;i<=top;i++)
output<<stackPtr[i]<<",";
output<<")\n";
}
int main(int argc, const char * argv[]) {
Stack<int> stack;
for(int i=;i<;i++){
stack.push(i*);
}
stack.printOn(cout);
std::cout << "Hello, World!\n";
return ;
}