Shared_ptr允许当智能指针被建立起来是指定一个资源释放函数绑定于智能指针身上,也就是说在shared_ptr被初始化的同时也可以指定其管理的资源的释放函数。Shared_ptr提供的某个构造函数接受两个实参:一个是被管理的指针,另一个是引用次数变为0时将被调用的“删除器”。Shared_ptr构造函数坚持其第一个参数必须是个指针。它支持定制型删除器。
缺省情况下C++以by value方式传递对象至函数,这种情况下函数参数都是以实际参数的副本为初值,而调用端获得的也是函数返回值的一个副本。这些副本系有对象的copy构造函数产出。这就产生了by reference方式传递参数的方法。
以by reference方式传递参数也可以避免对象切割问题,当一个derived class对象以by value方式传递并被视为一个base class对象,base class的copy构造函数被调用,但是属于derived class对象的那些属性全部被切割,仅仅留下一个base class对象。解决对象被切割的问题就是by reference的方式传递参数给函数。
但是对于内建类型,by value比by reference的方式要好很多。
绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个type多个这样的对象。
对一个函数模板惊醒特化:
Template <>
Void swap<widget> (widget&a,widget& b){} //这就是对swap函数的特化
Tempalate <typename T>
Void swap<widget<T> > (widget<T>&a,widget<T>& b) {} //这事偏特化一个函数模板(不合适)
但是c++值允许对类模板偏特化,在函数模板身上偏特化是行不通的。
但是我们可以对一个函数模板进行重载
Template <tyoename T>
Void swap(widget<T>& a,widget<T>& b)
Template<typename T>
Void dosomething(T& obj1,T& obj2)
{
Using std::swap; //令std::swap在此函数内可用
….
Swap(obj1,obj2);//为T型对象调用最佳swap版本
}
一旦编译器看到对swap的调用,他们便查找合适的swap并调用之这个时候的查找规则是根据作用域的查找规则来的,在本地作用域查找不到便到外部查找。
避免遮掩继承而来的名称:
对于base class类中,假设有虚函数m1() m1(int) ,这是连个虚函数,同时重载了虚函数,有非虚函数m3.在derived class中,重新定义了m1()和m3(),那么base class中的这三个函数都被遮掩。Base::m1 和base::m3都不再被derived继承。即使base classes和derived classes内的函数有不同的参数类型也适用,而且不论函数是virtual 或non-virtual一体适用。
其实strategy模式就是使用function来实现的函数注册绑定机制它和bind的联合使用
绝不重新定义继承而来的non-virtual函数,因为这个函数从继承的角度来说继承了接口与实现,如果重新定义就代表这重载,就会发生遮掩的现象。Non-virtual都是静态绑定的
模板就是静态多态,编译期的多态