手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C /CLI思辨录之拷贝构造函数

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
 虽然对象复制看上去很简单,然而假如您没有对其正确理解,可能会出现一些严重问题。默认情况下,复制对象会导致相应的任何成员的复制。假如您只有实例成员,这看上去是相当不错的。但是假如您的类中含有指向在堆中分配的对象时,情况会怎样呢?考虑下面的代码片断:

#include <stdio.h>
#include <string.h>
class Person
{
 private:
  char* _name;
 public:
  Person()
  {
   _name = new char[256];
  }
  void SetName(const char* name)
  {
   if(strlen(name) 1 < 256)
    strcpy(_name,name);
  }
  void PrintName()
  {
   printf("%s\n",_name);
  }
 };
 int main()
 {
  // 创建对象的第一个实例并赋于名字为John
  Person p1;
  p1.SetName("John");
  p1.PrintName();
  //通过复制p1引用的对象创建另一个对象
  Person p2(p1);
  p2.SetName("Alice");
  p2.PrintName();
  //现在再输出p1的名字
  p1.PrintName();
  scanf("q");
  return 0;
 }

  这里的类Person有一个指向在堆上分配的字符数组的指针。当构造Person对象时,他创建该字符数组并把他的位置存放到变量_name中。

  但是当您创建Person 对象 p2 时,p2的成员用p1的成员初始化。因而,p1的 _name和p2的 _name指向相同的堆对象。如在上例中看到的,调用p2.SetName将改变由这两个类共享的值。所以,当第二次调用p1.PrintName,打印结果是"Alice"。

  所以,这不是我们复制对象所期望的结果,而且还会导致堆崩溃的问题。请再考虑某个函数删除了该数组而p1又要调用该函数的情况?下面,当p2调用PrintName时,他将尽量存取实际上不是在堆上的对象。这种情况下产生的结果往往是难以预料的。

  C 允许我们通过定义拷贝构造函数来克服这类问题。在我们每次通过复制另一个对象来初始化一个对象时,拷贝构造函数都被执行。您能够在拷贝构造函数中覆盖掉缺省的成员函数的复制行为。

  所以,我们的类Person应该修改如下:

class Person
{
 private:
  char* _name;
 public:
  Person()
  {
   _name = new char[256];
  }
  // 这是拷贝构造函数。在此我们初始化一个新的数组,为Person的实例所用
  Person(Person&amp;)
  {
   _name = new char[256];
  }
  void SetName(const char* name)
  {
   if(strlen(name) 1 < 256)
    strcpy(_name,name);
  }
  void PrintName()
  {
   printf("%s\n",_name);
  }
};

  这里类Person中的拷贝构造函数确保了他初始化一个新的数组,为在复制时产生的每一个对象实例所用。这就避免了前面我们提到的问题。

  希望上面所述能够帮助读者理解拷贝构造函数及其使用场所。



文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS