• 构造队列和三法则的编写<<0925


    #include <iostream>
    #include <string>
    #include <vector>
    #include <assert.h>
    using namespace std;
    
    class Node
    {
        public:
            Node()
                :date_(0),next_(0)
            {}
            typedef int datetype;//在类中使用typedef定义新类型,其有效范围为定义起始位置到类右大括号。
            datetype date_;
            Node *next_;
    };
    
    class Queue
    {
        public:
            Queue();
            void Queue_add(const Node::datetype &date);//const 不能漏掉,可以把一个no-const传给const,反过来就不可以
            Queue(const Queue &q);
            Queue &operator=(const Queue &s);
            void print();
            ~Queue();
        private:
            Node *first_;//类里面包含别的类
            Node *last_;     
    };
    
    Queue::Queue()
        :first_(new Node),last_(new Node)
    {
        first_ = last_ =  NULL;
    }
    
    void Queue::Queue_add(const Node::datetype &date)
    { 
        Node *tmp = new Node;
        tmp -> date_ = date;
        if (first_ == NULL)
        {
            first_ = last_ = tmp;
        }
        else
        {
            last_ -> next_ = tmp;
            last_ = tmp;
        }
    }
    
    Queue::Queue(const Queue &q)
    {
        //cout << first_ << endl;
        first_ = last_ = NULL;//复制构造函数也必须完成构造函数的步骤
        assert(first_ == NULL);
        Node *cru = q.first_;
        while (cru)
        {
            Node *tmp = new Node;
            tmp -> date_ = cru -> date_;
            tmp -> next_ = NULL;
            if (first_ != NULL)
            {
                last_ -> next_ = tmp;
                last_ = tmp;
            }
            else 
            {
                first_ = last_ = tmp;
            }
            cru = cru -> next_;
        }
    }
    
    Queue &Queue::operator=(const Queue &q)
    {
     /*  if (first_ == q.first_ && last_ == q.last_)
            return *this;
        Node *cru = first_;
        while (cru)
        {
            Node *tmp = cru;
            cru = cru -> next_;
            delete tmp;
            tmp = NULL;
        }
    
        Node *qcru = q.first_;
        while (qcru)
        {
            Node *tmp = new Node;
            tmp -> date_ = qcru -> date_;
            if (first_ == NULL)
                first_ = last_ = tmp;
            else
            {
                last_ -> next_ = tmp;
                last_ = tmp;
            }
            qcru = qcru -> next_;
        }
        return *this;
    */  
        
        Queue *sp = new Queue(q);//赋值运算符里面可以使用复制运算符,但是如果使用new的话,不使用delete,会造成内存泄露
        this->first_ = sp->first_;//最重要的一点:函数结束是sp销毁(是一个指向Queue的指针),下面那个在函数结束的时候是ps销毁,它是一个Queue类,销毁的时候会调用析构函数,释放内存
        this->last_ = sp->last_;
        return *this;
    
    /*    Queue ps(q);//malloc 和 new申请的空间是在"堆"上的,平时我们都是用声明变量来申请空间的,此时申请到的空间是"栈"上的,注意区分“堆”和“栈”。栈上的空间,不需要程序员负责释放,函数返回后自动就会释放;但是对上的空间,必须由程序员用 free 或 delete 释放,否则就会造成“内存泄露”。
        ps.print();
        this -> first_ = ps.first_;
        this -> last_ = ps.last_;
        return *this;
    */
    }
    
    
    Queue::~Queue()
    {
        while (first_)
        {
            Node *ptr = first_;
            first_ = first_ -> next_;
            delete ptr;
        }
    }
    
    void Queue::print()
    {
        Node* cur = first_;
        while (cur)
        {
            cout << cur -> date_<< endl;
            cur = cur -> next_;
        }
    }
    
    int main(int argc, const char *argv[])
    {
        Queue s1;
        s1.Queue_add(1);
        s1.Queue_add(2);
        s1.Queue_add(3);
        s1.Queue_add(4);
    
        s1.print();
    
        Queue s2(s1);
        s2.print();
    
        Queue s4,s3;
        s4 = s3 = s1;
        s3.print();
        s4.print();
        /*  
        Queue s2,s3;
        s2 = s3 = s1;
        Queue s4(s1);
        s1.print();
        s2.print();
        s3.print();
        s4.print();
        s2 = s2;
        s2.print();
        */
        return 0;
    }
    
    
  • 相关阅读:
    Android 4.1 for Developers
    Frame Animation 帧动画
    07事事精明,人人远离。
    Launcher 拖拽 流程小结『android 2.3 2.2』
    Android开发书籍推荐
    My first App EncryptWheel is in WAITING FOR REVIEW status
    ubuntu安装显卡驱动
    Shell脚本学习笔记(十)文件操作
    Shell脚本学习笔记(四)流程控制
    Shell脚本学习笔记(五)函数
  • 原文地址:https://www.cnblogs.com/sunstars/p/3999024.html
Copyright © 2020-2023  润新知