C++程序设计教程9

上传人:豆浆 文档编号:48990371 上传时间:2018-07-22 格式:PPT 页数:52 大小:238KB
返回 下载 相关 举报
C++程序设计教程9_第1页
第1页 / 共52页
C++程序设计教程9_第2页
第2页 / 共52页
C++程序设计教程9_第3页
第3页 / 共52页
C++程序设计教程9_第4页
第4页 / 共52页
C++程序设计教程9_第5页
第5页 / 共52页
点击查看更多>>
资源描述

《C++程序设计教程9》由会员分享,可在线阅读,更多相关《C++程序设计教程9(52页珍藏版)》请在金锄头文库上搜索。

1、C+程序设计教程(第 二版)第九章 对象生灭 *1第九章内容1. 构造函数设计 2. 构造函数的重载 3. 类成员初始化 4. 构造顺序 5. 拷贝构造函数 6. 析构函数 7.对象转型与赋值Date21. 构造函数设计初始化要求定义一个对象,其形式与定义一个变量相似,但更具意 义。对象与变量的不同在于对象对应于事物,要求从诞生之时 起便有明确的意义.对象必须建立一种初始化机制,以满足在 编程中可以针对实际问题所提出的要求而赋给一个有意义的 初值。创建一个对象,若创建的是全局对象,则以全0的模式表 示对象,若创建局部对象,则以随机值表示对象。Date3对象的初始化不是简单的参数与成员对应,而是

2、联系参数到 成员的过程.封装性要求Struct Pointint x,y;Point d=2,3;class Pointint x,y;/;Point d=2,3;正 确错 误封装性的要求杜绝了这种初始化形式,事实上,这种形式根 本不能完成对象的初始化过程中的校验和计算工作。对象通常是 一个复杂的实体,在构建对象过程中,并不一定是一个初值对应 一个对象分量。许多时候,一个初值只是传递一个信息,告诉对 象的创建工作应怎么进行。封装性要求对象创建中按传递的信息 进行一个过程化的初始化工作。Date4函数形式构造函数(constructor)是与类名同名的特殊的成员函数, 当定义该类的对象时,构造函

3、数将被自动调用以实现对该 对象的初始化。构造函数不能有返回值,因而不能指定包 括void在内的任何返回值类型。构造函数的定义体可与其它 成员函数成员一样,放在类内或类外都可。构造函数的定 义格式为: 类名(形参说明) 函数体 构造函数既可定义成有参函数,也可义成无参函数,要 根据问题的需要来定。全局变量和静态变量在定义时,将 自动赋初值为0;局部变量在定义时,其初始值不固定的。 而当对象被定义时,由于对象的意义表达了现实世界的实 体,所以一旦定义对象,就必须有一个有意义的初始值, 在C+中,在定义对象的同时,给该对象初始化的方法就是 利用构造函数。Date5例:类person包括4个数据成员,

4、用来记录人员信息。生成对象 obj,并使用构造函数为obj赋予初始值。# include # include class Person /定义类 private: /类Person的数据成员char name 10 ;/姓名int age ; /年龄int salary ;/薪金char tel8;/电话 public: /构造函数PersonPerson ( char *xname, int xage,int xsalary, char *xtel ) ;void disp () ; ; /函数Person的定义 Person : Person ( char *xname,int xage,

5、 int xsalary, char *xtel ) strcpy (name, xname) ; /给各数据成员提供初值age = xage ;salary = xsalary ;strcpy (tel, xtel) ; Date6/函数disp的定义 void Person:disp() cout using namespace std; /- class StudentID int value; public:StudentID(int id=0)/有参构造函数value=id;cout “; ;/- class B public:B(int x) cout“; ;/- class CA

6、 a;B b; public:C(int x,int y):b(x),a(y) cout“; A() cout“; B() cout“; C() cout“;static B b;C c; /-int main()cout“main: “;for(int i=1; i=2; +i)for(int j=1; j=2; +j)if(i=2) C c; else A a;B b;func(); func(); /=Date44注:(1)析构函数总是出现在对象的生命期结束之时。静态对象在程 序运行结束时析构。 (2)对于一个简单的类来说,大多可以直接使用系统提供的默 认析构函数。但是,如果在类的对象中

7、分配有动态内存(如: 用new申请分配的内容)时,就必须为该类提供适当的析构函数, 完成清理工作。 (3)对象被析构的顺序与对象建立时的顺序正好相反。对象析 构与构造函数的关系是栈数据结构中的入栈和出栈的关系,即最 后构造的对象先被析构。栈底封闭指针Date457. 对象转型与赋值用于转型的构造函数5/8与5.0/8的结果是不同的,原因是C+执行了两种不同的操 作。编译器会将5.0/8中的整数8自动转换成double,匹配两个 double数的除法操作。这是内部数据类型所具有的转换功能。但是,对于类类型,其自动转换的功能必须编程实现。那就 是定义一个含有一个参数的构造函数。例:class St

8、udentpublic:Student(const string ;void fn(Studentint main()string t=“jenny”;fn(t); / 参数为string,却能匹配Student类型Date46刚才的例子也是在告知,如何将string对象转换成一个 Student对象。如果有重载函数:void fn(string 则main函数中的fn(t)函数调用将会马上匹配。否则,匹 配了void fn(Studentd = g; / 对象赋值 对象赋值便是使用类中的赋值操作符如果类中没有定义赋值操作符,则系统悄悄 地定义一个默认的赋值操作符:PersonDate48当对

9、象本体与对象实体不同时, 则对象赋值操作符与拷贝构造 函数一样,必须自定义:class Personchar* pName; public:Person(char* pN=“noName“);Person(const PersonPersondelete pName;pName = new charstrlen(s.pName)+1;if(pName) strcpy(pName,s.pName);return *this;Person()delete pName; ;定义赋值操作符 :排除客体对象 与本对象同 一的情况 释放本对象的 资源 申请客体对象 相同大小的 资源空间 拷贝客体对象 的资

10、源到本 对象Date498. this指针用类定义对象时,系统会为每一个对象分配存储空间。如果一 个类包括数据和函数,要分别为数据和函数的代码分配存储空间。每个对象所占用的存储空间只是该对象的数据部分所占用的存 储空间,而不包括函数代码所占用的存储空间。例如:Class Point int xVal,yVal; public:point(int x,int y);point(point void showpoint()cout“(“xVal,yVal“)”;Point a,b,c;Date50对象a int xVal Int yVal对象b int xVal Int yVal对象c int x

11、Val Int yVal成员函数:Point(int x,int y);Point (Point void ShowPoint();对象存储示意图对象a、b、c在内存中各占8个字节存储数据成 员,而只用一段空间来存放这个共同的函数代码段 。疑问:当 不同对象 的成员函 数引用数 据成员时 ,怎么能 保证引用 的是所指 定的对象 的数据成员呢?Date51实际上在每一个成员函数中都包含一个特殊的指针,这个指 针的名字是固定的,称为this。它是指向本类对象的指针,它隐含 在类的成员函数中,用来指向成员函数所述类的正在被操作的对 象。例如,当调用成员函数a.ShowPoint()时,编译系统就把对象a的 起始地址付给this指针,于是在成员函数引用数据成员时,就按照 this的指向找到对象a的数据成员,由于当前this指向a,因此相当于 执行cout“(“a.xVal“,”b.xVal“)”;归纳:(1)This指针也是一个指向对象的指针。(2)This指针是C+语言实现封装的一种机制,它将数据成员和成员 函数连接在一起,当一个成员函数对数据成员进行操作时,用this 指针来表示数据成员所在的对象。(3)当程序操作不同对象的成员函数时,this指针也指向不同的对象(4)静态成员函数没有this指针。Date52

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号