当前位置: 代码迷 >> 综合 >> 《c++必知必会》学习心得——day4
  详细解决方案

《c++必知必会》学习心得——day4

热度:31   发布时间:2024-01-19 10:24:56.0

条款42 智能指针

 

是对c++语言的一种扩展

 

智能指针式一个类型,他乔装打扮为一个指针,并提供了内建指针无法提供的功能,也就是说,一个智能指针就是使用类的构造函数,析构函数,和复制操作符所所提供的功能来控制或跟踪他所指向的东西的访问,

他的应用有资源句柄和auto-ptr到stl迭代器从计数指针到指向成员函数的指针包装器

 

条款43 auto-prt

 

auto-prt是一个一个类模板,用于生成具体的智能指针

 

auto_ptr源码


template <class T>
class auto_ptr
{
public:
    explicit auto_ptr(T *p = 0); //防止隐式转换
    template <class U>
    auto_ptr(auto_ptr<U>& rhs); //任何兼容的auto_ptr作为一个新的auto_ptr初值   
    ~auto_ptr();
   
    template <class U>
    auto_ptr<T>& operator = (auto_ptr<U>& rhs);
    T& operator * () const;
    T* operator -> () const;
   
    T* get()const; //返回保存的指针
    T* release(); //返回保存指针,并使auto_ptr成为未绑定的状态   
    void reset(T *p = 0); //重新绑定  
private:
    T *pointee;
    template <class U>
    friend class auto_ptr<U>;
};

template <class T>
inline auto_ptr<T>::auto_ptr(T *p) //让所有的auto_ptr classes都成为另一个auto_ptr的友元
:pointee(p)
{}

template <class T>
template <class U>
inline auto_ptr<T>::auto_ptr(auto_ptr<U>& rhs)
:pointee(rhs.release())
{}

template <class T>
inline auto_ptr<T>::~auto_ptr()
{delete pointee;}   //这里不是delete[],所以autuo_ptr不能保存动态数组

//不是简单的赋值,而是将实参绑定的对象转移到当前对象
template <class T>
template <class U>
inline auto_ptr<T>& auto_ptr<T>::operator = (auto_ptr<U>& rhs)
{
    if (this != &rhs) reset(rhs.release());
    return *this;
}

template <class T>
inline T& auto_ptr<T>::operator * () const
{return *pointee;}

template <class T>
inline T* auto_ptr<T>::operator -> () const
{return pointee;}

template <class T>
inline T* auto_ptr<T>::get() const
{return pointee;}

template <class T>
inline T* auto_ptr<T>::release()
{
    T *oldptr = pointee;
    pointee = 0;
    return oldptr;
}

template <class T>
inline void auto_ptr<T>::reset(T *p)   
{
    //未处理p参数非法的情况
    if (pointee != p){
        delete pointee;
        pointee = p;
    }
}

 

条款44 指针运算

 

两个同类型的指针可以进行减运算,运算的结果是参见两个预算的指针之间的元素个数(不是字节数);

高地址减去低地址是正数;否则是负数;指针不是整数

list的迭代器不是一个内建指针,而是一个带有重建操作符的智能指针;

 

条款 45 模板术语

 

对于模板的实例化(instantiation)和特化(specialization)不是一回事

对模板的特化是指你以一套模板实参供应给一个模板所得到的东西;

模板的特化可能会也可能不会导致模板的实例化

 

 

把模板参数替换为实际类型的过程叫实例化,产成的结果比如:
template <>
class <char>
{
}; 这就是特化了.特化有局部和完全之分.

 

 

条款 46 类模板显式特化

 

条款 47 模板局部特化

 

不能对函数模板进行局部特化

 

条款 48 类模板成员特化

 

条款 49利用tyoename消除歧义

~~~

条款 61关键字

剩余的条款都是讲模板的,我的神啊,什么都看不懂,看来还是要好好学习吧

等专门看一本模板的书在回过头来看这些条款吧

 

本书暂时就看到这里多回顾,好好体会

革命尚未成功,我们仍需努力

加油 ~!!!!