C++标准教程08-3.类的构造函数.pptVIP

  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文档。上传文档
查看更多
C标准教程08-3.类的构造函数

1-* 北京源智天下科技有限公司 联系方式: 联系方式: 北京源智天下科技有限公司 类的构造函数 默认构造函数 限制对象创建 拷贝构造函数 深拷贝和浅拷贝 构造函数调用顺序 默认构造函数 如果类中没有写构造函数,编译器会自动生成一个默认形式的构造函数,这个默认的构造函数没有参数,也不做任何事情。如果类中显式声明了构造函数,无论是否有参数,编译器都不会再为之生成任何形式的构造函数。 默认构造函数是指不需要用户指定实参就能够被调用的构造函数,这并不意味着它不能接受实参,表示构造函数的每个参数都有一个默认值与之关联。 实例中没有定义与类Clock同名的成员函数(构造函数),此时编译系统就会在编译时自动生成一个默认形式的构造函数,这个构造函数的功能是不做任何事。编译器为什么会生成一个不做任何事的函数呢?这是因为在创建对象时自动调用构造函数是C++程序的必然行为,是一个一般性的行为。对于这种方式构造出来的对象,类成员变量是没有被初始化的,是程序运行栈中该内存上一次被使用的结果,它们是不可预知的。 如果想要初始化内置或复合型的数据成员,则必须在一个或一组构造函数中显式地完成。 限制对象创建 构造函数的可访问性由其声明所在的访问区来决定。可以通过把相关的构造函数放到非公有访问区内,从而限制或显式禁止某些形式的对象创建动作。在实际编程中这样的应用很常见。 说明:一般构造函数不是私有成员或保护成员,但构造函数可以是私有成员函数,在一些特殊的场合会把构造函数定义为私有成员或者保护成员。 C++类的构造函数一般不应该是私有函数,因为私有函数不能被其他类或全局函数使用。创建C++实例需要调用构造函数,所以如果构造函数是私有函数,除了类自己的方法之外,其他类不能构造这个类的实例。一般来说,类编写出来就是让其他类使用的,而使用一个类必须先构造它的实例,所以一般情况下,构造函数如果是私有函数,其他类要使用它就很困难了。 但是在一些特殊场合,如不希望其他对象能够实例化一个类,这种情况下会把构造函数定义为私有的或者保护的。最常见的是单件,就是一个类只能有一个实例,为了避免其他外部类创建多个实例,把构造函数定义为私有的。 拷贝构造函数 相信很多读者都使用过复印机,当需要一个文件的副本时,只需要抓取白纸,通过复印机就能复制出与原件一模一样的复制品。配钥匙的情况也是类似的,通过精确的机器加工,制作出与原件一模一样的钥匙。可以说,在生活和工作中制作复制品的例子是数不胜数的。面向对象的程序设计就是要能够如实反映客观世界中各种问题的本来面目。因此,对象的复制便是C++程序必不可少的能力。 生成一个对象的副本有两种途径。第一种途径是创建一个新对象,然后将一个已有对象的数据成员值取出来,一一赋给新对象。这样的方式虽然可行,但是难免出现代码冗余。可以使用更方便的办法来使类具有自行复制本类对象的能力,这就是拷贝构造函数的功能。 说明:拷贝构造函数是一种特殊的构造函数,具有一般构造函数的所有特性,其形参是本类的对象的引用。其作用是使用一个已经存在的对象,去初始化同类的另一个新对象。 程序员可以根据实际问题的需要定义特定的拷贝构造函数,以实现同类对象之间数据成员的传递。如果程序员没有定义类的拷贝构造函数,系统就会在必要时自动生成一个默认的拷贝构造函数,这个默认的拷贝构造函数的功能是把初始值对象的每一个数据成员的值都复制到新建的对象中。因此,也可以说是完成了同类对象的克隆,这样得到的对象和原对象具有完全相同的数据成员,即完全相同的属性。 拷贝构造函数由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其惟一的参数(对象的引用)是不可变的(const类型)。拷贝构造函数要调用基类的拷贝构造函数和成员函数。 普通构造函数在对象创建时被调用,而拷贝构造函数在以下3种情况下都会被调用。 (1)当用类的一个对象去初始化该类的另一个对象时。 (2)如果函数的形参是类的对象,调用函数时,进行形参和实参复制时。 (3)如果函数的返回值是类的对象,函数执行完成返回调用者时。 深拷贝和浅拷贝 假如在类中没有显式地声明一个拷贝构造函数,那么编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝,也称为浅拷贝。自定义拷贝构造函数是一种良好的编程风格,能够阻止编译器形成默认的拷贝构造函数,提高源码效率。 在某些状况下,类内成员变量需要动态开辟堆内存,假如实行位拷贝(浅拷贝),也就是把对象里的值完全复制给另一个对象,如A=B。此时,假如B中有一个成员变量指针已申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题,当B的内存释放(如析构),此时A内的指针就是野指针了,当A也试图去释放该指针时,就出现了运行错误。 深拷贝和浅拷贝可以简单理解为:假如一个类拥有资源,当这个

文档评论(0)

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

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

1亿VIP精品文档

相关文档