1、C+程序设计第1章 C+初步本章主要内容 数据类型不同 动态内存分配机制不同 输入输出机制 函数不同 常变量 面向过程与面向对象思想的区别1.1数据类型不同 C+语言的基本数据类型与C语言一致,可以在C+中直接应用。不同之处:C语言整型占2个字节,而C+中基本整型占4个字节。C语言指针类型占2个字节,而C+中指针类型占4个字节。C+中结构体类型 类型名省略关键字struct1.2 动态内存分配机制不同 C语言利用动态内存分配函数 malloc()calloc()free()C+利用动态分配和撤销内存的运算符 new和delete 注意:new和delete是运算符,不是函数,执行效率高。new
2、和delete运算符 new运算符使用的一般格式 new 类型初值;例如:new int;new int(100);new char10;float*p=new float(3.14);delete运算符使用的一般格式 delete 指针变量;例如:delete p;delete pt;1.3 C与C+不同的输入输出机制 C+中输入输出流的基本概念 使用输出流对象cout的基本方法和格式 使用输入流对象cin的基本方法和格式C+中输入输出流的基本概念 C+中通过调用输入输出流库中的流对象cin和cout实现输入输出。cout是输出流对象的名字,cin是输入流对象的名字 是流提取运算符,作用是从
3、默认的输入设备的输入流中提取若干字节送到内存区中指定变量。C+中输入输出流的基本操作 使用cin,cout和流运算符必须包含头文件#include cout语句的一般格式为 cout表达式1表达式2变量1变量2变量n;注意:不能使用cin语句输入空格和回车字符 必须输入时使用getchar()函数输入1.4 C与C+函数不同 内联函数 函数重载 带默认参数的函数 引用和引用做函数参数一内联函数 编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程转出去。这种嵌入到主调函数中的函数称为内联函数。指定内联函数,在函数首行的左端加关键字inline即可。内联函数中不能包含复杂的控制语句,如循环
4、语句等。#includeinline int max(int a,int b,int c);int main()int i=10,j=20,k=30,m;m=max(i,j,k);coutmax=ma)a=b;if(ca)a=c;return a;二函数重载 C+允许用同一函数名定义多个函数,这些函数的参数类型或者参数个数不同,这就是函数的重载。重载函数的参数个数,参数类型,或参数顺序3者中必须至少有一种不同,函数返回值类型可以相同也可以不同。所谓重载就是“一物多用”,不仅函数可以重载,运算符可以重载。#includeint max(int a,int b,int c);int max(int
5、 a,int b);int main()int a=8,b=20,c=30;coutmax(a,b,c)=max(a,b,c)endl;coutmax(a,b)=max(a,b)a)a=b;if(ca)a=c;return a;int max(int a,int b)if(ab)return a;else return b;三带默认参数的函数 当用同样实参多次调用同一函数时,C+中可以给形参一个默认值,这样形参就不必一定从实参取值了。例如:函数声明 float area(float r=6.5);则函数调用 area();area(7.5);必须在函数调用之前将默认值的信息通知编译系统三带默认
6、参数的函数 实参与形参结合是从左至右。因此指定默认值的参数必须放在形参表列最右端。例如:void f1(float a,int b=0,int c)?void f2(float a,int b,int c=0)一个函数不能既作为函数重载,有作为有默认参数的函数,否则产生二义性。例如:有函数声明int max(int a,int b,int c=10);int max(int a,int b);函数调用max(5,23);调用哪个函数?#includeint max(int a,int b,int c=0);int main()int a,b,c;cinabc;coutmax(a,b,c)=ma
7、x(a,b,c)endl;coutmax(a,b)=max(a,b)a)a=b;if(ca)a=c;return a;四引用 引用的作用是为变量起一个别名。例如:int a;int&b=a;说明b是a的引用,即b是a的别名。b和a占内存中的同一个存储单元。在声明一个引用时,必须同时使之初始化,即声明它代表的变量,不能在作为其他变量的引用。例如:int a1=3,a2=5;int&b=a1;int&b=a2;/正确吗?#include#includeint main()int a=10;int&b=a;a=a*a;coutasetw(6)bendl;b=b/5;coutb setw(6)aend
8、l;return 0;例.引用和变量的关系引用做函数参数 C+引入引用的主要用途是传递函数参数,以扩充函数传递数据的功能。目前我们学习的参数传递方法有三种 变量名做参数 传递变量指针 传递变量的别名#includevoid swap(int&,int&);int main()int i=3,j=5;swap(i,j);couti=ij=jendl;return 0;void swap(int&a,int&b)int temp;temp=a;a=b;b=temp;例.利用“引用形参”实现两个变量值的互换1.5 C+中与常变量相关的概念 常变量概念和特点 常变量作函数参数 指向常变量的指针变量一常
9、变量概念和特点 定义变量时,加上关键字const,则变量的值在程序运行期间不能改变,称为常变量 例如:const int a=3;定义常变量时必须同时对其初始化 例如:const int a;a=3;/错误,常变量不能被赋值二常变量作函数参数 用const限制函数的参数能保证函数不对参数做任何修改 针对指针和引用参数,可以避免实参被意外修改int f(int i1,const int i2)i1+;i2+;/正确吗?return i1+i2;三指向常变量的指针变量 定义指向常变量指针变量的一般形式:const 类型名 *指针变量名;例如:const char*ptr;常变量只能用指向常变量的指
10、针变量指向,不能用一般的指针变量指向 例如:const char c=“boy”;const char*p1;p1=c;char*p2=c;/正确吗?指向常变量的指针变量 指向常变量的指针变量还可以指向非const 的变量,此时不能通过指针变量改变该变量的值。例如:char c1=a;const char*p;p=&c1;*p=b;/?如果函数形参是指向const型的指针变量,在函数执行过程中不能改变指针变量所指向的变量的值。1.6面向过程与面向对象思想的区别例如:求三角形周长和面积例.利用面向过程思想求三角形周长和面积#includestdio.h#includemath.hfloat mi
11、anji(float a,float b,float c)float s,area;s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c);return(area);float zhouchang(float a,float b,float c)return(a+b+c);void main()float a,b,c,m,z;scanf(%f,%f,%f,&a,&b,&c);m=mianji(a,b,c);z=zhouchang(a,b,c);printf(%f,%f,m,z);1.面向过程编程思想将数据和处理数据的过程分离为相互独立的实体,当数据结构发生改变时
12、,所有的相关处理过程都要发生改变。结构化程序设计的基本思想:自顶向下、逐步求精,其程序结构按照功能划分为若干基本模块,形成一个树状结构;每个模块内部均是由顺序、选择、循环三种基本结构组成;其模块实现的基本方法是子程序(函数)。程序=数据结构+算法例.利用面向对象思想求三角形周长和面积#include#includemath.husing namespace std;class trangle public:trangle(float x,float y,float z)a=x;b=y;c=z;float zhouchang()return a+b+c;float mianji()return(
13、sqrt(a+b+c)/2.0)*(a+b+c)/2.0)-a)*(a+b+c)/2.0)-b)*(a+b+c)/2.0)-c);private:float a,b,c;int main()trangle t1(3,4,5),t2(6,8,12);coutt1.zhouchang()endlt2.mianji()实数的加法 -复数的加法实验一 C+初步 实验目的:C+流输入输出 C+中函数的基本概念 实验内容 利用函数重载求任意二个数中的大数。利用引用做函数参数对3个变量按由小到大的顺序排序 利用函数默认参数求3个数最大值,验证定义默认参数和函数重载后果。C+程序设计第2章 类与对象本章主要内
14、容 结构体与类 类的定义方法 C+类成员的访问属性 类和对象的简单应用举例 构造函数与析构函数 对象指针类的概念:C+中的类就是一种用户自定义的数据类型,和其他数据类型不同的是,组成这种类型的不仅可以有数据,而且可以有对数据进行操作的函数,它们分别叫做类的数据成员和类的函数成员。定义性说明和引用性说明,定义性说明就是定义类,说明了类的成员。而引用性说明就是只说明了类名,留待后面的代码对这个类加以定义。2.1类的声明和对象的定义一、结构体与类 结构体struct Studentint num;char name20;float score3;;C+中允许用中允许用struct来定义一来定义一个个
15、类类类型类型Student 是一个是一个合法的合法的类类类型类型一个完整的类定义包括关键字class 类名 类体 在类体中定义类的属性(类中的数据成员的取值范围)和操作(类中的成员函数名)。class 类名 public:若干成员;protected:若干成员;private:若干成员;二、类的定义类成员访问限定符 public的成员:一般是成员函数,用于定义类的外部接口,在程序中的任何部分都可访问。private的成员:一般是数据成员,用于描述类的属性,它们只能被类自身的成员函数访问,类的成员默认情况下是私有的。protected的成员:不能被类外访问,但可被派生类的成员函数访问。注意:关键
16、字 private public protected的出现顺序是任意的,并且可以不出现或出现多次。但类中的每个成员只能有一种特定的访问属性Class Cylinder public:void setcylinder(double r,double h);double getradius();double getheight();double volume();double surface_area();private:double radius;double height;注:在类内不允许对声明的数据成员进行初始化举例类是用户定义的一种类型,在程序中我们根据该类的类型说明一个变量,那么这个变量
17、就是一个对象,它是具体的,在内存中对象被分配相应的内存,它是以类作为样板生成的。事实上建立对象时,只有每个对象的数据是分别占用内存的,而操作这些数据的代码(函数)只有一份,由各对象共享,这是编译器实现对象的一种方法而已,我们仍应理解为一个对象是独立的由数据和代码组成。三、类和对象的定义 与一般变量相同,对象也必须经过声明后才能使用,声明类的对象如下:类名 对象名;例如:Cylinder cylinder1,cylinder2;Cylinder cylinder10;对象的声明:定义类的成员函数的实现的一般形式为:返回类型 类名:成员函数名(参数说明)函数体“:”是作用域运算符,它标明所要定义的
18、函数属于哪个类注:1、如果函数体的定义放在类的声明内,这样定义的函 数自动成为内联函数 2、如果在类外定义一个类的内联成员函数,应该在函 数类型之前用关键字inline进行说明 四、类的成员函数的定义 void Cylinder:setcylinder(double r,double h)radius=r;height=h;double Cylinder:getradius()return radius;double Cylinder:getheight()return height;double Cylinder:volume()double vol;vol=3.1415926*radius
19、*radius*height;return vol;例2.12.2 C+类成员的访问控制 引用方式 (1)对象名.数据成员名、对象名.成员函数名(参数表)(2)指向该类对象的指针-成员名 (3)对象的引用.成员名 在C+中,数据封装是通过类来实现的。由于类中成员指定了访问权限,所以程序中其他函数就不能访问对象的私有成员,只能通过公有成员提供接口来访问 class A public:int x;setX(int a)x=a;getX()return x;A object;object.x=5;类的数据成员可以是类类型,也就是说类的声明中数据成员可以是另一个类的对象,但必须注意以下两点:这个对象不
20、能是本类的对象。作为数据成员的对象所属的类,应该在声明这个对象之前进行声明class A .;class B A a;.;2.3类和对象的简单应用举例例2.2求三个长方体的体积。编写一个基于对象的程序,数据成员包括length、width、height。要求用成员函数实现以下功能:由键盘分别输入三个长方体的长,宽,高;计算长方体的体积;输出长方体的体积;int rectangle:calculate()return(length*width*heigth);void rectangle:output()coutcalculate();int main()rectangle t1;t1.inpu
21、t();t1.calculate();t1.output();return 0;#include using namespace std;class rectangle public:void input();void output();int calculate();private:int length;int width;int heigth;void rectangle:input()cinlength;cinwidth;cinheigth;2.4构造函数与析构函数一、构造函数 对象的初始化 将确定对象的初始状态,即对其成员的初始值进行确定。类的数据成员不能在声明类时初始化 如果类中成员
22、全部是public,可在定义对象时对数据成员进行初始化 C+提供了构造函数(constructor)来处理对象的初始化问题构造函数举例例2.3void Time:show_time()couthour“:”minute“:”secendl;int main()Time t1;t1.set_time();t1.show_time();Time t2;t2.show_time();return 0;#include using namespace std;class Time public:Time()hour=0;minute=0;sec=0;void set_time();void show_
23、time();private:int hour;int minute;int sec;void Time:set_time()cinhour;cinminute;cinsec;1、构造函数的定义 构造函数的函数名必须与类名相同。是一个很特殊的成员函数,因此构造函数需要在类中说明(定义);构造函数没有返回值,也不需在定义时声明函数类型。构造函数的主要作用是完成对类对象的初始化工作。构造函数不能由编程人员显式的直接调用。在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句。在创建一个类的新对象的同时,系统会自动调用该类的构造函数为新对象初始化。2、带参数的构造函数 采用带参数的构造函
24、数,在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数,以实现不同的初始化。构造函数首部的一般格式为 构造函数名(类型 1 形参1,类型2 形参2,)实参是在定义对象时给出的。定义对象的一般格式为 类名 对象名(实参1,实参2,);带参数的构造函数举例例2.4int Box:volume()return (height*width*length);int main()Box box1(12,25,30);coutthe volume of box1 is box1.volume()endl;Box box2(15,30,21);coutthe volume of box2 is bo
25、x2.volume()endl;return 0;#include using namespace std;class Box public:Box(int,int,int);int volume();private:int height;int width;int length;Box:Box(int h,int w,int len)height=h;width=w;length=len;3、用参数初始化表对数据成员初始化 C+还提供另一种初始化数据成员的方法参数初始化表来实现对数据成员的初始化。在原来函数首部的末尾加一个冒号,然后列出参数的初始化表 这种写法方便、简练,尤其当需要初始化的数
26、据成员较多时更显其优越性。举例例2.5int Box:volume()return (height*width*length);int main()Box box1(12,25,30);coutthe volume of box1 is box1.volume()endl;Box box2(15,30,21);coutthe volume of box2 is box2.volume()endl;return 0;#include using namespace std;class Box public:Box(int h,int w,int len):height(h),width(w),l
27、ength(len)int volume();private:int height;int width;int length;4、构造函数的重载 在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类型不相同。这称为构造函数的重载。int Box:volume()return (height*width*length);int main()Box box1;coutthe volume of box1 is box1.volume()endl;Box box2(15,30,21);coutthe volume of b
28、ox2 is box2.volume()endl;return 0;#include class Box public:Box(int h,int w,int len):height(h),width(w),length(len)Box();int volume();private:int height;int width;int length;Box:Box()height=10;width=10;length=10;说明:调用构造函数时不必给出实参的构造函数,称为默认构造函数(default constructor)。显然,无参的构造函数属于默认构造函数。一个类只能有一个默认构造函数。如果
29、在建立对象时选用的是无参构造函数,应注意正确书写定义对象的语句。尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。5、使用默认参数的构造函数 构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。说明:(1)应该在声明构造函数时指定默认值。(2)如果构造函数的全部参数都指定了默认值,则在定义对象时可以给一个或几个实参,也可以不给出实参。(3)在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数。int Box:volume()return (height
30、*width*length);int main()Box box1;coutthe volume of box1 is box1.volume()endl;Box box2(15);coutthe volume of box2 is box2.volume()endl;Box box3(15,30);coutthe volume of box2 is box3.volume()endl;return 0;#include class Box public:Box(int h=10,int w=10,int len=10);int volume();private:int height;int
31、width;int length;Box:Box(int h,int w,int len)height=h;width=w;length=len;6、构造函数小结 如构造函数带有参数,在声明对象时,就必须利用实参对对象进行初始化。如构造函数不带参数,定义对象时不能带括号。与普通函数一样,构造函数也可以定义为内联函数,可以带默认形参值,也可以重载。注:当类中没有声明构造函数时,系统会为之生成一个不带参数的构造函数,该函数体内没有任何语句,不执行任何操作。二、析构函数 析构函数:和构造函数作用相反的成员函数。函数首:类名()主要功能:释放对象的内存资源。析构函数的作用并不仅限于释放资源方面,它还可
32、以被用来执行“用户希望在最后一次使用对象之后所执行的任何操作”。析构函数无返回值、无函数类型、无参数。一个类可以有多个构造函数,但只能有一个析构函数 系统调用构造和析构函数的顺序:先构造的后析构,后构造的先析构析构函数调用的条件 如果在一个函数中定义了一个对象,当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数。static局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数)时,调用该全局对象
33、的析构函数。如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。2.5对象指针一、指向对象的指针:存放对象指针的指针变量 定义形式:类名*对象指针名;例:Box*p,box1;p=&box1;通过对象指针访问对象成员 例:*p box1 (*p).width box1.width p-width (*p).volume()box1.volume()p-volume()二、指向对象成员的指针 指向对象数据成员的指针 指向对象成员函数的指针 this 指针 1、指向对象数据成员的指针 指向对象数据成员的指针变量概念 定义形式:数据成员类型名*指针变量
34、名 访问形式与指向变量的指针变量的使用完全相同2、指向对象成员函数的指针 与指向普通函数的指针变量的定义方法不同 复习:数据类型名(*指针变量名)(参数表列);定义形式:数据类型名(类名:*指针变量名)(参数表列);确定指向关系 指针变量名=&类名:成员函数名举例:float(Box:*p1)();p1=&Box:volume;.(box1.*p1)();3、this 指针 this指针:为解决不同对象调用同一个函数段时如何引用不同的数据成员的问题。C+系统提供的,每一个成员函数都隐式包含的特殊指针。是指向本类对象的指针,值是当前被调用的成员函数所在对象的地址。隐式使用,作为参数传递给成员函数
35、的 例:box1.volume();C+系统处理为:box1.volume(&box1);return(this-length*this-width*this-height)this=&box1实验二 类与对象 构造一个圆类Circle,属性为半径radius、求圆周长和面积,实现根据输入的半径计算周长和面积并输出。要求定义以半径为参数、缺省值为0的构造函数。构造一个矩形类Rectangle,数据成员为矩形的左下角与右上角的坐标,利用成员函数实现对矩形周长与面积的计算。C+程序设计第3章 数据的共享与保护本章主要内容 共用数据的保护 对象的赋值与复制 静态成员 友元3.1共用数据的保护 共用数
36、据的保护:为保证数据在一定范围内共享,同时又保证它不被任意修改一、常对象:定义一般形式 类名 const 对象名(实参表列);或 const 类名 对象名(实参表列);例:const Box box1(1,1,1);常对象的所有数据成员的值都不能被修改,也不能调用该对象的非const型的成员函数。二、常对象成员 在声明类时将成员声明为const1.常数据成员 const 类型 数据成员名;例:const float length;length 为常数据成员,它的值不能发生改变 常数据成员只能通过构造函数的参数初始化表对常数据成员进行初始化。在类体中声明一个常数据成员后,该类所有对象此常数据成员
37、的值都不能改变2.常成员函数 声明形式:类型 函数名(参数表列)const;定义形式:类型 函数名(参数表列)const 函数体 常成员函数只能引用本类的数据成员,但不能修改数据成员 常成员函数可以引用const数据成员,也可以引用非const数据成员;const数据成员可以被const成员函数引用,也可以被非const成员函数引用;三、指向对象的常指针 定义一般形式:类名*const 指针变量名=对象地址;例:Box box1(1,1,1);Box*const p1=&box1;指针变量的指向关系不变,始终指向一个对象,但可以改变其所指对象中数据成员的值。常用来做函数的形参,目的是不允许在函
38、数调用的过程中改变指针变量的值。四、指向常对象的指针变量1.指向常变量的指针变量 定义一般形式:const 类型名*指针变量;例:const int a;const int*pt=&a;说明:常变量只能用指向常变量的指针变量来指向 指向常变量的指针变量还可以用来指向非const变量 此时不能通过指针改变指针所指向变量的值2.指向常对象的指针变量 定义形式:const 类名*指针变量名;例读程改错void main()void fun(const Box*p);Box box1(2,3,6);fun(&box1);void fun(const Box*p)p-width=23;coutwidth
39、endl;五、对象的常引用 引用:变量或对象的引用就是变量或对象的别名。对象的常引用:const 类名&引用对象名;常作函数的形参,保证在函数调用过程中不改变引用对象的值。3.2 对象的赋值 对象的赋值:一般形式:对象名1=对象名2;说明:对象的赋值只对其中的数据成员赋值,而不对成员函数赋值;类的数据成员中不能包括动态分配的数据。对象的复制 一般形式:类名 对象2(对象1);例:Box box2(box1);含义:用box1对象复制出一个box2对象 另一种复制形式:类名 对象2=对象1;是建立新对象的一种方法 用这种方法建立对象时要调用一个特殊的构造函数复制构造函数(copy constru
40、ctor)复制构造函数 功能:用一个已知的对象来初始化一个被创建的同类对象;特点 函数名同类名,无返回值和函数类型;只有一个参数,是对某个对象的引用;:(const&)每个类都必须有一个复制构造函数;如果类中没有说明复制构造函数,则编译系统自动生成一个具有上述形式的缺省拷贝初始化构造函数,作为该类的公有成员;例class Boxpublic:Box(float=1,float=1,float=1);Box(const Box&b);void get_value();float volume();void display();private:float length;float width;fl
41、oat height;Box:Box(float len,float w,float h)length=len;width=w;height=h;Box:Box(const Box&b)length=b.length;width=b.width;height=b.height;void Box:get_value()cinlength;cinwidth;cinheight;float Box:volume()return(length*width*height);void Box:display()coutvolume()endl;void main()Box box1(10,12,30);c
42、out“the volume of box1 is”box1.volume()endl;Box box2=box1;cout“the volume of box2 is”box2.volume()endl;调用复制构造函数的三种情况 明确表示由一个对象复制另一个对象时;例如:Box box1(box2);当对象作为函数实参传递给函数形参时(传值调用);例如:fun(box1);当对象作为函数返回值时(数据值);例如:return box1;3.3 静态成员 目的:解决数据共享问题,即不通过全局对象,而实现同类多个对象之间的数据共享。一、静态数据成员1、静态数据成员、静态数据成员是是类的所有对象
43、共享类的所有对象共享的成员,而不是某个对象的成员,而不是某个对象的成员的成员;对多个对象来说,静态数据成员对多个对象来说,静态数据成员只存储在一个只存储在一个地方地方,供所有对象使用,供所有对象使用;静态数据成员的静态数据成员的值值对对每个对象每个对象都是都是一样一样的,并的,并且其值可以被任何一个对象更新;且其值可以被任何一个对象更新;2、使用方法与注意事项、使用方法与注意事项静态数据成员在静态数据成员在定义或说明定义或说明时前面加上关键字时前面加上关键字static;private:static int s;s是私有的静态数据成员;一、静态数据成员(续)静态数据成员是静态存储的,它是静态生
44、存期,静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化必须对它进行初始化;静态数据成员的初始化与一般数据成员初始化不静态数据成员的初始化与一般数据成员初始化不同,格式如下:同,格式如下:说明:说明:k初始化只能初始化只能在类体外在类体外进行进行,前面不加前面不加static,以免与一般静态以免与一般静态变量或对象混淆;变量或对象混淆;:=;k是在所有对象之外单独开辟内存空间的;是在所有对象之外单独开辟内存空间的;k在程序编译时分配内存空间,到程序结束时释放内存在程序编译时分配内存空间,到程序结束时释放内存;k既可通过对象名引用,又可通过类名引用。既可通过对象名引用,又可通过类名引用
45、。一、静态数据成员(续)例分析下列程序的输出结果。#include class Myclasspublic:Myclass(int a,int b,int c);void GetNumber();void GetSum();private:int A,B,C;static int Sum;int Myclass:Sum=0;Myclass:Myclass(int a,int b,int c)A=a;B=b;C=c;Sum+=A+B+C;void Myclass:GetNumber()coutNumber=A,B,Cendl;void Myclass:GetSum()coutSum=Sumend
46、l;void main()Myclass M(3,7,10),N(14,9,11);M.GetNumber();N.GetNumber();M.GetSum();N.GetSum();二、静态成员函数1、作用:、作用:操作静态数据成员;操作静态数据成员;3、注意事项、注意事项静态成员函数的实现中静态成员函数的实现中不能不能直接直接引用引用本本类中的类中的非静态成员非静态成员,可以引用本可以引用本类中的类中的静态成员静态成员;静态成员函数中要静态成员函数中要引用非静态成员引用非静态成员时,可以时,可以通通过对象过对象来引用来引用;2、使用格式、使用格式(在声明成员函数前加在声明成员函数前加sta
47、tic)例如:例如:static int volume();静态成员函数和静态数据成员是类的一部分静态成员函数和静态数据成员是类的一部分;二、静态成员函数(续)例 分析下列程序的输出结果。#include class Mpublic:M(int a)A=a;B+=a;static void f1(M m);private:int A;static int B;void M:f1(M m)coutA=m.Aendl;coutB=Bendl;int M:B=0;void main()M P(5),Q(10);M:f1(P);M:f1(Q);A=5B=15A=10B=153.4友元2、友元的分类、友
48、元的分类是一种是一种定义在类外部定义在类外部的的类或类或普通函数普通函数,但需要在,但需要在类体类体内进行说明内进行说明(前面加前面加friend关键字);关键字);友元类友元类;1、使用格式、使用格式友元函数友元函数;不是成员函数,但可以不是成员函数,但可以访问访问类中的类中的私有成员私有成员;一、友元函数例 分析下列程序的输出结果。#include class Timepublic:Time(int new_hours,int new_minutes)hours=new_hours;minutes=new_minutes;friend void Time12(Time time);frie
49、nd void Time24(Time time);private:int hours,minutes;void Time12(Time time)if(time.hours12)time.hours-=12;couttime.hours:“time.minutes PMendl;else couttime.hours:“time.minutes AMendl;void Time24(Time time)couttime.hours:“time.minutesendl;void main()Time time1(20,30),time2(10,45);Time12(time1);Time24(
50、time1);Time12(time2);Time24(time2);8:30 PM20:3010:45 AM10:45友元成员函数二、友员类例分析下列程序的输出结果。#include class Xfriend class Y;public:void Set(int i)x=i;void Display()coutx=x,y=yendl;private:int x;static int y;class Ypublic:Y(int i,int j);void Display();private:X a;int X:y=1;Y:Y(int i,int j)a.x=i;X:y=j;void Y:D