当类中有指针成员变量时,类的构造函数,拷贝构造函数,赋值函数必须进行重写,以求为指针成员变量开辟独立的内存空间。
下面以赋值函数为例进行说明:
(1)对于类的赋值导致的构造函数需要重写的原因
进行讨论一番,如下:
Cname o1;
Cname o2(”ding”)//通过重载构造函数为该指针变量赋了初值
o1=o2;
以上程序段是不可以的,因为此时默认构造函数会使指针成员为空,由于对象o1中的指针没有指向任何内存空间,因此将数据拷贝到一个不存在的内存空间中,程序必然异常终止
(2)那么如何写带指针成员变量的类的构造函数和赋值函数呢?
class cname
{
public:
cname()
{
}
cname(char *str)
{
if(str==NULL)
{
//给指针变量开辟内存
strname = new char[1];
* strname =‘\0’;
}
else
{
strname =(char*)new char[strlen(str)+1];//
strcpy(strname,str);
}
}
~cname()
{
if(strname) delete []strname;
strname = NULL;
}
cname&operator= (cname &a)
{
if(strname)
{
delete []strname;
strname = NULL;
}
//以下就是关键,开辟空间来存放指针型数据成员
if(a.strname)
{
strname=(char*)new char[strlen(a.strname)+1];//
strcpy(strname,a.strname);
}
return *this;
}
public:
char *strname;
};
void main()
{
cname o1(“dd”);
cname o2("fghgffg");
o1=o2;
cout << o1.strname <<endl;
}
非常重要:此时,程序运行正确。但是当把cname o1(“dd”);改为cnameo1;时,程序会内存泄露。这是因为显示默认的构造函数会把strname置空,此时它不指向任何内存,故而会出错。
cname o1(“dd”);调用的是自己定义的构造函数,在那个构造函数中开辟一块内存给指针变量,所以则程序运行正常