zoukankan      html  css  js  c++  java
  • C++my_auto_ptr类

    my_auto_ptr通过它的析构函数来调用delete删除某对象的指针,来达到自动释放内存,而不需要显示的调用delete某对象。

    (1)实现自动释放

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    struct People 
    {
    public:
        People() {cout << "People" << endl;}
        ~People() {cout << "~People" << endl;}
        void run(void) const {cout << "Peple can run!" << endl;}
    };
    
    class my_auto_ptr
    {
    public:
        my_auto_ptr(People* p) : p(p) {}
        ~my_auto_ptr() {delete p;}
    private:
        People* p;
    };
    
    int main(int argc, char *argv[])
    {
        my_auto_ptr ptr(new People);
    
        return 0;
    }

    程序输出:

    People

    ~People

    (2)实现调用该对象的成员

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    struct People 
    {
    public:
        People() {cout << "People" << endl;}
        ~People() {cout << "~People" << endl;}
        void run(void) const {cout << "Peple can run!" << endl;}
    };
    
    class my_auto_ptr
    {
    public:
        my_auto_ptr(People* p) : p(p) {}
        ~my_auto_ptr() {delete p;}
        People* operator->() const {cout << "->" << endl; return p;}
        const People& operator*() const {cout << "*" << endl; return *p;}
        const People* operator&() const {cout << "&" << endl; return p;}
    private:
        People* p;
    };
    
    int main(int argc, char *argv[])
    {
        my_auto_ptr ptr(new People);
        
        ptr->run();
        (*ptr).run();
        &ptr;
    
        return 0;
    }
    
    /*
    总结:
    
    ptr->run();
    这里ptr是一个my_auto_ptr对象,p->run的含义与(p.operator->())->run求值相同。
    p.operator->()返回对People对象的指针,然后对返回的People调用run()函数。
    */

    程序输出:

     People
    ->
    Peple can run!
    *
    Peple can run!
    &
    ~People

    (3)实现泛型版本

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    struct People 
    {
    public:
        People() {cout << "People" << endl;}
        ~People() {cout << "~People" << endl;}
        void run(void) const {cout << "Peple can run!" << endl;}
    };
    
    class Student {};
    
    template<typename T>
    class my_auto_ptr
    {
    public:
        my_auto_ptr(T* p) : p(p) {}
        ~my_auto_ptr() {delete p;}
        T* operator->() const {cout << "->" << endl; return p;}
        const T& operator*() const {cout << "*" << endl; return *p;}
    private:
        T* p;
    };
    
    int main(int argc, char *argv[])
    {
        my_auto_ptr<People> ptr1(new People);
        my_auto_ptr<Student> ptr2(new Student);
    
        return 0;
    }
  • 相关阅读:
    第四次作业——个人作业——软件案例分析
    作业五——团队项目——需求规格说明书
    团队项目——团队展示
    作业三——结对编程
    作业二——结对项目之需求分析与原型模型设计
    leetcode 212 单词搜索II
    leetcode 130. 被围绕的区域
    leetcode 695 Max Area of Island 岛的最大面积
    【《算法》学习笔记】一:
    leetcode 191 位1的个数
  • 原文地址:https://www.cnblogs.com/Robotke1/p/3063103.html
Copyright © 2011-2022 走看看