构造拷贝构造赋值析构
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++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数