初学C基础知识要点

上传人:wuli****0220 文档编号:253268039 上传时间:2024-12-10 格式:PPT 页数:44 大小:208.50KB
返回 下载 相关 举报
初学C基础知识要点_第1页
第1页 / 共44页
初学C基础知识要点_第2页
第2页 / 共44页
初学C基础知识要点_第3页
第3页 / 共44页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C+程序设计,主 讲:,李晓勇,Email:,Telphone:,一、友元,1、引入理由,安全性-封装:,类的成员函数才能访问类的私有成员,其他函数不能访问私有成员的。,高效率-非封装:,(1)将数据定义成公有成员-破坏隐藏性,(2)友元函数-提高效率,破坏隐藏性,2、友元特点,(1)在类中用 friend 说明。位置任意,含义相同。,(2)友元分:,例1,在平面上计算两个点之间的距离。,假设第一个点(x1,y1),第二个点(x2,y2),-普通函数作友元函数,友元类,普通函数,成员函数,友元函数,class point /点的类,public:,point(double xx,double yy),x=xx;y=yy;,void print_xy(),cout(x,y)endl;,friend double distance(point,/友元函数在类中说明,并非定义,/可以写成:double friend distance(point a,point b);,private:,double x,y;,;,double distance(point&a,point&b)/友元函数定义,double dx=a.x-b.x;,double dy=a.y-b.y;,return sqrt(dx*dx+dy*dy);,void main(),point p1(3.0,4.0),p2(6.0,8.0);,p1.print_xy();p2.print_xy();,double s=distance(p1,p2);/普通函数方式调用,coutDistance is sendl;,class B;/,说明,class A,public:,void disp(B vb);,protected:,int x;,;,class B,public:,B(int m)y=m;,void friend A:disp(B vb),coutvb.y=vb.yendl;,protected:,int y;,;,例2,其他类的成员函数作友元函数:,void main(),A a1;,B b1(100);,a1.disp(b1);,/通过a1的成员函数,/调用b1的数据成员,/运行结果:vb.y=100,友元,例3,普通函数成为两个类的友员,class Boat;,class Car,public:,Car(int j),size=j;,friend int leisure(int time,Car /友员函数,protected:,int size;,;,class Boat,public:,Boat(int j),size=j;,friend int leisure(int time,Car/友员函数,protected:,int size;,;,int leisure(int time,Car&aobj,Boat&bobj),/友员定义,return time*aobj.size*bobj.size;,void main(),Car c1(2);,Boat b1(3);,int time=4;,coutleisure(time,c1,b1);,结论:,友元函数可以是一个普通的函数,也可以是其他类的成员函数,它不是本类的成员函数。,在友元函数中可以通过对象名访问类的私有和保护成员。,例4,类作为友元:,class y;,class x,friend class y;/类作为友元。说明位置任意,public:,void set(int i)m=i;,void set(y y1);,private:,int m;,;,class y,public:,void disp(x p),coutp.m=,p.m,4+5,函数的语义可以重新定义。,重新定义的运算符又称运算符函数。,2、目的:,使C+代码更直观、更易读。,3、哪些运算符可以重载?,可以重载:,算术运算符:,+,-,*,/,%,+,-,位操作运算符:,&,|,逻辑运算:,!,&,|,比较运算:,=,不能重载。),friend 类型 operator 运算符(参数表),例1,成员函数方式重载运算符,将数学中的复数定义成一个类,重载加法运算符,使得两个复数直接加:如 c1+c2,完成复数的实部、虚部分别相加。,如不用类、不用运算符重载,则只能用结构形式,,例,struct complex,double real;,double image;,c1,c2,c3;,c3.real=c1.real+c2.real;/设c1、c2已知,c3.image=c1.image+c2.image;,或者,cal(c1,c2,c3)-函数方式实现,用类、运算符重载方式实现,class complex,public:,complex()real=image=0;,complex(double r,double i)/构造函数,real=r;image=i;,complex operator+(const complex /重载,friend void print(const complex/输出数据,private:,double real,image;/实部,虚部,;,/函数的返回值必须是complex,complex complex:operator+(const complex&c),return complex(real+c.real,image+c.image);,void print(const complex&c)/复数格式输出,if(c.image 0),coutc.real c.image i;,else,coutc.real+c.image i;,void main(),complex c1(2.0,4.0),c2(4.0,-2.0),c3;,c3=c1+c2;/对象赋值,print(c3);/输出,运行结果:6+2i,说明,:,(1)函数的参数可以不用const,也可以不用引用。,(2)复数的减法、乘法、除法定义相似。,差别?,例2,用友元方式实现重载,class complex,public:,complex()real=image=0;,complex(double r,double i)real=r;image=i;,friend complex operator+(const complex,friend void print(complex,private:,double real,image;/实部,虚部,;,运算值类型,/友元函数的定义,complex operator+(const,complex&c1,const complex&c2),/将局部对象的值返回,return complex(c1.real+c2.real,c1.image+c2.image);,void print(complex&c),/复数格式输出,if(c.image 0)coutc.real c.image i;,elsecoutc.real+c.image i;,void main(),complex c1(2.0,3.0),c2(4.0,-2.0),c3;,c3=c1+c2;,/对象赋值,print(c3);,print(complex(2,4)+complex(1,2);,/两个常复数对象相加,说明,:,(1)函数的参数可以不用const,也可以不用引用。,(2)复数的减法、乘法、除法定义相似。,练习5.1:平面点重载+、运算符,在主函数中测试。,例3、前缀+,后缀+,()的重载,class counter,public:,counter()value=0;,counter operator +();/前缀加重载,counter operator +(int);/后缀加重载,counter operator()();/圆括号重载,void print()coutvaluevalue /类型不同,return this /指针,类型不同,(4)如没有前缀运算符重载,则前缀、后缀一样。,3、类的转换运算符,对于基本类型的数据具有强制类型转换运算;,对于类的必须自己定义强制类型转换运算符。,例,将RMB类的对象转换成double的强制运算符定义,class RMB,public:,RMB(double value=0.0);,operator double(),return(yuan+jf/100.0);/转换运算符,void display(),coutvalue=(yuan+jf/100.0)endl;,protected:,unsigned int yuan;unsigned int jf;,;,RMB:RMB(double value)/将double 转换成类的对象,yuan=value;,jf=(value-yuan)*100+0.5;/四舍五入,void main(),RMB d1(2.0),d2(1.5),d3;,double v1,v2;,v1=(double)d1;v2=(double)d2;,d3=RMB(,v1+v2);/显式转换,d3.display();,练习5.3:定义一个日期类,它有年、月、日三个属性值,重载整型强制类型转化运算符,在主函数中测试。,小结:,(1)使用运算符重载可以使程序易于对对象的操作。许多C+的运算符都可以重载,但注意不要重载违反常规的运算符。,(2)重载不能改变运算符的操作数的个数;也不能发明新的运算符。,(3)this指针指向当前的对象,是所有成员函数不可见的参数,通过它可以返回对象的值。,(4)在前增量、后增量运算符重载中,使用int 形参只是为了标志前后有别,没有其他作用。,四、静态成员,静态数据成员提出理由:,数据共享:比较全局变量,安全性 :静态变量/静态函数等,例:用链表管理学生信息,链首指针,学生信息数(结点数目),静态数据成员,静态成员函数,例1:使用静态数据成员的简单程序,class Myclass,public:,Myclass(int x,int y),a=x;b=y;,void get_num(),sum+=a+b;,void print_sum(),coutsum=sum endl;,protected:,int a,b;,static int sum;/私有静态数据成员,;,int Myclass:sum=0;/静态数据成员的初始化,void main(),Myclass m(3,5),n(10,20);输出结果:,m.get_num();,m.print_sum();,n.get_num();,m.print_sum();,n.print_sum();,sum=8,sum=38,sum=38,结论:,静态数据成员属于类,不属于类的对象。但私有静态数据成员通过成员函数访问。,说明:,1、静态数据成员在定义时前面加 static,2、初始化形式:,:=,(1)在类的外面实现,,前面不加 static;,(2)不加成员的访问权限控制符:private,public,(3)使用作用域符:,表明静态数据属于类,不属于对象。(见下例),(4)其他方式不行:,构造函数,冒号方式等。,3、静态数据成员:静态生命期,4、访问静态数据成员的格式:,:,.,静态公有数据:,class myclass,public:,static int b;/公用区,与私有区书写性质类似,myclass(int x,int y)a=x;b=b+y;,static void print(myclass&x),couta=x.a b=bendl;,protected:,int a;,;,int myclass:b=0;/初始化,void main(),myclass s1(3,4),s2(5,6);,s1.print(s1);/myclass:print(s1),cout“b
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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