第03章类和对象C++课件.ppt

  1. 1、本文档共58页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第03章类和对象C课件

4. 拷贝构造函数(复制构造函数) (1)拷贝构造函数 拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同类对象,是一种特殊的构造函数,具有一般构造函数的所有特性,当创建一个新对象时系统自动调用它;其形参是本类对象的引用,它的特殊功能是将参数代表的对象逐域拷贝到新创建的对象中 用户可以根据自己实际问题的需要定义特定的拷贝构造函数,以实现同类对象之间数据成员的传递。如果用户没有声明类的拷贝构造函数,系统就会自动生成一个缺省拷贝构造函数,这个缺省拷贝构造函数的功能是把初始对象的每个数据成员的值都复制到新建立的对象中。拷贝构造函数的声明形式为: 类名(类名 ); 或 类名(类名 对象名); 下面定义了一个cat类和cat类的拷贝构造函数: class cat { private: int age; float weight; char *color; public: cat(); cat(cat ); //拷贝构造函数的声明 void play(); void hunt(); }; cat::cat(cat other) { age = other.age; weight = other.weight; color = other.color; } ① 用类的一个对象去初始化另一个对象 第一种形式: cat cat1; cat cat2(cat1); //创建cat2时系统自动调用拷贝构造函数,用cat1初始化cat2 第二种形式: cat cat2=cat1; //注意并非cat cat1,cat2; cat2=cat1; ② 对象作为函数参数传递时,调用拷贝构造函数 f(cat a){ } //定义f函数,形参为cat类对象 cat b; //定义对象b f(b); //进行f函数调用时,系统自动调用拷贝构造函数 自动调用拷贝构造函数的三种情况 ③如果函数的返回值是类的对象,函数调用返回时,调用拷贝构造函数 cat f() //定义f函数,函数的返回值为cat类的对象 { cat a; … … return a; } cat b; //定义对象b b=f(); //调用f函数,系统自动调用拷贝构造函数 自动调用拷贝构造函数的四种情况 (2)浅拷贝构造函数和深拷贝构造函数 图3.1 浅拷贝的两种情况 拷贝构造函数分为两种:浅拷贝构造函数和深拷贝构造函数。由C++提供的默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。如图3.1所示为浅拷贝的两种情况 (2)浅拷贝构造函数和深拷贝构造函数 一般情况下,只需使用系统提供的浅拷贝构造函数即可。但是如果对象的数据成员包括指向堆内存的指针,就不能使用这种拷贝方式,因为两个对象都拥有同一个资源;对象析构时,该资源将经历两次资源返还。此时必须自定义深拷贝构造函数,为创建的对象分配堆空间,否则会出现动态分配的指针变量悬空的情况。深拷贝构造函数需要同时复制对象空间和资源,如图3.2所示 图3.2 深拷贝构造函数 【例3.12】深拷贝构造函数 5. 数据成员的初始化 构造函数可以采用以下几种不同的形式对数据成员初始化: (1)在构造函数的函数体中进行初始化 (2)使用构造初始化表对数据成员进行初始化,格式为: 类名::构造函数(参数表): 变量1(初值1),…,变量n(初值n){…} 如: Circle::Circle(float r):radius(r){…} 成员初始化的次序取决于它们在类定义中的声明次序,与它们在构造初始化表中的次序无关。常量和引用的初始化必须放在构造函数正在建立数据成员结构的时候,也就是放在构造函数的冒号后面,如例3.13所示 (3)混合初始化,如: Student::Student(int n, int a, char* pname) :number(n), age(a) { strcpy(name, pname); } (4)使用拷贝构造函数进行初始化(如上所述) 6. 类类型和基本数据类型的转换 (1)构造函数用于类型转换 将构造函数用于类型转换,可以实现基本数据类型转换为类类型。利用构造函数进行类型转换,必须有一个前提,那就是此类一定要有一个只带一个参数的构造函数,这样才可以实现从参数类型向该类类型的转换,并且这种转换是隐式的。如:

文档评论(0)

文档精品 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:6203200221000001

1亿VIP精品文档

相关文档