C程序设计教程9_第1页
C程序设计教程9_第2页
C程序设计教程9_第3页
C程序设计教程9_第4页
C程序设计教程9_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+程序设计教程(第二版)第九章 对象生灭 Chapter 9 Object Birth & Death 18:17:591第九章内容构造函数设计 ( Constructor Design ) 构造函数重载 ( Constructor Overload ) 类成员初始化 ( Class Member Initializations ) 构造顺序 ( Constructing Order )拷贝构造函数 ( Copy Constructors ) 析构函数 ( Destructors ) 转型与赋值 ( Conversion & Assignment ) 18:17:5921. 构造函数设计 (

2、 Constructor Design ) 初始化要求:对象与变量的不同在于对象对应于事物,要求从诞生之时起便有明确的意义.封装性要求:初始化不是简单的参数与成员对应,而是联系参数到成员的过程.构造函数名:该过程产生对象,而不是捆绑对象的成员函数调用,因而它是特殊的成员函数形式:与变量的定义形式保持一致.构造函数原则上不能失败,也没有返回形式例外:一次性对象构造,没有对象名,与强制转换的形式一致,因而它是一个特定类型的对象.18:17:5932. 构造函数重载 ( Constructor Overload ) 构造函数可以重载,也可以参数默认:class Datepublic: Date(co

3、nst string& s); Date(int y=2003, int m=12, int d=1); / .;int main() Date d(“2006-12-26”); Date e(2000, 12, 25); Date f(2001, 10); Date g(2002); Date h(); / .18:17:594若类中没有定义构造函数,则系统会默认定义一个无参空函数:class Datepublic: / 相当于定义了Date();int main() Date d; / ok / .18:17:595任何其他的构造函数定义,都将阻止默认无参空函数的产生:class Date

4、public: Date(int y, int m, int d) / .;int main() Date d; / error / .18:17:5963. 类成员初始化 ( Class Member Initializations ) class StudentID int a;public: StudentID() a = 1; cout“StudentId: an; ;class Student string name; StudentID id;public: Student(string n=noName) cout“Student: + n +n; name = n; ;int

5、main() Student s(Randy);数据成员的空间分配是在构造函数被调用和其过程被执行之间的刹那间完成,在类中有对象成员时,那个刹那间便是调用对象所在类的构造函数,以创建对象空间的时机,左边的程序得到下列运行结果:StudentId: 1Student: Randy说明先成员构造,后自身构造成员构造不见显式调用,而是悄悄调用无参构造函数18:17:597class StudentID int a;public: StudentID(int id=0) a=id; cout“StudentId: a“n”; ;class Student string name; StudentID

6、id;public: Student(string n=noName, int ssID=0) :id(ssID),name(n) cout“Student: nDate e 对象创建的运行顺序为: Date e18:17:599同一工程不同代码文件全局对象的创建没有明确顺序规定对策:不要让不同文件的全局对象互为依赖因为依赖具有先后性,而其全局对象的创建不能保证该依赖性发挥作用全局对象在main函数启动之前生成,而调试则在main函数启动之后对策:调试时,应先将全局对象作为局部对象来运行观察或者,在构造函数中添加输出语句来观察运行过程18:17:5910成员对象的构造顺序按类定义的出现顺序,最

7、后执行自身构造函数: class A B b; C c; D d; public: A() / . ; int main() A a; 则构造顺序为bcd,然后执行A的构造函数的花括号体18:17:5911全局数据区:全局对象,静态全局对象,静态局部对象,常对象类的静态数据成员也存放在该数据区栈区:局部对象(根据不同编译器的实现方法,临时对象可能在栈区,也可能在动态存储区,也可能一部分在栈区,一部分在动态存储区)动态存储区(也称堆区):用new申请的对象除此之外,还可以指定特殊地址空间,存放对象构造位置18:17:59125. 拷贝构造函数 ( Copy Constructors ) 对象本体

8、与对象实体:对象本体也是对象主体,对象实体则还包括属于对象的衍生物,如,某个人体是人类对象的主体,然而某人还拥有父母,房产等属于某人的世系或资产,描述人的属性不仅仅只是人体数据从形式上看,对象除了包括数据成员,还包括指向数据的指针18:17:5913拷贝构造函数:以本类对象为常量引用参数的构造函数:class Datepublic: Date(); Date(const Date& d); / . . .;Date x; /调用无参构造函数Date y(x); /调用拷贝构造函数18:17:5914默认拷贝构造函数:若类中没有定义拷贝构造函数,则系统会悄悄定义一个默认空拷贝构造函数: Date

9、(const Date& d)默认拷贝构造函数体一定是空的空拷贝构造函数负责将传递的对象到新创的对象做对象本体的位对位拷贝(甚至连指针值都相等,即与参数对象拥有共同的资源)拷贝构造函数体的工作不负责位对位对象复制,一般来说,它负责资源分配和由此而来的指针修改18:17:5915拷贝构造函数体的工作不负责位对位对象复制,一般来说,它负责资源分配和由此而来的指针修改class Person char* pName;public: Person(char* pN=noName) pName = new charstrlen(pN)+1; if(pName) strcpy(pName,pN); Per

10、son(const Person& s) pName = new charstrlen(s.pName)+1; if(pName) strcpy(pName, s.pName); Person() delete pName; ;18:17:59166. 析构函数 ( Destructors )对象结束其生命时,会被系统悄悄地销毁(析构).即对象本体空间与名字脱离关系.对象结束生命时,若对象本体与对象实体不同,则需要人为地进行资源释放,以保证对象本体失效之前,资源被收回18:17:5917定义析构函数的目的:由于对象本体与实体不同,所以要进行对象占有资源的释放工作一般来说,一个类,若有人为定义的

11、拷贝构造函数,则也应该定义析构函数因为对象创建中有资源要获得分配,则对象失效前必应先释放资源18:17:59187. 转型与赋值 ( Conversion & Assignment ) 对象转型一个构造函数,含有一个其他数据类型的参数,显然其意义为,用该参数类型的值可以创建本对象.从另一方面看,参数类型的值可以转换为本对象. class Student public: Student(const string& n); / . ; void fn(Student& s); int main() string t=“jenny”; fn(t); / 参数为string,却能匹配Student类型

12、 18:17:5919对象转型的规则:只会尝试含有一个参数的构造函数如果有二义性,则会放弃尝试推导是一次性的,不允许多步推导 fn(“Jenny”)不能匹配 void fn(const Student& s); 因为:”Jenny” - string - Student 经历了两步.18:17:5920对象赋值即对象拷贝:两个已经存在的对象之间的复制Person d, g;d = g; / 对象赋值对象赋值便是使用类中的赋值操作符如果类中没有定义赋值操作符,则系统悄悄地定义一个默认的赋值操作符: Person& operator=(const Person& p) memcpy(*this, *p, sizeof(p); 18:17:5921当对象本体与对象实体不同时,则对象赋值操作符与拷贝构造函数一样,必须自定义:class Person char* pName;public: Person(char* pN=noName); Person(const Person& s); Person& operator=(const Person& s) if(this=&s)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论