c++Word下载.docx
《c++Word下载.docx》由会员分享,可在线阅读,更多相关《c++Word下载.docx(26页珍藏版)》请在冰豆网上搜索。
类的定义是以关键字class开始,其后跟类名,类名必须是一个有效的C++标识符。
类体中定义的数据和函数称为这个类的成员,他包括数据成员和成员函数。
类成员都有一个属性,叫做访问权限,通过他前面的关键字来啊定义。
如果没有关键字,则所有成员默认定义为private权限。
这些关键字的声明顺序和次数是任意的。
其中公有成员不仅可以被成员函数引用,还可以在程序中被对象引用。
⑴公有成员提供了类的接口功能;
⑵而私有成员则是被隐藏的数据,只有该类的成员函数或友员函数才能引用它,在程序中不能被访问,通常把一些数据成员定义为私有成员;
⑶保护成员在不同条件下,具有公有成员或私有成员的特性。
2.在类体外定义成员函数的一般格式为:
函数类型>
:
成员函数名>
(<
参数表>
)
函数体>
}
其中,作用域运算符“:
”是用来标识某个成员函数是属于哪个类的,“类名”是成员函数所属类的名字。
实验七类与对象
(2)-构造函数和析构函数
1.理解构造函数和析构函数的定义与执行过程;
2.掌握重载构造函数的方法;
3.掌握带默认参数的构造函数的定义方法。
1.声明一个时间类,时间类中有3个私有数据成员(Hour,Minute,Second),公有成员函数有SetTimet和Print_Time,一个无参构造函数,一个有参构造函数。
2.定义一个矩形类Rectangle,其中包含四个私有数数成员(x1,y1,x2,y2),为类定义方法SetRectangle,ShowRectangle,getx1,gety1,getx2,gety2,并定义一个带有默认参数的构造函数。
3.定义一个学生类,包含私有数据成员,学生姓名,学生年龄,公有方法有,构造函数,析构函数,输入输出方法,返回学生姓名和年龄的方法,修改学生年龄和姓名的方法。
1.构造函数
当类的一个实例进入其作用域时,构造函数就会被调用。
在一个类中可声明一个或多个构造函数。
构造函数和类同名
构造函数无返回值
对类对象进行初始化
2.析构函数
析构函数的作用与构造函数相反,用来在系统释放对象前做一些清理工作,如利用delete运算符释放临时分配的内存,清零内存元等。
当一个对象生存期结束时,系统会自动调用该对象所属的类的析构函数的析构函数。
一个对象离开其作用域时,将调用析构函数。
在定义一个类时,同时定义了一个析构函数。
同名只有一个析构函数无参,不能指定任何返回值类型。
有些情况下析构函数是必须的,例如有的类在构造函数中或者类对象生存域的某个地方从堆里分配了内存,那么就必须在析构函数中把这些内存释放回堆。
3.构造函数重载
一个类可以有多个构造函数,这些构造函数必须具有不同的参数表,要么参数的个数不同,要么参数的类型不同,以便编译器能正确的区分他们。
在一个类需要接受不同的初始化值时,就需要编写多个构造函数。
实验七类与对象(3)拷贝构造函数
1.理解拷贝构造函数的定义及使用条件。
2.理解拷贝构造函数的特点及它与一般构造函数的区别与联系。
3.掌握简单拷贝构造函数的定义。
1.定义类Student,包含私有数据成员,学生姓名,学生年龄,公有方法有,构造函数,拷贝构造函数,析构函数,输入输出方法。
2.定义类Date,包含私有数据成员,年,月,日,公有方法有,构造函数,拷贝构造函数,析构函数,输出方法
1.拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用,其作用是使用一个已经存在的对象去初始化另一个同类对象,它具有以下特点:
(1)其函数名与类名相同,并且该函数也没有返回值类型。
(2)该函数只有一个参数,并且是同类对象的引用。
(3)每个类都必须有一个拷贝构造函数。
程序员可根据需要定义特定的拷贝构造函数,以实现同类对象之间数据成员的传递。
如果程序员没有定义类的拷贝构造函数,系统就会自动生成一个缺省的拷贝构造函数。
2.拷贝构造函数使用在以下三种情况下:
(1)用一个对象去初始化另外一个对象时;
(2)当对象作为实参向形参传递时;
(3)当对象作为函数返回值时。
实验七类与对象(4)静态成员与友元
1.理解静态成员的概念;
2.掌握静态数据成员及静态成员函数的使用方法;
3.理解友员的概念;
4.掌握友员函数的定义与使用。
1.定义类Student,包含私有数据成员学生姓名name,学生年龄age及静态数据成员学生数count,包含成员方法有构造函数,及析构函数,显示数据的函数,显示学生数目的函数。
2.定义类A,B,C,A类包含两个私有数据成员,声明三个友元,一个为普通函数的友元函数,一个为B类的成员函数为A的友元函数,一个是C类的友元,B类的成员函数用来修改A的一个数据成员,C类的成员函数修改A的另一个数据成员,普通函数用来显示A中的数据。
1.将一个数据成员说明为static,这种成员称为静态数据成员。
无论建立多少个类对象,都只有一个静态数据的拷贝存在。
实现了一个类的不同对象之间的数据共享。
2.在类定义中,前面有static说明的成员函数称为静态成员函数。
一般而言,静态成员函数不访问类中的非静态成员。
静态成员函数属于类,是该类所有对象共享的成员函数,而不属于类中的某个对象,调用公有静态成员函数的一般格式如下几种:
(1)类名:
静态成员函数名(实参表);
(2)对象.静态成员函数名(实参表);
(3)对象指针->
静态成员函数名(实参表)。
3.友元
友元可以让特定的函数或者别的类的所有成员函数,对私有数据成员进行读写。
既维持数据私有性,又保证让特定的类或函数能够直接访问私有数据。
友元类:
一个类可声明另一个类为它的友员,这个友元类的所有成员函数都可以读写它的么有数据。
友元成员函数:
挑出需要访问当前类私有数据成员的成元函数,将它们设为该类的友元。
友元函数:
不是任何类的成员函数,拥有类对象私有数据成员的读写权,作为类之间的联系纽带。
实验八继承
1.理解类的继承的概念,能够定义和使用类的继承关系;
2.掌握派生类的声明和定义方法;
3.了解公有派生和私有派生的访问特性;
1.定义一个类Shape,包含数据成员width,color,style,包含成员函数dispay,用来显示数据信息,包含两个构造函数,包含一个修改数据的成员函数set。
2.定义一个类Point,包含数据成员x,y,包含多个构造函数,包含一个显示的函数,一个修改数据成员的函数。
3.定义一个类CLine,从Shape公有派生,增加Point类型数据成员startPoint,endPoint,增加显示所有数据的函数,增加修改数据成员的函数,定义CLine构造函数(根据需要写)。
4.定义一个类Circle,从Point类公有派生,增加数据成员radius,增加显示数据的成员函数,增加修改半径的成员函数,增加返回半径的成员函数。
1.派生类的数据成员包括其基类的数据成员和派生类本身新增的数据成员,如果需要对派生尖新增的数据成员进行初始化,必须为派生类添加新的构造函数。
由于基数类的构造函数的析构函数不被继承,因此,对继承来的基类原有数据成员的初始化,必须由基类的构造函数来完成。
2.一个基类可以直接派生出多个派生类,并且,通过派生得到的派生尖又可以用为基类再派生出其他的派生类,这样就构成了一个家族。
不管有多少层派生关系,如果一个派生类只有一个直接基类,这种继承称为单继承。
一个派生类也可以由多个基类派生而来,这样的继承称为多继承。
实验九多态
(1)运算符重载
1.理解运算符重载的函义及机制。
2.掌握运算符重载的定义及使用。
3.了解运算符重载的规则。
1.编写复数类,在复数类中重载加法(+)运算符,以实现复数的加法运算;
2.为上题的复数类,增加输入操作符重载函数,输出操作符重载函数。
3.编写日期,在日期类中重载加法运算符,来实现在一个日期后加若干天以后的日期;
4.为上题中的类Date增加关系运算符重载,用以实再两个日期的比较。
1.C++充许为类的对象构造运算符来实现单目或双目运算,这个特性叫做做运算符重载。
可以通过添加成员函数来实现运算符重载。
2.使用运算符重载需要遵循的准则如下:
(1)需要在定义的对象间相互赋值时,重载赋值运算符;
(2)需要为数字类型增加算术属性时,重载算术运算符;
(3)需要对定义的对象进行逻辑比较时,重载关系运算符;
(4)如果重载了算术可关系运算符,应该考虑到算术运算和逻辑运算的可交换性;
(5)对于容器类,重载下标运算符;
(6)需要从I/O流中读写对象时,重载插入运算符(<
)的析取运算符(>
>
);
(7)重载成员指针运算符(->
)以实现所谓的smart指针;
(8)在少数情况下,重载new和delete运算符;
(9)不要重载其他任何运算符。
3.运算符重载需要遵循的一些规则:
(1)重载的运算符不能违返语言的语法规则;
(2)不能重载用于C++内部数据类型的运算符;
例如,不能重载双目整数加法运算符。
(3)如果一个运算符可以放在两个标识符中间,就可以重载它来满足类操作的需要哪怕这种用法原先编译器不能接受;
(4)不能自己创造C++语言中不存在的运算符;
(5)下列运算符是不可以被重载的:
◆.类成员运算符
◆.*成员指针运算符
◆:
:
域解析运算符
◆?
条件运算符
(6)不可以改变运算符的优先级。
4.运算符重载的实质就是函数重载。
在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中完成的运算符重载有两种方法,一种是作为非类成员来重载运算符,一种是作为类成员函数来重载运算符。
非类成员重载运算符,需要把这个函数声明为类的友元。
实验九多态性
(2)
1.理解多态性的概念。
2.理解编译时多态性和运行时多态性。
3.掌握函数重载的作用和使用方法。
4.掌握虚函数的作用及使用方法。
5.了解纯虚函数和抽象类的概念和用法。
6.了解虚析构函数的作用和用法。
1.重载圆面积函数和圆柱面积函数。
2.定义抽象基类High,其数据成员为高H,定义Show()为纯虚函数。
然后再由High派生出长方体类Cuboid与圆柱体类Cylinder。
并在两个派生类中重新定义虚函数Show()。
在主函数中,用基类High定义指针变量p,然后用指针p动态调用派生类中虚函数Show(),显示长方体与圆柱体的体积。
3.利用虚函数实现的多态性来求四种几何图形的面积之和。
这四种几何图形是:
三角形、矩形、正方形和圆。
几何图形的类型可以通过构造函数或通过成员函数来设置。
4.虚析构函数使用。
分析下面程序,在使用A类的析构函数或使用A类的虚析构函数,运行结果分别是什么?
#include<
iostream.h>
classA
public:
A(){cout<
"
A构造函数\n"
;
//~A(){cout<
A析构函数\n"
}//析构函数
virtual~A(){cout<
}//虚析构函数
virtualvoiduse(){cout<
inA\n"
};
classB:
publicA
B(){cout<
B构造函数\n"
~B(){cout<
B析构函数\n"
virtualvoiduse(){cout<
inB\n"
classC:
publicB
C(){cout<
C构造函数\n"
~C(){cout<
C析构函数\n"
virtualvoiduse(){cout<
inC\n"
voidmain()
A*obj;
obj=newC();
obj->
use();
deleteobj;
1.多态性
在面向对象的概念中,多态性是指不同对象接收到相同消息时,根据对象类的不同产生不同的动作。
多态性提供了同一个接口可以用多种方法进行调用的机制,从而可以通过相同的接口访问不同的函数。
具体地说,就是同一个函数名称,作用在不同的对象上将产生不同的操作。
多态性提供了把接口与实现分开的另一种方法,提高了代码的组织性和可读性,更重要的是提高了软件的可扩充性。
2.编译时的多态性和运行时的多态性
⑴联编
联编也称绑定,是指源程序在编译后生成的可执行代码经过连接装配在一起的过程。
联编分为两种:
静态联编和动态联编。
①静态联编
在运行前就完成的联编,又称前期联编。
这种联编在编译时就决定如何实现某一动作,因此要求在程序编译时就知道调用函数的全部信息。
这种联编类型的函数调用速度很快,效率也很高。
②动态联编
在运行时动态地决定实现某一动作,又成后期联编。
这种联编要到程序运行时才能确定调用哪个函数,提供了更好的灵活性和程序的易维护性。
⑵编译时的多态性和运行时的多态性
由静态联编支持的多态性称为编译时的多态性或静态多态性,也就是说,确定同名操作的具体操作对象的过程是在编译过程中完成的。
C++用函数重载和运算符重载来实现编译时的多态性。
由动态联编支持的多态性称为运行时的多态性活动太多态性,也就是说,确定同名操作的具体操作对象的过程是在运行过程中完成的。
C++用继承和虚函数来实现运行时的多态性。
3.函数重载
函数的重载也称多态函数,是实现编译时的多态性的形式之一。
它使程序能用同一个名字来访问一组相关的函数,提高了程序的灵活性。
函数重载时,函数名相同,但函数所带的参数个数或数据类型不同,编译系统会根据参数来决定调用哪个同名的函数。
面向对象程序设计中,函数的重载表现为两种情况:
第一种是参数个数或类型有所差别的重载,第二中是函数的参数完全相同但属于不同的类。
第一种情况的内容已在第一章作了介绍,这里主要介绍第二种情况的内容。
当函数的参数完全相同但属于不同的类时,为了让编译能正确区分调用哪个类的同名函数,采用两种方法:
⑴用对象名区别
在函数名前加上对象名来限制。
如,对象名.函数名。
⑵用类名和作用域运算符∷加以区别
在函数名前加“类名∷”来限制。
如,类名∷函数名。
4.虚函数的定义和使用
1)虚函数的定义
虚函数的定义是在基类中进行的,即把基类中需要定义为虚函数的成员函数声明为virtual。
当基类中的某个成员函数被声明为虚函数后,它就可以在派生类中被重新定义。
在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数和类型、参数的顺序都必须与基类中的原型完全一致。
虚函数定义的一般形式为:
virtual<
函数名>
(参数表)
{
函数体
}
2)虚函数与重载函数的关系
在派生类中被重新定义的基类中的虚函数,是函数重载的另一种形式,但它与函数重载又有区别:
一般的函数重载,要求其函数的参数或参数类型必须有所不同,函数的返回类型也可以不同,但重载一个虚函数时,要求函数名、返回类型、参数个数、参数的类型和参数的顺序必须与基类中的虚函数的原型完全相同。
如果仅返回类型不同,其余相同,则系统会给出错误信息;
如果函数名相同,而参数个数、参数的类型或参数的顺序不同,系统认为是普通的函数重载,虚函数的特性将丢失。
3)多重继承和虚函数
由于多重继承可以看成是多个单继承的组合,所以多重继承的虚函数的调用,包括它的定义和定义时的限制(下届介绍),与单继承的虚函数的调用相同。
一个虚函数无论被继承多少次,仍保持其虚函数的特性,与继承的次数无关,或者说虚特性是可以传递的。
4)虚函数的限制
使用虚函数时应注意如下问题:
⑴虚函数的声明只能出现在类声明的函数原型的声明中,不能出现在函数体实现的时候,而且,基类中只有保护成员或公有成员才能被声明为虚函数。
⑵在派生类中重新定义虚函数时,关键字virtual可以写也可不写,但在容易引起混乱时,应写上该关键字。
⑶动态联编只能通过成员函数来调用或通过指针、引用来访问虚函数,如果用对象名的形式来访问虚函数,将采用静态联编。
⑷虚函数必须是所在类的成员函数,不能是友元函数或静态成员函数。
但可以在另一个类中被声明为友元函数。
⑸构造函数不能声明为虚函数,析构函数可以声明为虚函数。
⑹由于内联函数不能在运行中动态确定其外治,所以它不能声明为虚函数。
5.抽象类
抽象类是一种特殊的类,它为一族类提供统一的操作界面,建立抽象类就是为了通过它多态地使用其中的成员函数。
抽象类是带有纯虚函数的类。
1)纯虚函数
一个抽象类带有至少一个纯虚函数。
纯虚函数是在一个基类中说明的虚函数,它在该基类中没有具体的操作内容,要求各派生类在重新定义时根据自己的需要定义实际的操作内容。
纯虚函数的一般定义形式为:
(参数表)=0;
纯虚函数与普通虚函数的定义的不同在于书写形式上加了“=0”,说明在基类中不用定义该函数的函数体,它的函数体由派生类定义。
2)抽象类
如果一个类中至少有一个纯虚函数,这个类就成为抽象类。
它的主要作用是为一个族类提供统一的公共接口,以有效地发挥多态的特性。
使用时应注意以下问题:
⑴抽象类只能用作其它类的基类,不能建立抽象类的对象。
因为它的纯虚函数没有定义功能。
⑵抽象类不能用作参数类型、函数的返回类型或显式转换的类型。
⑶可以声明抽象类的指针和引用,通过它们,可以志向并访问派生类对象,从而访问派生类的成员。
⑷若抽象类的派生类中没有给出所有纯虚函数的函数体,这个派生类仍是一个抽象类。
若抽象类的派生类中给出了所有纯虚函数的函数体,这个派生类不再是一个抽象类,可以声明自己的对象。
6.计算这四种几何图的面积公式分别是:
三角形的边长为W,高为H时,则三角形的面积为W*H/2;
矩形的边长为W,宽为H时,则其面积为W*H;
正方形的边长为S,则正方形的面积为S*S;
圆的半径为R,其面积为3.1415926*R*R。
为设置几何图形的数据并求出几何图形的面积,需要定义一个包含两个虚函数的类:
classShape
{public:
virtualfloatArea(void)=0;
//求面积
virtualvoidSetdata(float,float=0)=0;
//设置图形数据
因面积的计算依赖于几何图形,故在类中只能定义一个纯虚函数Area。
同理,设置几何图形数据的函数Setdata也只能定义为虚函数。
把这个基类派生出其它几何图形类。
如派生出的三角形类为:
classTriangle:
publicShape
{floatW,H;
//三角形边长为W,高为H
Triangle(floatw=0,floath=0){W=w;
H=h;
floatArea(void){returnW*H/2;
voidSetdata(floatw,floath=0){W=w;
在派生类中定义了基类中两个虚函数的实现。
为了实现求面积和设置数据的多态性,必须定义一个类,该类中定义一个指向基类Shape的指针数组,其元素分别指向由基类Shape派生出的不同的几何图形类,并完成求出所有几何图形面积之和,以及设置参数的函数。
实验十I/O流
1.掌握提取和插入运算符的重载;
2.掌握文件输入流和输出流的使用;
3.掌握文件的读、写操作。
1.编写一个程序,采用“<
”运算符重载函数的设计方法显示一个数组(大小为34)中的元素。
2.编写一个程序,实现以下功能:
(1)输入一系列的数据(学号、姓名、成绩)存放在文件stud.dat中。
(2)从该文件中读出这些数据并显示出来。
3.编写一个程序,每次从两个文件各读入一行,而后通过调用TwoLineEql()函数去判断此两行是否完全相同,直至发现了不同,或者处理到了文件结束。
4.建立一个应用程序,包括数据输入、存盘、读盘、操作数据后存储等功能。
通过随机数函数rand()产生20个整数,逐个将这些数以二进制方式写入文件file.dat中。
然后读出这些数,在内存中对它们进行升序排序,再将排序后的数以文本方式逐个写入file.out文件中。
1.当重载“<
”运算符时,相当于创建一个插入符函数,格式如下:
friendostream&
operator<
(ostream&
stream,<
&
类引用名>
//函数体
returnstream;
该插入符函数必须以友元方式说明。
其中的第一个参数是ostream类对象的一个引用,<
为待输出的对象,该函数返回ostream的引用。
2.流可以分为三类:
输入流、输出流以及输入/输出流,相应地必须将流说明为ifstream、ofstream以及fstream类的对象。
说明了流对象之后,可以使用函数o