泛型编程 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
常见用途