面向對象class雜項筆記

閒扯

衆所周知,c++編程範式比較多, 實際工程中通常面向對象和泛型編程比較多, 有時候不一樣的項目組的喜愛有差別致使代碼的編程範式不一樣, 互相review的時候基本看不懂對方的代碼(喜歡泛型的應該看面向對象的沒啥壓力, 可是沒怎麼用過泛型的看着一堆template就比較頭疼); 看過的項目代碼不多,不知道如今(現代)業界c++通常什麼是最佳範式.c++

  • 泛型編程(Generic Programming) : STL大量使用, 核心是template class/Iterator class組合而成算法

  • 面向對象編程(Object-Oriented Programming): 經過對類的虛繼承而實現了多態, 複雜的對象模型.編程

不考慮類的繼承, 實際上一個template class涉及的方方面面知識點已經比較全面了, 所以列出相關的知識點權當筆記.函數

explicit

其實這個沒什麼好說的, 一個non-explicit構造函數原本就是比較彆扭的, 保守一點直接加上explicit防止犯錯的機會. 不管是轉成類對象仍是類對象轉成內置類型, 都顯示轉換, 後者直接利用:性能

operator double() const {}指針

pointer-like classes

若是要找出一個STL中的相似class的話, 那麼就是各個容器類的迭代器了. Iterator class或者說pointer-like class通常不單獨使用, 而是附着在容器中, 方便贊成操做, 好比有一個容器類:code

class A { public: /// private:
    vector<int> vecs; };

爲了方便對把類用於算法, 要求類提供諸如begin() 和 end()方法, 那麼就須要在類內部嵌套一個迭代器類型了, 以下對象

class A { public:
    typedef A_iterator iterator;
    friend class A_iterator;
    iterator begin();
    iterator end(); private:
    vector<int> vecs };

而後對於迭代器的操做, 內聚到A_iterator中去實現, 固然STL爲了統一全部迭代器操做, 對迭代器的實現是有要求的, 通常本身實現的迭代器起碼應該提供解引用/自增(前置/後置)/相等等操做.繼承

function-like class

不復雜的功能基本上能夠被lambda表達式所替代, 然後者提供更好的可讀性和等價的性能, 要否則代碼中一堆函數對象類, 看着頭暈;固然熟悉一下標準庫中已內置的函數對象類仍是頗有必要的.ip

auto

減輕了不少心智負擔, 並且c++14中, lambda表達式中也可使用auto, 能夠直接這麼用; 通常搭配range for來用

auto multiply = [](auto a, auto b) {return a*b;};

對象模型

c++中類的大小取決於元素的類型和個數; 編譯器對齊策略. 其中,c++的多態的實現有賴於虛函數表,對於沒有虛函數的函數調用來講,靜態綁定編譯時肯定調用方法, 而有虛函數的函數調用,則運行時確認.

  • 是不是虛函數,若是是,則會給虛函數表指針分配空間

  • 對於空類,編譯器也分配了一個字節大小的位置

  • 考慮到字節對齊,編譯器會自動在最後多分配一些空間(具體多少和32/64相關)

template class實現

  • 除了常規的構造/賦值/拷貝以外,和普通的類的區別在於,在類聲明外的函數定義, template<typename X>也是限定符之一.

  • template class不只可以傳遞變量類型, 同時能夠傳遞函數對象(函數對象也是常量表達式的一種), 經過提供不一樣的方法而構造不一樣的類對象.

相關文章
相關標籤/搜索