若类中有指针型数据成员,类的几个函数的重写

来源:互联网 发布:北京铁路软件开发 编辑:程序博客网 时间:2024/05/27 20:46

当类中有指针成员变量时类的构造函数,拷贝构造函数,赋值函数必须进行重写,以求为指针成员变量开辟独立的内存空间。

 

下面以赋值函数为例进行说明:

 

(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”);调用的是自己定义的构造函数,在那个构造函数中开辟一块内存给指针变量,所以则程序运行正常

0 0