面向对象程序设计第6章类与对象.ppt

上传人:wuy****n92 文档编号:92007476 上传时间:2023-05-30 格式:PPT 页数:72 大小:284.66KB
返回 下载 相关 举报
面向对象程序设计第6章类与对象.ppt_第1页
第1页 / 共72页
面向对象程序设计第6章类与对象.ppt_第2页
第2页 / 共72页
点击查看更多>>
资源描述

《面向对象程序设计第6章类与对象.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计第6章类与对象.ppt(72页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、面向对象程序设计面向对象程序设计(C+C+)第第6 6章章 类与对象类与对象6.1 类的定义类的定义n类构成了实现类构成了实现C+面向对象程序设计的基础,面向对象程序设计的基础,在在C+语言面向对象程序设计中占据着核心语言面向对象程序设计中占据着核心地位。它把数据和作用在这些数据上的操地位。它把数据和作用在这些数据上的操作组合在一起,是封装的基本单元。对象作组合在一起,是封装的基本单元。对象是类的实例,类定义了属于该类的所有对是类的实例,类定义了属于该类的所有对象的共同特性。象的共同特性。n一个类是对一种概念的描述,或者说是对某一类一个类是对一种概念的描述,或者说是对某一类具体事物的抽象具体事

2、物的抽象。nC语言中对语言中对“点点”的描述的描述:struct Point double x;double y;n上述描述说明了点由两个坐标组成这样的概念。上述描述说明了点由两个坐标组成这样的概念。不过,它没有说明所描述概念的操作特性。不过,它没有说明所描述概念的操作特性。6.1.1 类的含义与表述类的含义与表述nC+丰富了丰富了C语言的结构并称之为类,使其能够描述出完整语言的结构并称之为类,使其能够描述出完整的概念。例如:的概念。例如:struct Point double x;double y;void display()cout x ,”操作符。操作符。#include using n

3、amespace std;class Date public:int year,month,day;void print()coutyear-month-d.yeard.monthd.day;/输入数据 d.print();/显示日期 cout the dates year/判断是否闰年 (d.isLeapYear()?is:is not)a leap year.;例:下面的程序从键盘输入一个日期并判断其年份是否例:下面的程序从键盘输入一个日期并判断其年份是否为闰年。为闰年。6.2.3 对象存储对象存储n在生成对象时,每个对象都占用包括所有数据成在生成对象时,每个对象都占用包括所有数据成员在内

4、的存储空间(静态属性除外,参见员在内的存储空间(静态属性除外,参见8.1),),即每个对象保存着一份所有数据成员的即每个对象保存着一份所有数据成员的“拷贝拷贝”,但所有对象的成员函数只有一份公用的拷贝,但所有对象的成员函数只有一份公用的拷贝,单独存储。因此,一个对象占用的存储空间是所单独存储。因此,一个对象占用的存储空间是所有数据成员占用的存储空间之和,不包括成员函有数据成员占用的存储空间之和,不包括成员函数。数。cout sizeof(Date),sizeof(d);/d是上述代码中的是上述代码中的Date型变量型变量n上述语句的输出结果为上述语句的输出结果为“12,12”,对应于,对应于3

5、个个int类型数据成员的存储空间之和(有时会因内部调类型数据成员的存储空间之和(有时会因内部调整而多占用一些空间)。整而多占用一些空间)。6.3 类的方法类的方法n通常,类定义中需要提供相当数量的方法,通常,类定义中需要提供相当数量的方法,可以分为两类:可以分为两类:其一是处理属性的方法其一是处理属性的方法其二是反映对象行为的方法其二是反映对象行为的方法 6.3.1 为类提供必要的方法为类提供必要的方法n首先,由于类对成员的隐藏特点,使得类外常常首先,由于类对成员的隐藏特点,使得类外常常不能直接访问对象的属性。不能直接访问对象的属性。n如果希望外界能够得到或修改一个属性,需要提如果希望外界能够

6、得到或修改一个属性,需要提供相应的公开方法。因此,每个与外界发生联系供相应的公开方法。因此,每个与外界发生联系的属性常常伴随着两个公开的方法。的属性常常伴随着两个公开的方法。n其次,提供允许外界其次,提供允许外界“调用调用”的公开方法,使对的公开方法,使对象产生应有的行为,如象产生应有的行为,如displaydisplay和和movemove。此外,还此外,还可能需要定义一些类内使用的可能需要定义一些类内使用的privateprivate方法以及为方法以及为其派生类准备的其派生类准备的protectedprotected方法。方法。class Point int x,y;public:int

7、getx()return x;/与属性相关的方法与属性相关的方法 int gety()return y;int setx(int x1)x=x1;int sety(int y1)y=y1;void display()cout x,成员成员 的方式的方式,只,只不过在类内,若是直接访问成员的方不过在类内,若是直接访问成员的方 式式,实际就是实际就是 this-成员成员 的方式。的方式。n访问成员函数的形式为:访问成员函数的形式为:对象对象.成员函数();成员函数();n或或 指向对象的指针指向对象的指针成员函数();成员函数();n实际上,还需要另一个参数,作为实际上,还需要另一个参数,作为th

8、is的实参,格的实参,格式为:式为:对象对象.成员函数成员函数(&对象,参数表);对象,参数表);n或或 指向对象的指针指向对象的指针成员函数(成员函数(指向对象的指针,指向对象的指针,参数表);参数表);n总之,成员函数通过总之,成员函数通过this指针,指针,“知道知道”访问的数访问的数据是哪个对象的。据是哪个对象的。n例例 class INTEGER int anint;public:void set_int(int intnum)anint=intnum;int get_int()return anint;void main()INTEGER Anint,*Pint;Pint=&Ani

9、nt;Anint.set_int(120);coutget_int();n实际上,系统将上述程序改造为:实际上,系统将上述程序改造为:class INTEGER int anint;public:void set_int(INTEGER*const this,int intnum)this-anint=intnum;int get_int(INTEGER*const this)return this-anint;void main()INTEGER Anint,*Pint;Pint=&Anint;Anint.set_int(&Anint,120);coutget_int(Pint);nthis

10、指针是一个常指针,还可以使用指针是一个常指针,还可以使用const说说明符将明符将this声明为指向常量的常指针。声明为指向常量的常指针。nconst成员函数中成员函数中this的类型是:的类型是:const X*const thisnconst成员函数的特点是它不能修改成员函数的特点是它不能修改this所指所指的对象成员。的对象成员。class INTEGER int anint;public:int crease()return+anint;int decrease()const return-anint;/错误 ;例例n在类在类INTEDER中,成员函数中,成员函数decrease()的

11、原型后跟的原型后跟一个一个const,它说明此时该函数的它说明此时该函数的this的类型是:的类型是:const INTEGER*const thisn由于由于const成员函数不能修改成员函数不能修改this所指的对象的成员,所指的对象的成员,因此在因此在decrease()函数体中的语句函数体中的语句 anint 试试图改变图改变this指向的对象的成员指向的对象的成员anint,这是不允许的。但在这是不允许的。但在crease()中,修改中,修改anint是完全许可的。是完全许可的。nthis指针主要用在运算苻重载、自引用等场合。指针主要用在运算苻重载、自引用等场合。6.3.6 类的模板

12、函数方法类的模板函数方法n类方法也可以是一个函数模板。例如:类方法也可以是一个函数模板。例如:class X public:template void print(T x)coutx;n这与普通模板函数的使用没有什么不同,只要在这与普通模板函数的使用没有什么不同,只要在调用方法时指定数据类型作为模板类型参数调用方法时指定数据类型作为模板类型参数T的实的实参数值即可,如:参数值即可,如:X a;a.print(10);a.print才是一个真正的方法名。才是一个真正的方法名。6.4 构造函数与构造函数与对象初始化象初始化 n通常,一个对象在生成时应该被初始化,通常,一个对象在生成时应该被初始化,

13、它的属性不应是它的属性不应是0或随机值。或随机值。n尝试下面的两种初始化方式:尝试下面的两种初始化方式:1 Date d=2007,1,2;2 Date d;d.setDate(2007,1,2);6.4.1 构造函数构造函数n解决对象初始化问题的方法是为类定义一解决对象初始化问题的方法是为类定义一种特殊的方法:构造函数,语法形式为:种特殊的方法:构造函数,语法形式为:类名类名(参数列表参数列表);例如:例如:class Date int year,month,day;public:Date(int y=2007,int m=1,int d=30)year=y;month=m;day=d;.;

14、n1.构造函数的特殊性构造函数的特殊性语法上,构造函数名与类名语法上,构造函数名与类名必须必须相同,且不能相同,且不能有返回类型(也意味着有返回类型(也意味着无返回值无返回值),除此之),除此之外与普通方法相同,如可以有参数列表、可以外与普通方法相同,如可以有参数列表、可以重载和设置参数的缺省值等。重载和设置参数的缺省值等。构造函数在生成对象时由系统构造函数在生成对象时由系统自动调用自动调用。构造函数必须是构造函数必须是公有公有的,否则系统也无法在构的,否则系统也无法在构造对象时调用它。造对象时调用它。n2.缺省的构造函数缺省的构造函数 在在C+中,每个类必须有构造函数,否则不能中,每个类必须

15、有构造函数,否则不能生成类对象。生成类对象。n如果用户没有定义,则系统自动生成一个构造函数,如果用户没有定义,则系统自动生成一个构造函数,称为缺省构造函数称为缺省构造函数。n缺省构造函数没有任何参数,形式为:缺省构造函数没有任何参数,形式为:类名类名();n需要特别注意的是,只要用户自己定义了一个构造需要特别注意的是,只要用户自己定义了一个构造函数,无论有无参数,系统将不再提供缺省构造函函数,无论有无参数,系统将不再提供缺省构造函数。数。n3.构造函数的重载与对象定义构造函数的重载与对象定义 创建一个对象意味着一次构造函数调用,因此,对象创建一个对象意味着一次构造函数调用,因此,对象后面的实参

16、数列表必须与某一个构造函数的形参列表后面的实参数列表必须与某一个构造函数的形参列表相对应,使得系统能找到对应的构造函数并调用它,相对应,使得系统能找到对应的构造函数并调用它,否则将产生找不到适当匹配的错误。否则将产生找不到适当匹配的错误。见例见例P101特殊情况说明:特殊情况说明:构造函数只有一个参数,则下面两个对象定义语句的构造函数只有一个参数,则下面两个对象定义语句的作用相同作用相同nStudent s2(Tom);nStudent s2=“Tom”;/初始化而非赋值初始化而非赋值无参构造函数定义对象时不能带有括号无参构造函数定义对象时不能带有括号n Student s1();n4.单参数

17、构造函数的类型转换作用单参数构造函数的类型转换作用 n一个类的单参数构造函数为由类类型到其一个类的单参数构造函数为由类类型到其它类型的转换提供了依据。它类型的转换提供了依据。void print(Student s)cout s.getname();int main()print(Tom);/调用Student(const char*)cout(static_cast(J).getname();/调用Student(char)注意注意:只有包含一个参数的构造函数具有类型转换的功能,:只有包含一个参数的构造函数具有类型转换的功能,且在有二义性时会产生错误。且在有二义性时会产生错误。6.4.2 用

18、构造函数生成对象用构造函数生成对象n除了直接定义一个对象会导致系统调用构除了直接定义一个对象会导致系统调用构造函数外,还存在着其它一些需要调用构造函数外,还存在着其它一些需要调用构造函数的情况。造函数的情况。n1.无名对象无名对象 n可以用直接指定一个构造函数的形式来定义无名可以用直接指定一个构造函数的形式来定义无名对象,如:对象,如:Student(Tom);Student();n无名对象主要有如下二种作用:无名对象主要有如下二种作用:作函数参数作函数参数void fn(string s);fn(string(Mary);初始化对象初始化对象nstring s=string(Mary);ns

19、tring s=Mary;nstring s(Mary);系统将根据无名对象的参数值直接调用构造函系统将根据无名对象的参数值直接调用构造函数构造对象数构造对象s,而不是先构造临时对象再拷贝而不是先构造临时对象再拷贝给给s。n2.临时对象临时对象 n在一些特殊情况下,系统可能生成临时对在一些特殊情况下,系统可能生成临时对象。例如,有如下函数原型:象。例如,有如下函数原型:Student getStudent(.).return s;若以下述方式调用函数:若以下述方式调用函数:Student sx=getStudent();系统在函数返回时要创建临时对象保存系统在函数返回时要创建临时对象保存get

20、Student的返回的返回值,再用临时对象拷贝构造值,再用临时对象拷贝构造sx。在没有为类提供适当的拷贝在没有为类提供适当的拷贝构造函数时应注意这些问题。构造函数时应注意这些问题。n3.对象数组对象数组定义对象数组时,系统为每个数组元素对象调定义对象数组时,系统为每个数组元素对象调用一次用一次无参无参构造函数以构造这些元素。构造函数以构造这些元素。Student ss4;n以不同的构造方式初始化对象数组以不同的构造方式初始化对象数组 利用临时对象利用临时对象Student ss4=Student(),Student(hello),Student(J);在在提提供供了了单单参参数数的的构构造造函

21、函数数时时,也也可可以以依依赖赖构构造函数的类型转换作用实现数组初始化,如:造函数的类型转换作用实现数组初始化,如:Student sx6=C+,Basic,C;Student sx6=Student(C+),Student(Basic),Student(C);传统的结构方式传统的结构方式如如果果类类没没有有任任何何构构造造函函数数,C+仍仍允允许许用用C语语言言的的结结构构方方式为数组赋初值,如:式为数组赋初值,如:class Point int x,y;public:void print()cout x ,y;Point ps10=10,20,23,45;定义单个对象时不能以这种初始化方式

22、。定义单个对象时不能以这种初始化方式。先定义一个指针数组,再利用循环动态生成对象的方式先定义一个指针数组,再利用循环动态生成对象的方式构建。构建。n4.动态生成对象动态生成对象 使用使用new运算符生成动态对象时,导致一次构运算符生成动态对象时,导致一次构造函数调用。造函数调用。Student*sp1=new Student;/注意后面不能有圆括号注意后面不能有圆括号Student*sp2=new Student(Jacson);与普通类对象定义相同,不同的实参数列表使与普通类对象定义相同,不同的实参数列表使系统调用不同的构造函数。系统调用不同的构造函数。class X public:X(in

23、t x,double y)coutconstructor:x,y;X(char*s)cout constructor:s;X*p1=new X(1,2.5);X*p2=new X(string);6.4.3 成员初始化列表与特殊成员的初始化成员初始化列表与特殊成员的初始化n1.对象成员的缺省构造对象成员的缺省构造 如果一个类含有其它类的对象为成员,在生成如果一个类含有其它类的对象为成员,在生成类对象时,系统会调用成员对象类的无参构造类对象时,系统会调用成员对象类的无参构造函数来构造成员对象。函数来构造成员对象。class Group Student s1,s2,s3;.;Group g1;生成

24、对象生成对象g1时,系统会为每个时,系统会为每个Student类的对象调用一类的对象调用一次构造函数,但由于没有指定实际参数,也只能调用次构造函数,但由于没有指定实际参数,也只能调用Student类的无参构造函数。类的无参构造函数。6.4.3 成员初始化列表与特殊成员的初始化成员初始化列表与特殊成员的初始化n2.构造函数的成员初始化列表构造函数的成员初始化列表 构造函数的构造函数的简单参数简单参数可以被直接列在函数声明之后,函可以被直接列在函数声明之后,函数体之前,称为构造函数的成员初始化列表,形式为:数体之前,称为构造函数的成员初始化列表,形式为:类名类名(行参说明表行参说明表):成员初始化

25、列表成员初始化列表;Date(int y=2007,int m=1,int d=30):year(y),month(m),day(d)n3.特殊成员采用成员初始化列表进行初始化特殊成员采用成员初始化列表进行初始化n一个类可以包含其它类对象成员、一个类可以包含其它类对象成员、const成员和引成员和引用成员,称它们为特殊成员是因为其处理上的特用成员,称它们为特殊成员是因为其处理上的特殊性殊性nconst成员成员、引用成员引用成员和和只能调用有参数构造函数只能调用有参数构造函数的的对象成员对象成员都必须采用成员初始化列表实现初始都必须采用成员初始化列表实现初始化,否则无法建立这些特殊成员。化,否则

26、无法建立这些特殊成员。n成员初始化列表中的初始化项目次序总是按先对成员初始化列表中的初始化项目次序总是按先对象、后简单成员的顺序进行,且同类的成员按其象、后简单成员的顺序进行,且同类的成员按其在定义中的顺序处理。在定义中的顺序处理。class Date int year,month,day;public:Date(int y,int m,int d):year(y),month(m),day(d);class X int x;const int y;char&z;Date dt;public:X(int x1,int y1,char&z1,int y2,int m2,int z2):x(x1)

27、,z(z1),y(y1),dt(y2,m2,z2);int main()char cx(a);X(10,20,cx,2008,2,11);/构造构造X类的对象类的对象 n4.常量数据成员常量数据成员 n类中定义的常量成员包括类中定义的常量成员包括const和和enum两类,两类,它们不占用对象的存储空间。它们不占用对象的存储空间。6.5 拷贝构造函数拷贝构造函数n构造函数的参数可以是任何类型参数,甚至可以构造函数的参数可以是任何类型参数,甚至可以将自己类对象的引用作为参数,称它为将自己类对象的引用作为参数,称它为拷贝构造拷贝构造函数函数。n拷贝构造函数有两个含义:拷贝构造函数有两个含义:首先首

28、先,它是一个构造函数,当创建一个新对象时,系统它是一个构造函数,当创建一个新对象时,系统自动调用它;自动调用它;其次,它将一个已经定义过其次,它将一个已经定义过 的对象的数据成员逐一对的对象的数据成员逐一对应地复制给新对象。应地复制给新对象。n如果一个类没有定义拷贝构造函数,如果一个类没有定义拷贝构造函数,C+可以为可以为该类产生一个缺省的拷贝构造函数。该类产生一个缺省的拷贝构造函数。n拷贝构造函数的作用:拷贝构造函数的作用:1 创建一个新对象,并将一个已存在的对象复制创建一个新对象,并将一个已存在的对象复制到这个新对象。到这个新对象。2 对象本身做参数。对象本身做参数。3 函数返回一个对象。

29、函数返回一个对象。下面的例子说明了拷贝构造函数的应用。下面的例子说明了拷贝构造函数的应用。6.5.1 用已有类对象构建新的类对象用已有类对象构建新的类对象class A int x,y;public:A(int intx,int inty)/一般的构造函数一般的构造函数 x=intx;y=inty A(const A&objA)/拷贝构造函数拷贝构造函数 x=objA.x;y=objA.y;A a(10,20);/调用调用 A(int,int)A b(a);/调用调用A(const A&);A c=b;/调用调用A(const A&);其中:其中:A a(10,20);创建了一个创建了一个A类

30、的对象类的对象a,具有初始具有初始参数为参数为10和和20,它调用的是一般构造函数,它调用的是一般构造函数A(int,int)。)。A b(a);创建一个创建一个A类对象类对象b,调用拷贝构造函数调用拷贝构造函数A(const A&),将对象将对象a的数据成员逐域的复制到对象的数据成员逐域的复制到对象b。A c=b;创建了一个创建了一个A类对象类对象c,调用拷贝构造函数调用拷贝构造函数将对象将对象b的数据成员逐域的复制到对象的数据成员逐域的复制到对象c。这是拷贝构造函数的典型使用,它表明当我们这是拷贝构造函数的典型使用,它表明当我们创建一个新对象,并希望将一个已存在的对象复制创建一个新对象,并

31、希望将一个已存在的对象复制到这个新对象时,系统到这个新对象时,系统自动调用自动调用拷贝构造函数。拷贝构造函数。6.5.2 改变缺省的拷贝行为改变缺省的拷贝行为n类对象的复制还发生在下面两种情况下:类对象的复制还发生在下面两种情况下:1、对象本身作参数、对象本身作参数 2、函数返回对象、函数返回对象class Studentint age;char*name;public:Student(int ag=18,char*str=0)age=ag;name=new charstrlen(str)+1;strcpy(name,str);Student(const Student&ss)name=new

32、 charstrlen(ss.name)+1;strcpy(name,ss.name);age=ss.age;Student getname(Student&arg);Student Student:getname(Student arg)return arg;void main()Student s1(20,“五四青年五四青年”);Student s2(s1);Student s3=s1.getname(s2);n在在main()函数调用函数调用getname(s2)发生后,拷贝构造发生后,拷贝构造函数将参数函数将参数s2(是是Student的对象的对象)复制到栈上,即复制到栈上,即在栈上创

33、建一个临时对象在栈上创建一个临时对象arg。n当从函数当从函数getname(s2)返回时,要从栈上将返回时,要从栈上将arg对象对象传送出来,也要创建一个临时对象,这时又调用传送出来,也要创建一个临时对象,这时又调用一次拷贝构造函数。一次拷贝构造函数。n这个临时对象紧接着赋值给这个临时对象紧接着赋值给string对象对象t,上述过程上述过程都是系统自动完成都是系统自动完成的。的。n一般来说,如果一个对象需要独占资源时一般来说,如果一个对象需要独占资源时必须定义拷贝构造函数,这里的资源指动必须定义拷贝构造函数,这里的资源指动态内存、窗口句柄和文件句柄等。态内存、窗口句柄和文件句柄等。n利用用户

34、利用用户自定义拷贝构造函数自定义拷贝构造函数实现的拷贝实现的拷贝构造称为构造称为“深拷贝深拷贝”,而采用系统,而采用系统缺省的缺省的拷贝构造拷贝构造函数函数实现的拷贝称为实现的拷贝称为“浅拷贝浅拷贝”。6.6 析构函数与对象拆除析构函数与对象拆除n在一个对象生命期结束时就会被拆除。例如,一在一个对象生命期结束时就会被拆除。例如,一个局部定义的对象在程序流程离开此局部区域时个局部定义的对象在程序流程离开此局部区域时被拆除,而一个动态建立的对象在用被拆除,而一个动态建立的对象在用delete释放时释放时被拆除。拆除对象时系统要自动调用一个类的特被拆除。拆除对象时系统要自动调用一个类的特殊方法殊方法

35、析构函数析构函数。n如果一个类没定义析构函数,系统会自动生成一如果一个类没定义析构函数,系统会自动生成一个,它的主要工作是将为对象分配的内存资源归个,它的主要工作是将为对象分配的内存资源归还给系统。如果在拆除类的对象时需要加入一些还给系统。如果在拆除类的对象时需要加入一些特殊的行为则需要自己定义析构函数。特殊的行为则需要自己定义析构函数。class A .public:A(.);/构造函数声明构造函数声明 A();/析构函数声明析构函数声明 .;1 1、析构函数不能有返回类型,也没有任何参数(因为无法、析构函数不能有返回类型,也没有任何参数(因为无法指定实参数),自然也就不能重载。指定实参数)

36、,自然也就不能重载。2 2、对于一个简单的类,系统提供的缺省析构函数可以很好、对于一个简单的类,系统提供的缺省析构函数可以很好地工作,但如果在一个对象工作期间占用了系统资源,则地工作,但如果在一个对象工作期间占用了系统资源,则必须定义析构函数释放这种资源,必须定义析构函数释放这种资源,Student:Student()delete name;/释放内存n一般地讲,如果一个类需要定义拷贝构造一般地讲,如果一个类需要定义拷贝构造函数,也就需要定义一个析构函数。函数,也就需要定义一个析构函数。n此外,利用此外,利用delete运算符删除对象时自动调运算符删除对象时自动调用析构函数也是用析构函数也是d

37、elete运算符与运算符与free函数的函数的主要区别。主要区别。6.7 字符串类字符串类stringn1.string类的属性与对象构造类的属性与对象构造 C+标准库定义了一个标准库定义了一个string类,用于取代类,用于取代C语语言的以言的以0结尾的字符串。结尾的字符串。string类的对象不类的对象不用用0结束,且提供了大量的类方法和运算结束,且提供了大量的类方法和运算以支持常规操作。以支持常规操作。stringstring定义于头文件定义于头文件 string nstring类的主要属性是一个记录字符序列存储区的类的主要属性是一个记录字符序列存储区的指针,可称为指针,可称为str,类

38、似类似Student类中的类中的name。常常用的构造函数包括:用的构造函数包括:string(const char*s=0);/用用0结结束束的的字字符符串串s初初始始化化string(int n,char c);/用用n个字符个字符c初始化初始化string(string&);/拷贝构造拷贝构造string s1(a string),s2;/s2为不含任何字符的字符串为不含任何字符的字符串string s2(10,a);/s2的值是的值是aaaaaaaaaan2.string类支持的主要运算类支持的主要运算 赋值运算赋值运算=。关系运算。关系运算。字符串加法(字符串加法(+和和+=+=),

39、也称字符串连接。),也称字符串连接。下标运算下标运算。输入输出运算输入输出运算和和。n3.string类的主要方法类的主要方法#include using namespace std;#include using namespace std;int main()string s1(a string),s2;int pos;cin s2;/输入输入s2 if(s2s1)s1+=s2;/字符串连接字符串连接 else s1+=no link;pos=s1.find(ing,0);/查找查找s1中有无字符串中有无字符串”ing”if(pos!=-1)s1.erase(pos,3);/如果有将其删除如

40、果有将其删除 cout s1.insert(0,modified:);/在在s1开头插入一个串并输出开头插入一个串并输出6.8 其它类型构造技术其它类型构造技术n1.用用union定义共用体类型定义共用体类型 union X char c2;int i;X a;a.i=257;/二进制形式二进制形式0000000100000001cout (int)a.c0 ,(int)a.c1;虽然代码中只是为虽然代码中只是为a.i赋值,但赋值,但a.i的存储空间也是数组的存储空间也是数组a.c的存储空间,故代码的输出是的存储空间,故代码的输出是1,1。可见,使用共用体的。可见,使用共用体的好处是可以很容易

41、地将一个数据好处是可以很容易地将一个数据“拆开拆开”成部分来使用,成部分来使用,同时也可以节约存储空间。人们称共用体是一种节约空同时也可以节约存储空间。人们称共用体是一种节约空间的类。间的类。n2.用用struct或或class定义位域类型定义位域类型 位域是一种可以按位使用存储空间的类。位域是一种可以按位使用存储空间的类。如如果果某某些些属属性性是是占占用用二二进进制制位位数数很很少少的的整整数数,可可以以在在类类定定义义中指定这些属性占用的二进制位数,如:中指定这些属性占用的二进制位数,如:class Mixed unsigned a:1,b:1,c:2;/a、b、c分别占用分别占用1、1

42、、2个二进制位个二进制位 int x;public:Mixed(unsigned a1,unsigned b1,unsigned c1,int x1):a(a1),b(b1),c(c1),x(x1);n3.用用typedef描述类型的别名描述类型的别名 在处理一些难以描述的类型时,在处理一些难以描述的类型时,typedef几乎是几乎是唯一的方法。例如,考虑下述变量定义语句:唯一的方法。例如,考虑下述变量定义语句:int array20;/定义数组定义数组arraychar*cpoint;/定义指针变量定义指针变量cpointdouble(*fpx)(double);/定义指向函数的指针变量定义

43、指向函数的指针变量fpx可以将这些变量定义改造成类型定义:可以将这些变量定义改造成类型定义:typedef int array20;/定义数组类型定义数组类型arraytypedef char*cpoint;/定义指针变量类型定义指针变量类型cpointtypedef double(*fpx)(double);/定义指向函数的指针变量类型定义指向函数的指针变量类型fpx于是,可以按下述形式定义相应的变量:于是,可以按下述形式定义相应的变量:array a,b;/定义定义2个长度为个长度为20的整型数组的整型数组a和和bcpoint p1,p2;/定义定义2个个char*类型的指针变量类型的指针变量p1和和p2fpx fp1,fp2;/定义定义2个指向函数的指针变量个指向函数的指针变量fp1和和fp2

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com