泛型編程 Template
深刻探索麪向對象編程繼承關係下的對象模型node
class Fraction { public: Fraction(int num,int den=1) :m_numerator(num),m_denominator(den){} operator double() const { return (double)(m_numerator/m_denominator); } Fraction& operator+(const Fraction&f) { return Fraction(....) } private: int m_numerator//分子 int m_denominator//分母 } }; Fraction f(3,5); Fraction d2=f+4;
note:上面的double轉換函數沒有return type。c++
Fraction d2=f+4;
將調用no-explicit-one-argument ctor將4轉換爲Fraction(4,1)
當Fraction->double和double->Fraction並存時,將會產生二義性。
經過對構造函數添加explicit關鍵字能夠避免編譯器對其進行隱式轉換調用。編程
template<class T> class shared_ptr { public: T& operator*()const { return *px; } T* operator->()const { return px; } shared_ptr(T* P):px(p){} private: T* px; long* pn; }; struct foo { ,,, void method(void){} }; shared_ptr<foo>sp(new foo) foo f(*sp); sp->method();//px->method();
智能指針會在內部調用真實指針,->運算符會一直做用到底層所以sp->method();//px->method();函數
template<class T) struct _list_node { void* prev; void* next; T data; }; reference operator*()const { return (*node).data; } pointer operator->()const { return &(operator*()); } list<foo>::iterator ite; ... *ite;//得到一個foo object; ite->method(); //意思是調用foo::method() //至關於(*ite).method(); //至關於(&(ite))->method();
其中對operator()重載的目的就是使類的行爲像函數。this
上文兩個類其理論大小應爲0spa
除了標準庫定義的命名空間std外咱們還能夠自定義namespace,namespace的存在就是爲了不函數及變量名稱的重複,不一樣的namespace名稱能夠重複使用標準庫namespace除了能夠使用 using聲明外還能夠使用std::直接調用。指針
咱們能夠經過類模板來實現類成員函數及成員類型的動態綁定。c++11
上述定義了由兩個不一樣類組成的pair類型。
由兩個父類組成的pair類型能夠由其子類初始化,反之則不行。其緣由是父類不存在子類的構造函數。code
由原來的泛型具體化對象
## 模板偏特化 ## 個數的偏 template<typename T,typename allocator=> class vector { ... } template<typename allocator=> class vector<bool,allocator> { };
範圍的偏
template<typename T> class c { ... } template<typename T> class c<T*> { };
經過具體化個別的變量類型或者經過使用類型指針來實現模板偏特化。
auto關鍵字
範圍for
常見用途