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