09第9章-类的构造函数、析构函数和赋值函数.pdfVIP

09第9章-类的构造函数、析构函数和赋值函数.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
构造函数、析构函数与赋值函数是每个类最基本的函数。它 们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就 象没有顶盖的下水道那样危险。 每个类只有一个析构函数和 一个赋值函数,但可以有多个构造函数 (包含一个拷贝构造函 数,其它的称为普通构造函数)。对于任意一个类A,如果不 想编写上述函数,C++编译器将自动为A 产生四个缺省的函 数,如 A(void); // 缺省的无参数构造函数 A(const A a); // 缺省的拷贝构造函数 ~A(void); // 缺省的析构函数 A operate =(const A a); // 缺省的赋值函数 这不禁让人疑惑,既然能自动生成函数,为什么还要程序员 编写? 原因如下: (1)如果使用“缺省的无参数构造函数”和“缺省的析构函 数”,等于放弃了自主“初始化”和“清除”的机会,C++发明人 Stroustrup 的好心好意白费了。 (2)“缺省的拷贝构造函数”和“缺省的赋值函数”均采用 “位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变 量,这两个函数注定将出错。 对于那些没有吃够苦头的C++程序员,如果他说编写构造 函数、析构函数与赋值函数很容易,可以不用动脑筋,表明他 的认识还比较肤浅,水平有待于提高。 本章以类String 的设计与实现为例,深入阐述被很多教科 书忽视了的道理。String 的结构如下: class String { public: String(const char *str = NULL); // 普通构造函数 String(const String other); // 拷贝构造函数 ~ String(void); // 析构函数 String operate =(const String other); // 赋 值函数 private: char *m_data; // 用于保存字符串 }; 9.1 构造函数与析构函数的起源 作为比C 更先进的语言,C++提供了更好的机制来增强程序 的安全性。C++编译器具有严格的类型安全检查功能,它几乎 能找出程序中所有的语法问题,这的确帮了程序员的大忙。但 是程序通过了编译检查并不表示错误已经不存在了,在“错误 的大家庭里,“语法错误”的地位只能算是小弟弟。级别高的错 误通常隐藏得很深,就象狡猾的罪犯,想逮住他可不容易。 根据经验,不少难以察觉的程序错误是由于变量没有被正确 初始化或清除造成的,而初始化和清除工作很容易被人遗忘。 Stroustrup 在设计C++语言时充分考虑了这个问题并很好 地予以解决:把对象的初始化工作放在构造函数中,把清除工 作放在析构函数中。当对象被创建时,构造函数被自动执行。 当对象消亡时,析构函数被自动执行。这下就不用担心忘了对 象的初始化和清除工作。 构造函数与析构函数的名字不能随便起,必须让编译器认得 出才可以被自动执行。Stroustrup 的命名方法既简单又合 理:让构造函数、析构函数与类同名,由于析构函数的目的与 构造函数的相反,就加前缀‘~’ 以示区别。 除了名字外,构造函数与析构函数的另一个特别之处是没有 返回值类型,这与返回值类型为void 的函数不同。构造函数 与析构函数的使命非常明确,就象出生与死亡,光溜溜地来光 溜溜地去。如果它们有返回值类型,那么编译器将不知所措。 为了防止节外生枝,干脆规定没有返回值类型。(以上典故参 考了文献[Eekel, p55-p56]) 9.2 构造函数的初始化表 构造函数有个特殊的初始化方式叫“初始化表达式表” (简称初 始化表)。初始化表位于函数参数表之后,却在函数体 {} 之 前。这说明该表里的初始化工作发生在函数体内的任何代码被 执行之前。 构造函数初始化表的使用规则: u 如果类存在继承关系,派生类必须在其初始化表里调用基 类的构造函数。 例如 class A {… A(int x); // A 的构造函数 }; class B : public A {… B(int x, int y);// B 的构造函数 }; B::B(int x, int y) : A(x) // 在初始化表里调用A 的构造函数 {

文档评论(0)

xiaofei2001129 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档