泛型编程与面向对象编程是c++两大技术主线 分属不同思维
继承关系所形成的对象模型(Object Model) 包括隐藏于底层的this指针 vptr(虚指针)vtbl(虚表)vitural mechanism(虚机制)以及virtual function(虚函数)造成的polymorphism(多态)效果
Conversion function 转换函数
public:
Fraction(int num, int den = 1)
: m_numerator(num), m_denominator(den){ }
operator double () const{
Return (double)(m_numerator / m_denominator);
} //调用这个函数可以使这个类可以被转化为double 通常会加const
Fraction f(3,5)
double d = 4+f; //调用operator double()
编译器思路
:1)找是否重载了+
2)找是否重载了double
non-explicit-one-argument ctor
//explict 可以出现在构造函数前面
调用 non-ecplicit ctor 将4转为Fraction(4,1)
然后调用operator+
Fraction f(3,5);
Fraction d2 = f + 4;//[Error] ambiguous
Fraction d2 = f + 4;//[Error] converion from ‘double ‘to ‘Fraction’ request
double d = 4;//可以通过
operator double 和 non-explicit 共存时能否编译取决于如何使用
explicit作用:
Class vector<bool,Alloc>//???
{
Protected;
reference operator [] (size_type n){
return *
}
point-like-class 设计一个像指针的类
1)关于智能指针
2.0之前 auto point 之后 shared_ptr
2)迭代器
不但处理*和->还处理++ --
function-like classes 设计一个行为像函数的类(所谓仿函数)
函数模板使用时不用指明
成员模板 member template
目的:让构造函数更有弹性
模板特化 (full)specialization
partial specialization模板偏特化
(个数的偏)
可以指定一个元素类型 指定一个分配器
(范围的偏)
上面的是泛化 下面的是特化(注:上下的T不是同一个东西)
模板模板参数 template template parameter
这不是模板模板参数
三个主题
关于variadic template(since C++11)模板参数可变化
关于auto
必须在申明的时候就赋值
关于 range-base for
for(decl : coll) //从容器中一个个抓出来 赋值到左边 执行一次statement
{
statement
}
c++11以前可以用 容器的迭代器和 foreach来实现
注:pass by value不会改变容器中的数值,而pass by reference会
网友评论