C语言程序设计(第2版)课件 蔺德军17 C++基础知识_第1页
C语言程序设计(第2版)课件 蔺德军17 C++基础知识_第2页
C语言程序设计(第2版)课件 蔺德军17 C++基础知识_第3页
C语言程序设计(第2版)课件 蔺德军17 C++基础知识_第4页
C语言程序设计(第2版)课件 蔺德军17 C++基础知识_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

OOP的一个实例OOP=对象+类+继承+消息#include<iostream.h>classman{private:intage,height,weight;public:voidinit();voidgrow();intgetage();intgetweight();intgetheight();};voidman::init(){age=height=weight=0;}voidman::grow(){age++;height+=10;weight+=50;}

intman::getage(){returnage;}intman::getweight(){returnweight;}intman::getheight(){returnheight;}intmain(){inta,b,c;manzhangsan;zhangsan.init();zhangsan.grow();zhangsan.grow();zhangsan.grow();a=zhangsan.getage();b=zhangsan.getheight();c=zhangsan.getweight();cout<<"zhangsan'sage:"<<a<<"height:"<<b<<"weight:"<<c<<endl;}类的定义与实现class<类名>{

private:<私有数据或函数成员>(仅能被自己访问)public:<公有数据或函数成员>(允许被所有类访问)

protected:<保护数据或数据成员>(允许被本类或派生类访问)}函数实现:

返回类型类名::函数名(参数表){……}……构造函数、析构函数class<classname>{public:classname(参数表){……}构造函数名与类名相同,不能有任何返回类型说明(包括void),通常在此初始化对象~classnameclassname(参数表){……}析构函数名为~+类名,不能有任何返回类型说明(包括void),通常在此用delete释放内存单元}构造函数、析构函数举例#include<iostream.h>classman{private:intage;public:man();voidgrow();intgetage();~man();};man::man(){age=0;cout<<"autodowhenentered"<<endl;}

voidman::grow(){age++;}intman::getage(){returnage;}man::~man(){//disposeareaorothercout<<"doautomaticlywhenexit"<<endl;}intmain(){inta;manzhangsan;//zhangsan.man()//notpermitzhangsan.grow();zhangsan.grow();zhangsan.grow();

a=zhangsan.getage();cout<<"zhangsan'sage:"<<a<<endl;}引用引用是指给对象的地址取个别名,对引用的改动则是对目标的改动。引用不是值,不占有存储空间引用必须初始化,并且不再指向其他不同的变量#include"iostream.h"voidf(int&b){ b++;}intmain(){int*p1,*p2,i=2,&a=i;p1=&i;p2=&a;cout<<p1<<""<<p2<<endl; f(i); cout<<*p1<<","<<*p2<<endl;}内置函数inline#include<iostream.h>intmain(){inta(8),b(16),c;

inlineintmax(int,int);

c=max(a,b);cout<<”c=”<<c<<endl;}intmax(intx,inty);

{cout<<”c=”<<c<<endl;}内置函数inline实质:编译器为inline函数创建代码,在每次碰到该函数的调用都用相应的一段代码替换说明:关键字inline一般放在函数声明的前面inline放在函数定义的前面时,函数定义要在调用函数的前面限制:不能含有switch,while等复杂的结构控制语句,递归函数不能被用作inline函数函数的改进inline与宏定义宏所作的是机械代换,在参数为表达式时会产生不可预知的错误宏不能作类型检查

#definef(m)m*m

宏定义调用:f(5+5)5+5*5+5函数的改进this指针在每个对象中,都有一个自动定义的指针,指针中保存者对象本身的地址.在使用中访问本对象成员时常常省略this,但在把自身地址作为参数时就必须使用了classA{public:CBoB;//用类CB声明对象oBintage;voidfun();}voidA::fun(){cout<<age<<endl;//age相当于this->ageoB.mf(this);}函数的默认参数可以在函数声明时,对参数赋与默认值,调用没有给出实参时,就使用默认值。voiddelay(intloops=1000);voiddelay(intloops){if(loops==0)return;for(inti=0;i<loops;i++);}delay();delay(5000);函数的改进默认参数的使用说明默认参数只能在函数声明中提供若一个函数有多个默认参数,则在形参分布中从右到左逐个定义,在调用函数时,自左向右逐分配实参。默认值可以是全局变量,常量,甚至一个函数,但不能是局部变量。函数的改进分析下面语句的正确性:#include"iostream.h"intfa(inta,intb=2,intc=3,intd=4){returna+b+c+d;}//intfb(inta=1,intb=2,intc=3,intd){returna+b+c+d;}//wrongintmain(){ cout<<fa(5)<<endl; cout<<fa(5,6)<<endl;// cout<<fa(5,,7,8)<<endl;//wrong}static静态成员同一个类的不同对象所占用的空间是不同的,而静态成员则被所有对象共享.静态成员属于类而不属于对象,所以可以通过对象访问,也可以通过类名::静态成员的方法访问,访问静态成员不能使用this指针静态函数只能访问静态成员静态成员也可以用public,protected,private定义继承(封装性,继承性)现实世界中的对象都有共性如狮子,大象都属于哺乳动物都具有哺乳动物的共性,因此在定义类时,也遵循这种关系将会使定义和管理变的简单class<派生类名>:[派生方式]<基类名>[,:[派生方式]<基类名>]继承举例#include<iostream.h>classanimal{public: intweight; intgetweight();};intanimal::getweight(){ returnweight;};classelephant:publicanimal{public: intnoseLength;};classlion:publicanimal{public: intspeed;};intmain(){ elephant*e1=newelephant(); e1->weight=100; e1->noseLength=1.5; cout<<e1->getweight()<<endl;}派生后可访问性最小化原则缺省的派生方式为private派生后,原基类成员的可访问性最小化原则基类的private成员不可能被派生类或其他类访问通过public派生,原基类可访问性不变通过protected派生,原public和protected成员都变为protected成员通过private派生,原基类所有成员变为private成员友员函数类的封装性,隐藏了数据成员,保证了对象的安全,但在特殊情况下可能会带来不便为此C++提供了友员函数能象成员函数那样访问类的所有成员基类和派生类的构造函数编译器在构造寄生类对象时,先生成基类构造函数的代码,然后生成派生类构造函数的代码,调用方式有隐式和显式两种:隐式方式:派生类中没有调用语句,将执行缺省的构造函数显式方式:在派生类显式调用基类构造函数,设B是A的派生类B::B(<形式参数>):A(<参数表>)显式构造函数举例#include<iostream.h>classanimal{public: intweight; animal(intw); intgetweight();};animal::animal(intw){ this->weight=w;};intanimal::getweight(){ returnweight;};classelephant:publicanimal{public: intnoseLength; elephant(intw,intnl);};elephant::elephant(intw=0,intnl=0):animal(w){//显式调用基类构造函数

this->noseLength=nl;};intmain(){ elephante1(100,2); cout<<e1.getweight()<<endl;

}虚基类多重派生导致D中含有A的两个副本,出现编译二义性错误解决办法为采用虚基类继承方法classA{public:intn;};//去除任何一个virtual将产生编译错误。classB:publicvirtualA{public:intm;};classC:publicvirtualA{public:intl;};classD:publicB,publicC{public:inth;};intmain(){Dd1;d1.n=10;d1.m=20;d1.l=30;d1.h=40;}基类指针指向派生类对象

及虚函数基类指针可以指向子类对象,反之则错误使用虚函数可以使父类指针访问子类函数构造函数不能定义成虚函数虚函数举例#include<iostream.h>classA{public: voidshowA(){cout<<"A\n";} voidshow(){cout<<"IamA\n";} virtualvoidshowV(){cout<<"IamAV\n";}};classB:publicA{public: voidshowB(){cout<<"B\n";}; voidshow(){cout<<"IamB\n";};//形成函数覆盖

voidshowV(){cout<<"IamBV\n";}//对虚函数形成函数覆盖};intmain(){ A*b1=newB();// B*a1=newA();//wrong b1->showA();// b1->showB();//wrong b1->show();//调用基类的函数

b1->showV();//调用派生类函数

B*b2=newB(); b2->show();//调用派生类函数

b2->showV();//调用派生类函数}抽象类与纯虚函数纯虚函数:只定义函数头,不定义函数具体实现的函数称为纯虚函数声明形式:virtual<返回类型><函数名>(参数表)=0抽象类:一个类如果含有纯虚函数,或有protected访问属性的构造函数或虚构函数(因为protected属性的构造函数只能由子类调用)抽象类只能充当基类,不能用来生成对象,可以声明指针,用来指向派生类对象一个类如继承了抽象类,则必须实现基类的所有纯虚函数,或也充当抽象类.抽象类举例#include<iostream.h>classA{//抽象类public: voidshowA(){cout<<"A\n";} virtualvoidshowV()=0;//纯虚函数};classB:publicA{public: voidshowV(){cout<<"IamBV\n";}//必须形成函数覆盖};intmain(){ B*b=newB(); b->showV();}函数重载(多态性)定义一组函数名相同,功能相似,而参数不同的函数,系统根据不同参数自动选择合适的函数,这就形成了函数重载.函数重载举例#include<iostream.h>#include<string.h>#include<stdio.h>charabs(charn){cout<<"inchar"<<endl;return(n>=0?n:-n);}intabs(intn){cout<<"inint"<<endl;return(n>=0?n:-n);}longabs(longn){cout<<"inlong"<<endl;return(n>=0?n:-n);}intad(inta,intb){cout<<"+"<<endl;returna+b;}char*ad(char*a,char*b){cout<<"link"<<endl;strcat(a,b);returna;}intmain(){chara=-1;intb=-1;longc=-1L;a=abs(a);b=abs(b);

c=abs(c);charstr1[10]="abcdef",str2[10]="GHI";intt1=5,t2=3;puts(ad(str1,str2));cout<<ad(t1,t2)<<endl;}运算符重载<结果类型>operator<运算符>(<形参表>)#include<iostream.h>classComplex{public: floatr;//实部

flo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论