Effective c++--智能指针 & 函数模板

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都是静态绑定的

模板就是静态多态,编译期的多态

时间: 2024-10-21 04:01:46

Effective c++--智能指针 & 函数模板的相关文章

智能指针类模板(五十)

我们之前在 C++ 的学习中学习了有关智能指针的知识.那么智能指针的意义是现代 C++ 开发库中最重要的类模板之一:是 C++ 中自动内存管理的主要手段,它能够在很大程度上避开内存相关的问题.在 STL 标准库中的智能指针为 auto_ptr,它的特点是:1.生命周期结束时,销毁指向的内存空间:2.不能指向堆数组,只能指向堆对象(变量):3.一片堆空间只属于一个智能指针对象:4.多个智能指针对象不能指向同一片堆空间. 下来我们就来使用下 auto_ptr 智能指针 #include <iostr

C++智能指针类模板

1.智能指针本质上是一个对象,这个对象可以像原生的一样来进行使用.原因是智能指针对象对应的类中,将指针相关的操作都进行了重载操作处理,所以才会达到这种像是原生的效果. 2.智能指针的意义: 现在C++开发库中最重要的类模板之一 C++中自动内存管理的主要手段 能够在很大程度上避开内存相关的问题 3.在QT中开发库中也提供了智能指针类模板,在STL标准库中也提供了,在c++的标准库忘了什么名了中也提供了智能指针类模板.所以智能指针类模板在C++中的地位很重要 4.STL中的智能指针类模板 auto

第61课 智能指针类模板

1. 智能指针的意义 (1)现代C++开发库中最重要的类模板之一 (2)C++中自动内存管理的主要手段 (3)能够在很大程度上避开内存相关的问题(如内存泄漏.内存的多次释放等) 2. STL中的智能指针 (1)auto_ptr智能指针 ①生命周期结束时,销毁指向的内存空间 ②只能用来管理单个动态创建的对象,而不能管理动态创建的数组.即不能指向堆数组,只能指针堆对象(变量) int* pn = new int[100]; auto_ptr<int> ap(pn); //auto_ptr指向堆数组

C++中智能指针的模板类

在C++中,智能指针是一个非常重要的概念.因为C++的类动态分配的对象不能自动释放掉,需手动调用new运算符.当程序员大意时,或程序发生异常时,或许就会发生没有手动释放内存而造成内存泄露. 智能指针的定义:就是在一个类中,存在一个指向另一个类对象的指针,并通过对指针运算符(比如:->,*)的重载,就可以实现利用当前类的对象通过指针运算符来操纵另一个类的成员(就像另一个类的指针操作一样),并且,在析构函数中定义了delete操作,借助于变量的作用域,能够实现类对象空间的自动释放. 在C++ 11中

智能指针的模板,用来管理动态分配的内存

#ifndef SMARTPTR_HPP #define SMARTPTR_HPP #include <stddef.h> template <typename T> class SmartPtr{ public: SmartPtr(T *type = NULL); void resetPtr(T *type); const T *getPtr()const; operator bool() const{ return ptr_ == NULL; } ~SmartPtr(); T

【C++】智能指针类和OpenCV的Ptr模板类

智能指针类 引用计数 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象.引用计数为0时,删除对象. 其基本使用规则是: 每次创建类的新对象时,初始化指针并将引用计数置为1.当对象作为另一对象的副本而创建时,复制构造函数复制指针并增加与之相应的引用计数的值.对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数的值(如果引用计数减至0,则删除对

【智能指针的延伸】两种定制删除器的实现方法

所谓定制删除器,就是向目标模板提供一个可以自由选择析构的接口,这样做的好处就是可以使智能指针模板不再只能单独管理内存,我们还可以用它管理文件指针之类的东西.其实现方法有两种,这里我们以share指针为例.   1.传递一个类的模板参数并给出缺省值,模板中将该类设定为成员变量,通过该类(删除类)的实例化,调用类中所存的删除方法进行删除. 代码如下: #include<iostream> template <class T> struct Del { void operator ()(

ReactNative 4Android源码分析二: 《JNI智能指针之实现篇》

文/Tamic http://blog.csdn.net/sk719887916/article/details/53462268 回顾 上一篇介绍了<ReactNative4Android源码分析2: JNI智能指针之介绍篇>JNI智能指针与wrapper class的作用,下面将对它们的具体实现进行分析,并解答上篇提出的几个问题 前文回顾了java object在JNI中的引用对象jobject的3种类型.智能指针自然也有相应的如下类型: global_ref 全局指针与jobject全局

动态内存和智能指针

c++中动态内存的管理是通过一对运算符来完成的:new.在动态内存中为对象分配空间并返回一个指向该对象的指针,我们呢,可以选择对对象进行初始化,delete接受一个动态对象的指针,销毁该对象,并返回与之关联的内存. 动态内存的使用的不足: 1.保证在正que的时间释放内存是及其困难 2.有时我们会忘记释放内存,这样就导致内存泄漏 3.有时还存在引用内存的情况,但是我们已经释放了它,这样就导致非法内存的指针 这样就产生了智能指针(smart pointer)来动态管理内存,智能指针优点: 1.行为