c++ 面向對象高級編程 第三週學習筆記

目標&內容

泛型編程 Template
深刻探索麪向對象編程繼承關係下的對象模型node

  1. this指針
  2. vptr虛指針
  3. vtbl虛表
  4. virtual mechanism 虛機制
  5. 虛函數引發的polymorphism 多態

conversion function

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++

no-explicit-one-argument ctor

Fraction d2=f+4;

將調用no-explicit-one-argument ctor將4轉換爲Fraction(4,1)
當Fraction->double和double->Fraction並存時,將會產生二義性。
經過對構造函數添加explicit關鍵字能夠避免編譯器對其進行隱式轉換調用。編程

pointer-like classes關於智能指針

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();函數

迭代器iterator

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();

clipboard.png

function-like classes

clipboard.png
其中對operator()重載的目的就是使類的行爲像函數。this

clipboard.png
上文兩個類其理論大小應爲0spa

namespace

除了標準庫定義的命名空間std外咱們還能夠自定義namespace,namespace的存在就是爲了不函數及變量名稱的重複,不一樣的namespace名稱能夠重複使用標準庫namespace除了能夠使用 using聲明外還能夠使用std::直接調用。指針

clipboard.png

類模板

clipboard.png
咱們能夠經過類模板來實現類成員函數及成員類型的動態綁定。c++11

函數模板

clipboard.png

成員模板

clipboard.png
上述定義了由兩個不一樣類組成的pair類型。
由兩個父類組成的pair類型能夠由其子類初始化,反之則不行。其緣由是父類不存在子類的構造函數。code

模板特化

clipboard.png
由原來的泛型具體化對象

## 模板偏特化 ##
個數的偏
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*>
{
    
};

經過具體化個別的變量類型或者經過使用類型指針來實現模板偏特化。

模板模板參數

clipboard.png

clipboard.png

c++11

auto關鍵字
範圍for

reference

clipboard.png

常見用途

clipboard.png

繼承下的構造和析構

clipboard.png

繼承+複合下的構造和析構

clipboard.png

相關文章
相關標籤/搜索