目标&内容

泛型编程 Template
深入探索面向对象编程继承关系下的对象模型

  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。

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()重载的目的就是使类的行为像函数。

clipboard.png
上文两个类其理论大小应为0

namespace

除了标准库定义的命名空间std外我们还可以自定义namespace,namespace的存在就是为了避免函数及变量名称的重复,不同的namespace名称可以重复使用标准库namespace除了可以使用 using声明外还可以使用std::直接调用。

clipboard.png

类模板

clipboard.png
我们可以通过类模板来实现类成员函数及成员类型的动态绑定。

函数模板

clipboard.png

成员模板

clipboard.png
上述定义了由两个不同类组成的pair类型。
由两个父类组成的pair类型可以由其子类初始化,反之则不行。其原因是父类不存在子类的构造函数。

模板特化

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


风斩冰华
27 声望12 粉丝

coding