分享
分销 收藏 举报 申诉 / 92
播放页_导航下方通栏广告

类型C++邮电-4.ppt

  • 上传人:仙人****88
  • 文档编号:13126556
  • 上传时间:2026-01-23
  • 格式:PPT
  • 页数:92
  • 大小:774.50KB
  • 下载积分:10 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    C++ 邮电
    资源描述:
    单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,4,章 类和对象的进一步讨论,4.1,对象数组与对象指针,4.2,向函数传递对象,4.3,静态成员,4.4,友元,4.5,类的组合,4.6,共享数据的保护,4.7 C+,的多文件程序,本章主要内容,4.1,对象数组与对象指针,4.1.1,对象数组,4.1.2,对象指针,本节主要内容,4.1.1,对象数组,定义一维对象数组的格式如下,:,类名 数组名,下标表达式,;,例如,:,exam ob4;,说明:共建立了四个对象,即每一个数组元素是一个对象,(,即,ob0,、,ob1,、,ob2,、,ob3),,共调用了,4,次,构造函数。,如果类中含有带有,一个参数,的构造函数,,则定义对象数组时,可通过初始值表进行赋值。,例如,:,exam ob4=11,22,33,44;,例,4.4,用只有一个参数的构造函数给对象数组赋值。,#include,class exam,int,x;,public:,exam(int,n)x=n;,int,get_x,()return x;,;,main(),exam ob4=,11,22,33,44;,for(,int,i=0;i4;i+),cout,obi.get_x,(,),;,return 0;,通过,初始值表,给对象数组赋值,带有,一个参数,的构造函数,调用,构造函数,exam(),进行初始化,:,ob0.x=11,ob1.x=22,ob2.x=33,ob3.x=44,程序运行结果如下:,11 22 33 44,相当于以下执行了四条语句,:,cout,ob10.get_x();,cout,ob11.get_x();,cout,ob12.get_x();,cout,ob13.get_x();,例,4.4-1,用只有一个参数的构造函数给对象数组赋值。,#include,class exam,int,x;,public:,exam(int,n)x=n;,int,get_x,()return x;,;,main(),exam ob4=,exam(11),exam(22),exam(33),exam(44);,for(,int,i=0;i4;i+),cout,obi.get_x,();,return 0;,通过初始值表给对象数组赋值的,另一种方法,带有,一个参数,的构造函数,调用,构造函数,exam(),进行初始化,:,ob0.x=11,ob1.x=22,ob2.x=33,ob3.x=44,程序运行结果如下:,11 22 33 44,在设计类的构造函数时就要充分考虑到对象数组元素初始化的需要。,当各元素对象的,初值要求为不同的值时,需要定义带参数,(,无默认值,),的构造函数,,如上例。,当各个元素的,初始值为相同的值时,可以在类中定义,不带参数的构造函数或带有默认参数值的构造函数,。,#include,/,例,4.2-1,class exam,int,x;,public:,exam()x=123;,exam(int,n)x=n;,int,get_x,()return x;,;,int,main(),exam ob4=,55,66;,int,i;,for(i=0;i4;i+),cout,obi.get_x,();,return 0;,不带参数的构造函数,带,一个参数,的构造函数,运行结果如下,;,55 66 123,123,如果类中含有带有,多个参数,的构造函数,则定义对象数组时应当如何实现初始化呢?,#include,using namespace std;,class Rectangle,public:,Rectangle(int,len,=10,int,wid,=10),length=,len,;width=,wid,;,int,area()return(length,*width);,private:,int,length,width,;,;,int,main(),Rectangle,rec3=,Rectangle(10,20),Rectangle(30,40),Rectangle(50,60);,cout,The area of rec0 is,rec0.area(),endl,;,cout,The area of rec1 is,rec1.area(),endl,;,cout,The area of rec2 is,rec2.area(),endl,;,return 0;,例,4.3,用带有多个参数的构造函数给对象数组赋值,rec0.length=10,rec0.width=20,程序运行结果如下,:,The area of rec0 is 200,The area of rec1 is 1200,The area of rec2 is 3000,rec1.length=30,rec1.width=40,rec2.length=50,rec2.width=60,4.1.2,对象指针,对象指针就是用于存放对象地址的指针变量。,声明对象指针的一般语法形式为,:,例如,:,exe*p;,/,定义,类,exe,的对象指针变量,P,类名*对象指针名,;,1.,用对象指针访问单个对象成员,class,Rectangle,.,;,int,main(),Rectangle,rec,;/,定义类,Rectangle,的对象,rec,Rectangle*pr;/,定义,pr,为指向类,Rectangle,的对象指针变量,pr=&,rec,;,.,将对象,rec,的起始地址赋给,pr,#include/,例,4.4,对象指针的使用。,using namespace std;,class Rectangle,public:,void,setRec(int,len,int,wid,),length=,len,;width=,wid,;,void,disp,(),cout,length width,disp,();,return 0;,调用对象,rec,中的函数,setRec,调用,pr,所指向的对象,rec,中的函数,disp,用,对象指针,访问对象成员时,不能用“,.”,操作符,而应使用“,-,”,操作符,程序的运行结果如下,:,20 30,2.,用对象指针访问对象数组,Rectangle*pr;/,定义指向类,Rectangle,的对象指针变量,pr,Rectangle rec2 /,定义类,Rectangle,的对象数组,rec,pr=,rec,;/,把对象数组,rec,的第,1,个元素,rec0,的地址,/,赋给对象指针,pr,。,#include,using namespace std;,class Rectangle,public:,void,setRec(int,len,int,wid,),length=,len,;width=,wid,;,void,disp,(),cout,length width,disp,();,pr+;/,对象指针变量,pr,加,1,pr-,disp,();return 0;,调用元素,rec0,的成员函数,setRec,程序运行结果为,:,20 30,40 60,调用元素,rec1,的成员函数,setRec,调用,pr,所指向的对象数组,rec,中第,1,个元素的函数,disp,即,rec0.disp(),调用,pr,所指向的对象,rec,数组中第,2,个元素的函数,disp,即,rec1.disp,将例,4.4,的主函数,main,改写为,:,4.2,向函数传递对象,4.2.1,使用对象作为函数参数,4.2.2,使用对象指针作为函数参数,4.2.3,使用对象引用作为函数参数,本节主要内容,#include,void,swap(,int,m,int,n,),int,temp,;,temp=m,;,m=n,;,n=temp,;,main(),int,a=5,b=10,;,cout,a=,a,b=,b,endl,;,swap(a,b),;,cout,a=,a,b=,b,endl,;,return 0,;,用,变量,做函数参数,注意调用方法,运行结果:,a,和,b,的值未互换,a=5,b=10,传值调用,#include,void,swap(,int,*,m,int,*n,),int,temp,;,temp=*m,;*,m=*n,;*,n=temp,;,main(),int,a=5,b=10,;,cout,a=,a,b=,b,endl,;,swap(&a,&b),;,cout,a=,a,b=,b,endl,;,return 0,;,用,变量,指针,做函数参数,注意调用方法,运行结果:,a,和,b,的值互换,a=10,b=5,传址调用,#include,void,swap(,int,&,m,int,&n,),int,temp,;,temp=m,;,m=n,;,n=temp,;,main(),int,a=5,b=10,;,cout,a=,a,b=,b,endl,;,swap(a,b),;,cout,a=,a,b=,b,endl,;,return 0,;,用,变量的,引用,做函数参数,注意调用方法,运行结果:,a,和,b,的值互换,a=10,b=5,传址调用,#include,class op,int,x,y,;,public:,op(int,i,int,j)x=,i;y,=j;,int,getx,()return x;,int,gety,()return y;,void,swap(op,ob),int,temp;temp=,ob.x,;,ob.x,=,ob.y,;,ob.y,=temp;,;,int,main(),op obj(5,10);,cout,x=,obj.getx,()y=,obj.gety,(),endl,;,obj.swap(obj,);,cout,x=,obj.getx,()y=,obj.gety,(),endl,;,return 0;,传值调用,函数中对,形参对象成员,的任何修改均不影响调用该函数的,实参对象,本身,使用对象作为函数参数,运行结果,:,x=5 y=10,x=5 y=10,a,和,b,的值未互换,4.2.1,使用,对象,作为函数参数,#include,class op,int,x,y,;,public:,op(int,i,int,j)x,=,i;y,=j;,int,getx()return,x;,int,gety()return,y;,void,swap(op,*ob),int,temp;temp,=ob-,x;ob,-x=ob-,y;ob,-y=temp;,;,int,main(),op obj(5,10);,cout,x=,obj.getx,()y=,obj.gety,(),endl,;,obj.swap(&obj,);,cout,x=,obj.getx,()y=,obj.gety,(),endl,;,return 0;,传址调用,函数中对,形参对象成员,的任何修改均影响调用该函数的,实参对象,本身。,使用对象指针作为函数参数,运行结果,:,x=5 y=10,x=10 y=5,a,和,b,的值互换,4.2.2,使用,对象指针,作为函数参数,#include,class op,int,x,y,;,public:,op(int,i,int,j)x,=,i;y,=j;,int,getx()return,x;,int,gety()return,y;,void,swap(op,&ob),int,temp;temp=,ob.x,;,ob.x,=,ob.y,;,ob.y,=temp;,;,int,main(),op obj(5,10);,cout,x=,obj.getx,()y=,obj.gety,(),endl,;,obj.swap(obj,);,cout,x=,obj.getx,()y=,obj.gety,(),endl,;,return 0;,可见,,使用,对象引用,作为函数参数,不但具有用对象指针作函数参数的优点,而且用对象引用作函数参数将更简单、更直接,。,使用对象引用作为函数参数,运行结果,:,x=5 y=10,x=10 y=5,a,和,b,的值互换,传址调用,函数中对,形参对象成员,的任何修改均影响调用该函数的,实参对象,本身。,4.2.3,使用,对象引用,作为函数参数,4.3,静态成员,4.3.1,静态数据成员,4.3.2,静态成员函数,本节主要内容,4.3.1,静态数据成员,引例,:,在类,Student,中,声明数据成员,count,,希望每定义一个对象,count,加,1,,从而达到统计学生的总数的目的。,#include,class Student,int,count,;,public:,Student()count+;,void print(),/,成员函数,显示当前学生数,cout,count=count,endl,;,;,main(),int,count=0;,Student Stu1;,/,定义第,1,个学生对象,Stu1,第,1,次调用构造函数,Student Stu2;,/,定义第,2,个学生对象,Stu2,第,2,次调用构造函数,Stu1.print();,Stu2.print();,return 0;,声明数据成员,count,,表示学生数,用于统计学生的总数,构造函数,希望每定义一个学生对象,学生数,count,加,1,希望打印的结果为:,count=2,count=2,实际打印的结果为:,count=-858993459,count=-858993459,#include,class Student,int,count,;,public:,Student()count+;,void print(),/,成员函数,显示当前学生数,cout,count=count,endl,;,;,main(),int,count=0;,Student Stu1;,/,定义第,1,个学生对象,Stu1,第,1,次调用构造函数,Student Stu2;,/,定义第,2,个学生对象,Stu2,第,2,次调用构造函数,Stu1.print();,Stu2.print();,return 0;,Stu1.count,二者是独立的,互不相干,Stu2.count,出现错误的,原因是,:,一个学生对象的,count,仅仅属于这个学生对象,而不是所有学生对象所共享的,因此,count,不能表示所有学生的总人数。,#include,class Student,int,count,;,public:,Student()count+;,void print(),/,成员函数,显示当前学生数,cout,count=count,endl,;,;,main(),int,count=0;,Student Stu1;,/,定义第,1,个学生对象,Stu1,第,1,次调用构造函数,Student Stu2;,/,定义第,2,个学生对象,Stu2,第,2,次调用构造函数,Stu1.print();,Stu2.print();,return 0;,count,Stu1.count,三者是独立的,互不相干,Stu2,count,解决办法:,为了实现同一个类的多个对象之间的数据共享,C+,提出了,静态数据成员,的概念。,4.3.1,静态数据成员,在一个类中,将一个数据成员说明为,static,,,这种成员称为,静态数据成员,。,与一般的数据成员不同,无论建立多少个类的对象,都只有一个静态数据成员的拷贝,。从而实现了同一个类的不同对象之间的数据共享。,定义静态数据成员的格式如下,:,static,数据类型 数据成员名,;,#include,class Student,static,int,count;,public:,Student()count+;,void print(),cout,count=count,endl,;,;,int,Student:count,=0;,/,给静态数据成员,count,赋初值,int,main(),Student Stu1;,/,定义第,1,个学生对象,Stu1,第,1,次调用构造函数,Student Stu2;,/,定义第,2,个学生对象,Stu1,第,2,次调用构造函数,Stu1.print();,Stu2.print();,return 0;,声明,静态数据成员,count,,被所有的对象共享,用于统计学生的总数,构造函数,每创建一个学生对象,学生数,count,加,1,打印结果为:,count=2,count=2,说明:,(1),静态数据成员属于类,(,准确地说,是属于类中一个对象集合,),,而不像普通数据成员那样属于某一对象,因此可以使用“类名”访问静态的数据成员。用类名访问静态数据成员的格式如下,:,类名,:,静态数据成员名,例如上面例子中:,Student:count,(2),静态数据成员初始化应在类外单独进行,而且应在定义对象之前进行。一般在主函数,main,之前,类声明之后的特殊地带为它提供定义和初始化。,例如上例:,#include,class Student,static,int,count;,.,;,int,Student:count,=0;,int,main(),.,给静态数据成员,count,赋初值,静态数据成员初始化的格式如下,:,数据类型 类名,:,静态数据成员名,=,初始值,;,例如:,int,Student:count,=0;,如果末对静态数据成员赋初值,则编译系统会自动赋予初值,0,。,例如:,int,Student:count;,等价于,int,Student:count=0;,(3),公有静态数据成员,可以在对象定义之前被访问,。,一般格式,:,类名,:,静态数据成员名,例如:,Student:count=50;,(4),对象定义后,公有的静态数据成员,也可以通过对象进行访问。,一般格式,:,对象,.,静态数据成员名,对象指针,-,静态数据成员名,例如:,cout,Stu1.count;,例,4.10_1,公有静态数据成员的访问。,#include,using namespace std;,class,myclass,public:,static,int,i;,;,int,myclass:i,=0,main(),myclass:i,=200,myclass,ob1,ob2;,cout,ob1.i=,ob1.i,endl,;,cout,ob2.i=,ob2.i,endl,;,ob1.i,=300;,cout,ob1.i=,ob1.i,endl,;,cout,ob2.i=,ob2.i,静态成员函数名,(,实参表,),例,4.11,用静态成员函数访问静态数据成员。,#include,#include,using namespace std;,class Student,private:,string name;/,非静态数据成员,用于表示学生姓名,float score;/,非静态数据成员,用于表示学生成绩,static,int,count;/,静态数据成员,用于统计学生人数,static,float sum;/,静态数据成员,用于统计累加成绩,static,float,ave,;/,静态数据成员,用于统计平均成绩,public:,Student(string,name1,float score1);,void show();/,普通成员函数,输出姓名、学号和成绩,static void,show_count_sum_ave,();/,静态成员函数,;,/,输出学生人数和累加成绩和平均成绩,Student:Student(string,name1,float score1),name=name1;score=score1;,+count;/,累加学生人数,sum=,sum+score,;/,累加成绩,ave,=sum/count;/,计算平均成绩,void,Student:show,(),cout,姓名,:name,endl;cout,成绩,:score,endl,;,void,Student:show_count_sum_ave,()/,静态成员函数,cout,学生人数,:count,endl,;/,输出静态数据成员,count,cout,累加成绩,:sum,endl,;/,输出静态数据成员,sum,cout,平均成绩,:,ave,endl,;/,输出静态数据成员,ave,int,Student:count,=0;float,Student:sum,=0.0;,float,Student:ave,=0.0;,int,main(),Student stu1(Liming,90);,stu1.show();,Student:show_count_sum_ave,();,return 0;,使用类名访问静态成员函数,也可以使用对象名,stu1,访问静态成员函数,运行结果如下,:,姓名,:Liming,成绩,:90,学生人数,:1,累加成绩,:90,平均成绩,:90,说明,:,(1),一般情况下,静态函数成员主要用来访问静态数据成员。当它与静态数据成员一起使用时,达到了对同一个类中对象之间共享数据的目的。,(2),静态成员函数一般为,公有的,,,私有静态成员函数不能被类外部的函数和对象访问。,(3),使用静态成员函数的一个原因是,可以在建立任何对象之前调用静态成员函数,以处理静态数据成员,这是普通成员函数不能实现的功能。例如:,int,main(),Student:show_count_sum_ave,();,Student stu1(Liming,90);,.,return 0;,可以在建立任何对象之前调用静态成员函数,(4),编译系统将静态成员函数限定为内部连接,也就是说,与现行文件相连接的其他文件中的同名函数不会与该函数发生冲突,维护了该函数使用的安全性,这是使用静态成员函数的另一个原因。,(5),静态成员函数是类的一部分,。如果要在类外调用公有的静态成员函数,使用如下格式较好,:,类名静态成员函数名,(),如上例中的,:,Student:show_count_sum_ave,();,当然,如果已经定义了这个类的对象,(,例如,stu1),使用以下语句也是正确的,:,stu1.show_count_sum_ave();,(6),一般而言,,静态成员函数,不访问类中的,非静态成员,非静态成员由普通成员函数访问。,例如,4.11,中 函数,show(),void,Student:show,(),cout,姓名,:name,endl,;,cout,成绩,:score,endl,;,非静态成员,非静态成员,(7),若,静态成员函数需要访问,非静态成员,,静态成员函数只能通过,对象名,(,对象指针或引用,),访问该对象的非静态成员。,如把,show(),函数定义为静态成员函数,:,void,Student:show(Student,&,stu,),cout,姓名,:,stu.name,endlcout,成绩,:,stu.score,endl,;,对象的引用,输出非静态数据成员,name,输出非静态数据成员,score,例,4.12,用静态成员函数访问非静态数据成员。,#include,#include,using namespace std;,class Student,private:,string name;/,非静态数据成员,用于表示学生姓名,float score;/,非静态数据成员,用于表示学生成绩,static,int,count;/,静态数据成员,用于统计学生人数,static float sum;/,静态数据成员,用于统计累加成绩,static float,ave,;/,静态数据成员,用于统计平均成绩,public:,Student(string,name1,float score1);,static void,show(Student,&,stu,);/,静态成员函数,/,输出非静态数据成员,函数参数为对象的引用,static void,show_count_sum_ave,();/,静态成员函数,/,输出学生人数和累加成绩和平均成绩,;,Student:Student(string,name1,float score1),name=name1;score=score1;,+count;,/,累加学生人数,sum=,sum+score,;/,累加成绩,ave,=sum/count;/,计算平均成绩,void,Student:show(Student,&,stu,)/,静态成员函数,cout,姓名,:,stu.name,endl,;/,输出非静态数据成员,name,cout,成绩,:,stu.score,endl,;/,输出非静态数据成员,score,void,Student:show_count_sum_ave,()/,静态成员函数,cout,学生人数,:count,endl,;/,输出静态数据成员,count,cout,累加成绩,:sum,endl,;/,输出静态数据成员,sum,cout,平均成绩,:,ave,endl,;/,输出静态数据成员,ave,int,Student:count,=0;float,Student:sum,=0.0;,float,Student:ave,=0.0;,int,main()Student stu1(Liming,90);,Student:show(stu1);,Student:show_count_sum_ave,();,return 0;,使用类名访问静态成员函数,输出非静态数据成员,;,也可以使用对象名,stu1,访问静态成员函数,运行结果如下,:,姓名,:Liming,成绩,:90,学生人数,:1,累加成绩,:90,平均成绩,:90,4.4,友 元,4.4.1,友元函数,4.4.2,友元类,本节主要内容,#include,using namespace std;,class Date,public:,Date(int,y,int,m,int,d);,private:,int,year;,/,私有数据成员,int,month;,/,私有数据成员,int,day;,;,/,私有数据成员,Date:Date(int,y,int,m,int,d),year=,y;month,=,m;day,=d;,void,showDate(Date,&d),cout,d.year,.,d.month,.,d.day,endl,;,int,main(),Date date1(2010,11,14);,showDate(date1);,return 0;,出错原因,:,普通的函数,不能访问对象的私有成员,编译时,本例将出现错误,解决办法:,1.,将函数,disp,说明为,成员函数,,就能访问对象的私有成员。,2.,将函数,disp,说明为,友元函数,,也能访问对象的私有成员。,友元函数的,引例,4.4.1,友元函数,友元函数,不是当前类的成员函数,但它可以访问该类所有的成员,包括私有成员、保护成员和公有成员。,在类中声明友元函数时,需在其函数名前加上关键字,friend,。,友元函数既可以,是非成员函数,也可以是,另一个类的成员函数,。,#include,using namespace std;,class Date,public:,Date(int,y,int,m,int,d);/,构造函数,friend void,showDate(Date,private:,int,year;,int,month;,int,day;,;,Date:Date(int,y,int,m,int,d),year=,y;month,=,m;day,=d;,void,showDate(Date,&d),cout,d.year,.,d.month,.,d.day,endl,;,int,main(),Date date1(2010,11,14);,showDate(date1);,return 0;,在函数名前,加上关键字,friend,,声明函数,showDate,为类,Date,的友元函数,程序运行结果如下,:,2010,11,14,1.,将,非成员函数,声明为友元函数,定义友元函数,形参是类,Date,的对象的引用,在此函数名前,不要加关键字,friend,也不要加“类名,:”,调用友元函数,showDate,实参,date1,是类,Date,的对象,说明:,(1),友元函数的声明可以放在,公有部分,也可以放在,保护部分和私有部分,。,(2),友元函数不是成员函数。因此,在类的外部定义友元函数时,,不必像成员函数那样,在函数名前加上“类名”,。,class Date,public:,.,friend void,showDate(Date,private:,int,year;,int,month;,int,day;,;,.,void,showDate(,Date,&,d,),cout,d.year,.,d.month,.,d.day,endl,;,int,main(),Date date1(2010,11,14);,showDate(date1);,return 0;,声明友元函数时,在函数名前加上关键字,friend,在类外定义时,不必加“类名”,友元函数的声明可以放在,公有部分,也可以放在,保护部分和私有部分,class Date,public:,.,friend void,showDate(Date,private:,int,year;,int,month;,int,day;,;,.,void,showDate(,Date,&d,),cout,d.year,.,d.month,.,d.day,endl,;,int,main(),Date date1(2010,11,14);,showDate(date1);,return 0;,(3),因为友元函数不是类的成员,所以它不能直接调用对象成员,,它,必须通过,对象,(,对象指针或对象引用,),作为入口参数,来调用该对象的成员。,date1,.,year,date1,.,month,date1,.,day,class Time /,声明类,Time,.,friend void,showDate_Time,(Date,&,d,Time,.,;,class Date /,声明类,Date,.,friend void,showDate_Time,(Date,&,d,Time,.,;,定义函数,showDate_Time,是,类,Time,和,类,Date,的友元函数,(4),一个函数可以是多个类的友元函数,。当一个函数需要访问多个类时,友元函数非常有用。,#include,using namespace std;,class Date;/,对,Date,类的提前引用声明,class Time,/,声明类,Boy,public:,Time(int,h,int,m,int,s,)/,定义构造函数,hour=h;minute=m;sec=s;,friend void,showDate_Time,(Date,&,d,Time,private:,int,hour;,int,minute;,int,sec;,;,class Date/,声明类,Date,public:,Date(int,y,int,m,int,d,)/,定义构造函数,year=y;month=m;day=d;,friend void,showDate_Time,(Date,&,d,Time,private:,int,year;,int,month;,int,day;,;,声明函数,showDate_Time,为类,Time,的友元函数,声明函数,showDate_Time,为类,Date,的友元函数,例,4.13-1,一个函数同时定义为两个类的友元函数,。,void,showDate_Time,(,Date&,d,Time,&t,),cout,d.year,.,d.month,.,d.day,endl,;,cout,t.hour,:,t.minute,:,t.sec,endl,;,int,main(),Date date1(2010,11,14);/,定义,Date,类对象,date1,Time time1(6,12,18);/,定义,Time,类对象,time1,showDate_Time,(,date1,time1,);,return 0;,定义函数,showDate_Time,为类,Date,和,Time,的友元函数,形参为,d,和,t,分别是类,Date,和类,Time,的对象的引用,程序的运行结果如下,:,2010.11.14,6:12:18,调用友元函数,howDate_Time,实参是类,Date,的对象,date1,和类,Time,的对象,time1,(1),声明了一个类的友元函数,就可以用这个函数直接访问该类的私有数据,从而,提高了程序运行的效率,。,(2),友元,提供了,不同类的成员函数之间、类的成员函数与一般函数之间进行,数据共享的机制,。尤其 当一个函数需要访问多个类时,友元函数非常有用。,(,3),引入友元机制的另一个原因是,方便编程,在某些情况下,如,运算符被重载时,需要用到友元函数,这方面内容将在第,7,章中介绍,。,破坏了数据的隐蔽性和类的封装性,降低了程序的可维护性,这与面向对象的程序设计思想是背道而驰的。,因此使用友元函数应谨慎。,在,C+,中为什么要引入友元机制呢?,友元函数的不足之处:,2.,将,成员函数,声明为友元函数,一个类的成员函数也可以作为另一个类的友元,这种成员函数称为,友元成员函数,。,友元成员函数不仅可以访问自己所在类对象中的私有成员和公有成员,还可以访问,friend,声明语句所在类对象中的所有成员,这样能使两个类相互合作、协调工作,完成某一任务。,class Time /,声明类,Boy,.,void,showDate_Time,(Date,.,;,class Date /,声明类,Date,.,friend void,Time:,showDate_Time,(Date,.,;,函数,showDate_Time,为类,Time,的成员函数,也是类,Date,的友元函数,函数,showDate_Time,不仅可以作为,成员函数,访问,类,Time,中的私有成员和公有成员,,还可以作为,友元函数,访问,类,Date,中的私有成员和公有成员,,这样能使两个类相互合作、协调工作,完成某一任务。,#include,using namespace std;,class Date;/,对,Date,类的提前引用声明,class Time /,声明类,Time,public:,Time(,int,h,int,m,int,s)/,定义构造函数,hour=h;minute=m;sec=s;,void,showDate_Time(Date,private:,int,hour;,int,minute;,int,sec;,;,class Date/,声明类,Date,public:,Date(int,y,int,m,int,d)/,定义构造函数,year=y;month=m;day=d;,friend void,Time:showDate_Time(Date,private:,int,year;,int,month;,int,day;,;,声明函数,showDate_Time,为类,Time,的成员函数,也是类,Date,的友元函数,例,4.14,一个类的,成员函数,也可以作为另一个类的友元,函数,void,Time:showDate_Time,(,Date&d,),cout,d.year,.,d.month,.,d.day,endl,;,cout,hour,:,minute,:,
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:C++邮电-4.ppt
    链接地址:https://www.zixin.com.cn/doc/13126556.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork