构造拷贝构造赋值析构

Posted Single_Dont

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造拷贝构造赋值析构相关的知识,希望对你有一定的参考价值。

需要注意的问题(当数据成员函数指针型变量,需要申请空间赋值时)
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;
}

 

以上是关于构造拷贝构造赋值析构的主要内容,如果未能解决你的问题,请参考以下文章

C++类和对象(构造函数析构函数拷贝构造函数赋值运算符重载Const成员)详细解读

C++类和对象(构造函数析构函数拷贝构造函数赋值运算符重载Const成员)详细解读

C++类和对象(构造函数析构函数拷贝构造函数赋值运算符重载Const成员)详细解读

c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数

编程题编写String类的构造函数拷贝构造函数析构函数和赋值函数

8. 析构构造深拷贝浅拷贝赋值操作符重载