ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:40.63KB ,
资源ID:21247780      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21247780.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Chap3 类和对象800Word文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Chap3 类和对象800Word文档格式.docx

1、 int Set_Content(char * ); /设置字符串 int Get_Length( ); /取字符串长度 char *Get_Content( ); /取字符串内容 ;4巩固练习1(类声明)3.2 成员函数的定义(Member Function)1两种定义方式:1 在类体中声明,而在类外定义。声明时,可以只指出函数所带参数的类型;在类外定义时,必须在函数名前缀上类名,以标明此函数所属的类。如,上例中的String类中的三个成员函数可定义如下:/string_1.cpp/功能:设置私有变量contents的值,同时计算其长度int String:Set_Content(char

2、*conts) int i=0; contents=conts; /将字符串赋给私有变量contents while( *conts+ != 0 ) i+; /求字符串长度 length=i; /将长度赋给私有变量length return 1;获取字符串的长度Get_Length( ) return length; /返回私有变量length获取字符串的值char * String:Get_Content( ) return contents; /返回私有变量contents注意: 在所定义的成员函数名之前应缀上“类名:”,如“String:” 函数的返回类型一定要与函数声明时的类型相匹配2

3、 在类体内定义。对于一些简单的成员函数,可以在类体中定义。 在类体内定义的成员函数被当作内联函数处理2内联函数的两种定义方式1 隐式定义 类体内定义/point.h int x, y; void SetPoint(int vx, int vy) int GetX() return x; int GetY() return y;/string_1.h int Get_Length( ) return length; char *Get_Content( ) return content;2 显式定义 类体外定义,函数最前面冠以关键字“inline”/point.cppinline void Po

4、int:SetPoint(int vx, int vy) x=vx; y=vy;【小结】所有成员函数都必须在类体内用函数原型加以声明,而其定义可在体外定义,也可在体内定义。在体外定义时,成员函数名前应缀上“类名:成员函数与普通函数一样,可设置缺省参数。3.3 类与对象1类与对象的关系 整型int和整型变量i之间的关系 类在概念上是一种抽象机制,它抽象了具有相同特征的一类对象的存储特性和操作特性;在系统实现中,类是一种共享机制,它提供了本类对象共享的操作实现。 对象和实例表达的是一个意思:对象的创建过程就是类实例化的过程 创建对象的两种方法在定义类的同时创建对象 全局对象(弊端:) /date.

5、h class Date int month, day, year; void Set(int, int, int); void Print( ); int GetYear( ); int GetMonth( ); int GetDay( ); tt; /同时创建对象tt在使用时定义对象 定义格式与一般变量的定义相同如,Date tt; /定义了tt是Date类的一个对象2类的使用 创建一个此类的对象,然后通过此对象访问类的公有成员函数,以便操作此对象的数据成员。 class Point void SetPoint(int vx, int vy) x=vx;/test.cpp #include

6、 “iostream.h” void main( ) Point pt; /创建Point类的对象pt pt.SetPoint(10, 10); /给Point类对象pt的私有成员赋值 cout”x=”pt.GetX(); /输出pt的坐标”,y=”操作符。如: Point pt, *pt1=&pt; pt1-SetPoint(10, 10);pt1-GetX();GetY();3名字解析 在调用成员函数时,通常使用缩写的形式,如pt.SetPoint(10,10) pt.Point:SetPoint(10,10);因此,可以在不同的类中定义名字相同的成员而不会产生二义性。(函数重载?如,/r

7、eal_int_set.hclass RealSet /定义一个实数集合类 int card; float elems16; void Print( ) / class IntSet /定义一个整数集合类 int elems16; /test.cppvoid main( ) IntSet is; RealSet rs; /. is.Print( ); /调用的是InSet类中的Print( ) rs.Print( ); /调用的是RealSet类中的Print( )4巩固练习2(成员的调用)3.4 构造函数与析构函数 目的:构造函数 初始化对象 析构函数 删除对象 3.4.1 基本用法 函数名

8、与类名相同,且没有返回类型。class String char *contents; int length; String( ); /声明构造函数,其名必须与类名相同,无类型说明String( ); /声明析构函数,在函数名前冠以“”符号 void Set_Content(char *); int Get_Length( ) return length; char *Get_Content( ) return content;/构造函数的定义String:String( ) contents=0; /对其私有变量赋初值 length=0;/析构函数的定义String( ) /设置私有变量con

9、tents的值,同时计算其长度在构造函数中一般只对数据成员做初始化工作,而不做赋初值以外的事情。构造函数不可显式地调用,当创建一个对象时,系统自动地调用。在对象超出作用域范围之前,系统自动调用析构函数,释放对象的成员所占的空间。 /对私有变量赋初值 cout”String Initializedn”; /在屏幕上输出对象已初始化的信息String()”String object”contentsendl; String str1, str2; /定义String的两个对象str1和str2 str1.Set_Content(“Hello”); /给两个对象的字串赋值 str2.Set_Cont

10、ent(“Welcome”);/在屏幕上输出两个对象的字串值 cout”nstr1=”str1.Get_Content( );”nstr2=”str2.Get_Content( );显示结果:String Initialized String Initializedstr1=Hellostr2=WelcomeString object WelcomeString object Hello 创建一个对象时,系统先为对象分配内存,然后调用构造函数初始化此对象的各数据成员(即:设置对象的初始状态) 释放一个对象时,系统先调析构函数,然后回收对象所占的内存。如delete str1; /str1.St

11、ring() 回收内存析构对象的顺序与构造的顺序相反。 若类中没有显式定义构造函数,在创建对象时,系统只分配内存,而不执行初始化工作,对象的各个数据将是随机值。此时若对对象的数据进行操作,将导致结果错误!(缺省的构造函数) 若类中没有显式定义析构函数,系统会生成一个缺省的析构函数;但缺省的析构函数只回收对象所占有的空间,并不回收通过构造函数动态分配的内存(内存泄漏!)(后讲!一个类有且只有一个析构函数。3.5 动态存储(new与delete)new malloc(sizeof( ); delete free( );1优越性: new自动计算要分配的空间(根据数据类型)自动返回正确的指针类型,不

12、必对返回指针进行类型转换可以用new将分配的对象初始化2new和delete的语法 基本形式:名字指针new DataType(初始化值);delete 名字指针; /被释放的存储空间的首址动态创建和释放一个对象 int *pi=new int(3); /* int *pi=(int *)malloc(sizeof(int);*pi=3;*/ delete pi; / free(pi);创建和释放一组对象(数组) int *pi=new int10; delete pi; /释放整个数组所占用的空间创建和释放结构体对象3实例 (14)4使用注意: delete前,必须判断指针是否为空,即if(

13、p= =NULL) or if(!p) 以免同一空间进行多次撤消工作,导致非法操作! new和delete一般配对使用,即:用new分配的存储,最好用delete释放 动态分配的存储,必须显式删除(delete/free),系统不会自动回收,否则造成内存泄漏!3.4.2 构造函数的类型1带参数的构造函数在定义对象时,根据对象的初始状态不同,传递不同的状态参数给构造函数,从而实现不同对象的初始化状态不同。如, /test.cpp Point(int vx, int vy); /声明带参数的构造函数 void offset(int ax, int ay); ; Point:Point(int vx

14、, int vy) /用传递进来的参数对私有变量x, y赋初值 void Point:offset(int ax, int ay) x+=ax; /对私有变量增值 x=x+ax; y+=ay; void main( )/定义对象pt1和pt2,并给构造函数传递实参 Point pt1(5,5), pt2(3,3); pt1.offset(10,15); pt2.offset(2,3); /.2缺省参数的构造函数 Point(int vx=0, int vy=0) x=vx;/. Point p1; /不传递参数,全部用缺省值,即x=y=0 Point(10); /只传递一个参数,vy用缺省值,

15、即x=10, y=0 Point(10,20); /传递两个参数,全部用实参,即x=10, y=20 构造函数、一般的成员函数、一般的全局函数,都可以使用缺省参数。3拷贝构造函数功能:用同类的一个已存在的对象去初始化新创建的对象两种形式:系统自动产生 缺省的拷贝构造函数,如 Point p1(10,20); /调用Point(int,int) Point p2=p1; /*用已知对象初始化新对象 Point p2(p1); 调用缺省的拷贝构造函数 */ 实现机制:将p1(已知对象)的每个数据成员的值,按照它们在类中说明的顺序,依次拷贝给新对象p2相应的数据成员,每次只拷贝一个数据,即“位模式拷

16、贝”。“位模式拷贝”产生的隐患:#include #include int length; char *contents; public: String(char * s); /声明构造函数 String( ); / / String:String(char * s) /定义构造函数 if(s) length=strlen(s); contents=new charlength+1; /为字符串分配存储 strcpy(contents, s); /字符串之间赋值elselength=0;contents=0;String( ) /定义析构函数 if(content) delete conten

17、ts; /释放字符串contents所占空间 contents=0; /将指针置空void main()String a(“Hust”); String b=a; /同一存储空间contents被delete两次当类中声明有指针数据成员时,为避免程序隐患,最好自行编写拷贝构造函数。用户定义格式:A:A(const A &) /A为类名注:只有一个参量,且参量是同类对象的引用变量(如A &);多采用只读引用变量(如const A &),以免被引用对象被修改。如 int x, y; Point(int vx, int vy) x=vx; Point(const Point & rp) /定义一个拷

18、贝构造函数 x=rp.x; y=rp.y; String(const String & rs); /定义拷贝构造函数String(const String & rs) /定义拷贝构造函数 length=rs.length; strcpy(contents, rs.content); String a(“Hust”);A b=a;4多构造函数(构造函数的重载)在一个类中同时声明几个构造函数,以适应不同对象初始化目的。class A A( ); /不带参数的构造函数 A(int); /只带一个int参数的 A(int, char); /带两个参数的,一个整数,一个字符 A(float, char)

19、; /带两个参数的,一个浮点数,一个字符 A(const A &); /拷贝构造函数main() A a; A b(1); A c(1,c); A d(3.5,d); A e=a; 注1:多个构造函数之间,在参数的个数或类型上必须有所差别,否则系统调用时就会出现二义性 注2:若在定义多个构造函数时,使用了缺省参数,要防止二义性问题如, class x x( ); x(int i=0); main() x one(10); / x two; /?3.4.3 动态存储类的对象(new与delete)1创建和释放一个对象 Point *pt; /对象指针pt=new Point(10,10);/.d

20、elete pt;实例52创建和释放一组对象(数组) Point *pt=new Point2; /对象数组delete pt; 对数组动态分配存储时,不能同时对数组中的元素进行初始化。若要实现对象数组中元素的初始化,可按下面两种方法:在类中定义不带参数的构造函数或全部带缺省参数的构造函数(实例6)在类中定义一个成员函数专门用来完成初始化功能;对象数组被创建后,通过调用此函数来对数组中的对象元素进行初始化 对象数组的初始化方法同基本类型的数组如,int a 2; a0=1; A a2; a0=A(1); int a3=1,2,3; A a3=A(1),A(1,a),a0; 若创建多维数组,必须

21、提供所有维的大小。int *qi=new int235;int *qi=new int 35; /参看教材【例3.18】3使用注意: 对简单的数据类型,以及没有显示定义构造函数和析构函数的类,两种管理内存的方式可以混合使用,即new分配的内存可用free释放,malloc分配的内存可用delete释放。但若一个类显示定义了构造和析构函数,则最好用new和delete分配和释放内存。 动态分配的存储,必须显式删除(delete/free),否则造成内存泄漏!3.4.4小结构造函数和析构函数是一种特殊的成员函数,其个性:都没有返回类型,即 在定义时不需指出类型构造函数可以有缺省参数,但要注意避免二义性构造函数可重载,但析构函数不可重载(唯一性)构造函数不可显式调用,但析构函数可以当创建(定义)对象时,系统自动调用构造函数;当删除对象时,系统自动地调用析构函数(C+新特点:提供了自动回收和显式回收两种内存管理方式) 都不能被继承析构函数可以是虚的(virtual),但构造函数不行3.4.5巩固练习 练习1 改错(16) 练习2 成员的访问和对象的定义:2 练习3 写出输出结果:1看懂教材第3章所有例子!重点:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1