1、引言
本篇介绍智能指针smart point和仿函数functors的用法。该程序是部分模板库的代码解析。
2、智能指针
1)概述
智能指针是类似于类的对象,但这种对象还有其他的功能。在C++模板库中大致可以分为三种智能指针auto_ptr(C++98)、unique_ptr(C++11)、shared_ptr(C++11)。这三种智能指针模板都定义了类似指针的对象,可以用new获得的地址赋给这种对象,同时当智能指针过期时,析构函数会使用delete来释放内存,防止单纯使用指针发生的内存泄漏(这三种智能指针位于<memory>头文件,std的名称空间下)。下面将简要介绍shared_ptr的设计方法。
2)shared_ptr部分设计
template <typename T>
class shared_ptr
{
public:
shared_ptr(T * p) :px(p){ }
T& operator * () const{
return *px;
}
T * operator -> () const {
return px;
}
private:
T * px;
};
注意点:
a、采用类模板的方法设计shared_ptr类,类中存放指针变量 px,用于指向对象类,如下的struct对象Foo;
b、设计操作符重载函数operator * ()和operator ->()用于对类对象使用 * 和 -> 返回指针对象和指针,具体见3)中操作。
3)使用示例
Foo结构对象如下:
struct Foo
{
int num = 3;
void method(void){
std::cout << "yes, u call it!" << std::endl;
}
};
主程序:
#include "pointlike.h"
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
shared_ptr<Foo> sp(new Foo);
sp->method();
std::cout << "num的值:" << (*sp).num << std::endl;
return 0;
}
/*输出结果:
yes, u call it!
num的值:3
*/
注意点;
a、主程序中声明shared<Foo> sp对象,sp可以当做Foo的指针使用;
b、因声明sp对象时,有创建动态内存,而使用智能指针在过期时,会自动释放内存(在智能指针设计时实际有设计析构函数),这也是使用智能指针的好处☆。
3、仿函数
下面通过一个示例说明仿函数的用法。
1)设计pair类,包括两个类型T1、T2
template <typename T1, typename T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair() :first(T1()), second(T2()){ }
pair(const T1& a, const T2& b) :first(a), second(b){ }
};
2)对pair类,设计仿函数类selectlst
template <typename pair>
struct selectlst{
const typename pair::first_type&
operator() (const pair& x) const {
return x.first;
}
};
注意点:
a、设计selectlst类,只能使用pair对象数据;
b、使用操作符重载函数operator () 来定义仿函数,此处是对类selectlst使用函数,返回pair中first的值;
c、在实际使用过程中,selectlst会继承相应的类如下所示,一个unary_function和一个binary_function:
3)主程序使用
#include "functionlike.h"
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
pair<int, double> pi(10, 20.0);
selectlst<pair<int ,double>> slst;
auto result = slst(pi);
std::cout << result << std::endl;
return 0;
}
/*输出结果:
10
*/
注意点:
a、先声明pair对象,在声明selectlst对象(创建默认构造方法);
b、使用slst(pi)方法,调用仿函数;