构造、拷贝构造、赋值、析构

需要注意的问题(当数据成员函数指针型变量,需要申请空间赋值时)
1.构造函数
①需要给空指针申请一个‘\0’的空间
2.拷贝构造函数
①传入的参数,必须引用传递否则会出现无休止的拷贝构造
②对其参数值不做修改,传入的参数需要加const
③避免浅拷贝的产生,每次拷贝构造,都重新申请空间赋值。
3.赋值=
①需要返回引用型变量,否则会再返回值时,创建临时对象,又会无休止的拷贝构造
②对其参数值不做修改,传入的参数需要加const
最重要先判断是否是给自己赋值,如果是,直接返回
④为考虑到异常安全,此时采用拷贝构造一个 参数(n) 的 临时对象(temp) ,来交换他们指针所指向的空间,在出此作用域后,临时对象就会释放。
4.析构
①如果有派生类,需要将析构函数声明为虚函数,来避免内存泄漏。
#include <iostream>
using namespace std;

class Node
{
public:
    Node(const char*str="",int a = 0):m_a(a)
    {
        if (str == NULL)
        {
            m_p = new char[1];
            m_p[0] = '\0';
        }
        else
        {
            m_p = new char[strlen(str)+1];
            strcpy(m_p, str);
            m_p[strlen(str)] = '\0';
        }
    }
    Node(const Node& n)
    {
        int len = strlen(n.m_p);
        m_p = new char[len + 1];
        strcpy(m_p,n.m_p);
        m_a = n.m_a;
    }
    Node& operator=(const Node& n)
    {
        if (this != &n)
        {
            Node temp(n);
            char* temp_str = temp.m_p;
            temp.m_p = m_p;
            m_p = temp_str;
            m_a = n.m_a;
        }
        return *this;
    }
    virtual ~Node()
    {
        delete m_p;
    }
private:
    char* m_p;
    int m_a;
};

int main()
{
    Node a("abcd",10);
    
    Node b(a);
    Node c;
    c = a;
}

 

posted @ 2019-08-19 20:34  Single_Dont  阅读(310)  评论(0编辑  收藏  举报