《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法2
上一篇請見可能令你困惑的C++語法1
現在繼續,
2.臨時對象的產生和運用
臨時對象,是一種無名對象。制造臨時對象的方法是,在型別之后加一對小括號,并可以給定初值,這樣就會調用響應的constructor。在stl中,往往與仿函數一起使用,這樣為了使程序看起來干凈。
template <typename T> class print{ public:void operator(){const T& elem){cout << elem << ' ';} };int main(){int ia[6] = {0,1,2,3,4,5};vector<int> iv(ia,ia+6);for_each(iv.begin().iv.end(),print<int>()); }3.靜態成員初始化問題
靜態非const成員初始化,是在類定義內聲明,類外定義時設定初值初始化;
靜態const成員初始化,在類定義內直接初始化。
4.自增自減的前置與后置
C++中使用++和--,根據出現在對象的前面或者后面來進行調用。其實是根據函數重載來實現的,當編譯器看到++a時,就調用operator++(a),當看到a++時,就調用operator(a,int)。這里編譯器為int傳遞一個啞元常量值(因為此值永遠也不會被使用),用來給后綴產生不同的標記。
使用示例如下,這是在類T中的代碼:
//prefix: increment and then fetch T& operate++(){++(this->i);// 成員變量遞增,不同T有不同表現return *this; } //postfix: fetch and then increment const T operator++(int){T temp = *this;++(*this);return temp; }5.stl中區間表示[ )
區間采用前閉后開的表示方法。[first,last),包含的元素范圍為[first,last-1)。
6.仿函數
仿函數就是類似函數的結構體或者類。要把某類當做仿函數使用,類必須進行operator()重載,這是就可以像使用函數一樣使用。
這里也加入第7章的內容,記錄一下仿函數。
許多stl算法提供兩個版本,一個用于一般狀況,一個用于特殊狀況。在特殊狀況時,需要用戶指定某個條件或者策略,而條件或者策略的背后由一整組操作構成。
在stl中,這一整組操作就是指的仿函數。一般的函數,如果當做參數傳遞,只有通過函數指針,但是指針無法只有自己的狀態,更重要的一點是函數指針不能滿足stl對抽象性的要求,所以達不到stl組件的可適配性。
仿函數根據函數參數可以分別為一元仿函數(unary_function)和二元仿函數(binary_function),用戶自定義仿函數必須繼承其中的一個。
下面是一元仿函數的參數型別和返回值類型,二元仿函數類似。
template <class Arg, class Result> struct unary_function{typedef Arg argument_type;typedef Result result_type; }根據功能分為算術類(Arithmetic)仿函數、關系運算類(Rational)仿函數和邏輯運算類(Logical)仿函數,這些仿函數也都繼承自一元或者二元仿函數。
這里要清楚幾個概念,
證同元素,所謂“運算op的證同元素”,即數值與某個元素做op運算,會得到自己,則該元素則為該運算符的證同元素。
證同函數,任何數值通過此函數后,都不會有任何改變。
選擇函數,接受一個pair,傳回第一個或者第二個值。
投射函數,傳回一個參數,忽略另外一個。
總結
以上是生活随笔為你收集整理的《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《STL源码剖析》学习-- 1.9--
- 下一篇: 《STL源码剖析》学习--traits