C++比C多了什麼。。。(高階篇)
寫完了基礎的不同,在看看高階的一些用法吧。 真正的高手都差在深入的研究上,我估計也就算是個裝高手的。關於基礎的不同可以參見:
一、模板
1、函式模板
模板(Templates)使得我們可以生成通用的函式,這些函式能夠接受任意資料型別的引數,可返回任意型別的值,而不需要對所有可能的資料型別進行函式過載。這在一定程度上實現了巨集(macro)的作用。
#include<iostream> using namespace std; template <class T> T getmax(T a,T b){ return a>b?a:b; } int main(){ int a=3; int b=4; float c =5.5; float d =6.6; cout<<getmax(a,b)<<endl; cout<<getmax(c,d)<<endl; }
執行輸出為: 4 6.6
2、類模板
不但函式可以應用類同樣也可以。應用了模板,就變成了模板類
#include<iostream> using namespace std; template <class T> class A{ T a; public : A(T t){a=t;} T get_value(); }; template <class T> T A<T>::get_value(){ return a; }; int main(){ A<int> a(3); cout<<a.get_value()<<endl; }
3、模板特殊化#include<iostream> using namespace std; template <class T> class A{ T a; public : A(T t){a=t;} T get_value(); }; template <class T> T A<T>::get_value(){ return a; }; template <> class A<float>{ //特殊化模板為float float a; public : A(float t){a=t;} float get_value(); }; float A<float>::get_value(){ return a+0.00234; }; int main(){ A<int> a(3); A<float> b(4.5); cout<<a.get_value()<<endl; cout<<b.get_value()<<endl; }
執行輸出為: 3 4.50234
二、名空間
通過使用名空間(Namespaces)我們可以將一組全域性範圍有效的類、物件或函式組織到一個名字下面。換種說法,就是它將全域性範圍分割成許多子域範圍,每個子域範圍叫做一個名空間(namespaces).
#include<iostream> using namespace std; namespace haha{ string s= "hahaha"; } namespace gaga{ string s= "gaga"; } namespace heihei{ string s = "heihei"; } using namespace haha; int main(){ cout<<s<<endl; cout<<gaga::s<<endl; }
三、出錯處理
這個和java差不多了,就不細說了,沒什麼特別的。
#include<iostream> using namespace std; int main(){ try{ char a[10]; for(int i=0;i<20;i++){ if(i>9) throw i; a[i] = i; } }catch(int i){ cout<<"Exception : "<<i<<endl; } }
四、型別轉換
ANSI-C++ 標準定義了4種新的型別轉換操作符: reinterpret_cast, static_cast, dynamic_cast 和 const_cast。
reinterpret_cast 可以將一個指標轉換為任意其它型別的指標。它也可以用來將一個指標轉換為一個整型,或反之亦然。
static_cast 可以執行所有能夠隱含執行的型別轉換,以及它們的反向操作(即使這種方向操作是不允許隱含執行的)。
dynamic_cast 完全被用來進行指標的操作。它可以用來進行任何可以隱含進行的轉換操作以及它們被用於多型類情況下的方向操作。然而與static_cast不同的是, dynamic_cast 會檢查後一種情況的操作是否合法,也就是說它會檢查型別轉換操作是否會返回一個被要求型別的有效的完整的物件。
const_cast 這種型別轉換對常量const 進行設定或取消操作:
class C {}; const C * a = new C; C * b = const_cast<C*> (a);
其他3種cast 操作符都不可以修改一個物件的常量屬性。
五、預處理指令
#define name value 巨集定義,用value完全替換name
#undef name value 取消剛才的巨集定義。通常用來重定義巨集
#ifdef, #ifndef, #if, #endif, #else and #elif(elif=else if) 定義條件的邏輯應用
#if MAX_WIDTH>200 #undef MAX_WIDTH #define MAX_WIDTH 200 #elif MAX_WIDTH<50 #undef MAX_WIDTH #define MAX_WIDTH 50 #else #undef MAX_WIDTH #define MAX_WIDTH 100 #endif char str[MAX_WIDTH];