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

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

 

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

 

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值