05 C++中智能指针point-like class和仿函数function-like的基本用法(学自Boolean)

来源:互联网 发布:学说四川话的软件 编辑:程序博客网 时间:2024/06/07 03:02

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)方法,调用仿函数;