(十一)異常處理,函數模闆,類模闆
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 ;
}