目标&内容
泛型编程 Template
深入探索面向对象编程继承关系下的对象模型
- this指针
- vptr虚指针
- vtbl虚表
- virtual mechanism 虚机制
- 虚函数引起的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();
function-like classes
其中对operator()重载的目的就是使类的行为像函数。
上文两个类其理论大小应为0
namespace
除了标准库定义的命名空间std外我们还可以自定义namespace,namespace的存在就是为了避免函数及变量名称的重复,不同的namespace名称可以重复使用标准库namespace除了可以使用 using声明外还可以使用std::直接调用。
类模板
我们可以通过类模板来实现类成员函数及成员类型的动态绑定。
函数模板
成员模板
上述定义了由两个不同类组成的pair类型。
由两个父类组成的pair类型可以由其子类初始化,反之则不行。其原因是父类不存在子类的构造函数。
模板特化
由原来的泛型具体化
## 模板偏特化 ##
个数的偏
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*>
{
};
通过具体化个别的变量类型或者通过使用类型指针来实现模板偏特化。
模板模板参数
c++11
auto关键字
范围for
reference
常见用途
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。