书签 分享 收藏 举报 版权申诉 / 268
上传文档赚钱

类型C讲义完整版课件.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:3606305
  • 上传时间:2022-09-24
  • 格式:PPT
  • 页数:268
  • 大小:496.51KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《C讲义完整版课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

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

    特殊限制:

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

    关 键  词:
    讲义 完整版 课件
    资源描述:

    1、宁 博10变量i引用j0XEFFF21当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存贮空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。在C+中,申请和释放堆中分配的存贮空间,分别使用new和delete的两个运算符来完成,其使用的格式如下:指针变量名=new 类型名(初始化式);delete 指针名;new运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没有名字。用初

    2、始化式用初始化式(initializer)来显式初始化来显式初始化 例如:例如:int*pi=new int(0);当当pi生命周期结束时,必须释放生命周期结束时,必须释放pi所指向的目标:所指向的目标:delete pi;注意这时释放了注意这时释放了pi所指的目标的内存空间,也就是撤销了该目标,所指的目标的内存空间,也就是撤销了该目标,称动态内存释放(称动态内存释放(dynamic memory deallocation),但指针),但指针pi本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放。本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放。堆堆i用初始化式用初始化式(i

    3、nitializer)来显式初始化来显式初始化 例如:例如:int*pi=new int(0);当当pi生命周期结束时,必须释放生命周期结束时,必须释放pi所指向的目标:所指向的目标:delete pi;注意这时释放了注意这时释放了pi所指的目标的内存空间,也就是撤销了该目标,所指的目标的内存空间,也就是撤销了该目标,称动态内存释放(称动态内存释放(dynamic memory deallocation),但指针),但指针pi本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放。本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放。堆堆i对于数组进行动态分配的格式为:对于数组进行动

    4、态分配的格式为:指针变量名指针变量名=new=new 类型名类型名 下标表达式下标表达式;delete delete 指向该数组的指针变量名指向该数组的指针变量名;【例】动态数组的建立与撤销#include#include void main()int n;char*pc;cout请输入动态数组的元素个数n;pc=new charn;/strcpy(pc,堆内存的动态分配);coutpcendl;delete pc;/撤销并释放pc所指向的n个字符的内存空间return;动态分配的三个特点:首先,变量动态分配的三个特点:首先,变量n在编译时没有在编译时没有确定的值,而是在运行中输入,按运行时所

    5、需分配堆空确定的值,而是在运行中输入,按运行时所需分配堆空间,这一点是动态分配的优点,可克服数组间,这一点是动态分配的优点,可克服数组“大开小用大开小用”的弊端。的弊端。delete pc是将是将n个字符的空间释放,而用个字符的空间释放,而用delete pc则只释放了一个字符的空间;则只释放了一个字符的空间;其次如果有一个其次如果有一个char*pc1,令,令pc1=p,同样可用,同样可用delete pc1来释放该空间。尽管来释放该空间。尽管C+不对数组作边不对数组作边界检查,但在堆空间分配时,对数组分配空间大小是纪界检查,但在堆空间分配时,对数组分配空间大小是纪录在案的。录在案的。第三,

    6、没有初始化式(第三,没有初始化式(initializer),不可对数组初始),不可对数组初始化。化。指针使用的几个问题:指针使用的几个问题:动态分配失败。动态分配失败。返回一个空指针(返回一个空指针(NULL),表示),表示发生了异常,堆资源不足,分配失败。发生了异常,堆资源不足,分配失败。指针删除与堆空间释放。删除一个指针指针删除与堆空间释放。删除一个指针p(delete p;)实际意思是删除了实际意思是删除了p所指的目标(变量或对象等),释放了它所指的目标(变量或对象等),释放了它所占的堆空间,而不是删除本身,释放堆空间后,成了所占的堆空间,而不是删除本身,释放堆空间后,成了空悬指针空悬指

    7、针 内存泄漏(内存泄漏(memory leak)和重复释放)和重复释放。new与与delete 是配对使用的,是配对使用的,delete只能释放堆空间。只能释放堆空间。如果如果new返回的指针值丢失,则所分配的堆空间无返回的指针值丢失,则所分配的堆空间无法回收,称内存泄漏,同一空间重复释放也是危险法回收,称内存泄漏,同一空间重复释放也是危险的,所以必须妥善保存的,所以必须妥善保存new返回的指针,以保证不返回的指针,以保证不发生内存泄漏,也必须保证不会重复释放堆内存空发生内存泄漏,也必须保证不会重复释放堆内存空间。间。动态分配的变量或对象的生命期。动态分配的变量或对象的生命期。无名对象,它的无

    8、名对象,它的生命期并不依赖于建立它的作用域,比如在函数中生命期并不依赖于建立它的作用域,比如在函数中建立的动态对象在函数返回后仍可使用。我们也称建立的动态对象在函数返回后仍可使用。我们也称堆空间为自由空间(堆空间为自由空间(free store)就是这个原因。)就是这个原因。建立动态整型数组用户输入数组长度,并且用户输入初始化数组,求和并打印到屏幕。抽象的行为抽象的行为封装的数据成员封装的数据成员成员数据成员函数内联成员函数private可以缺省可以缺省class Watch private:int Hour=0,Minute=0,Second=0;public:void SetTime(in

    9、t NewH,int NewM,int NewS);void ShowTime();错误!必须将该构造函数变为公有成员成员初始化表#includeclass R public:R(int r1,int r2)R1=r1;R2=r2;void print();void print()const;private:int R1,R2;void R:print()coutR1:R2endl;void R:print()const coutR1;R2endl;void main()R a(5,4);a.print();/调用调用void print()const R b(20,52);b.print()

    10、;/调用调用void print()constVoid Write(int n,double val)if(a dim)xn=val;C语言的例子char*p1,*p2;p1=malloc(20);strcpy(p1,“Bin Wang”);p2=p1;Bin Wang指针p1指针p2C+的例子Class String String();String(const char*)String();private:char*str;String:String()str=0;String:String()if(str!=0)delete str;String:String(const char*s)s

    11、tr=new char strlen(s)+1;strcpy(str,s);String*s1=new String(“Bin Wang”);/String*s2=new String(s1);/调用缺省拷贝构造函数strstrBin Wangs1s2Class String String();String(const char*);String(String&);String();private:char*str;String:String()str=0;String:String()if(str!=0)delete str;String:String(const char*s)str=ne

    12、w char strlen(s)+1;strcpy(str,s);String:String(String&s)str=new char strlen(s.str)+1;strcpy(str,s.str);String*s1=new String(“Bin Wang”);String*s2=new String(s1);strstrBin Wangs1s2Bin Wang;inlineAccount:account()delete _name;游泳池过道Public:static int passmark;static int passnum;Score();Score();int Score

    13、:passmark=60;Int Score:passnum=0;void main().Void main()int Score:passmark=60;int Score:passnum=0;Static int Score:passmark=60;Static int Score:passnum=0;void main().Class Score char student20;int language;int maths;int history;Public:static int passmark=60;static int passnum=0;Score();Score();void

    14、main()cout Score:passmark endl;.void main()Score s;cout s.passmark endl;没有任何理由推荐这种调用方式,因为静态数据成员是独立于类对象的Class Score char student20;int language;int maths;int history;Public:static int passmark;static int passnum;Score()Score:passmark=60;passnum=0;Score();#include int Score:passmark=50;int Score:passn

    15、um=0;void main()cout Score:passmark endl;/输出是多少?Score s;cout s.passmark endl;/输出又是多少?cout Score:passmark endl;/输出又是多少?class Student char filename20;int age;int grade;static int total;public:void PrintInfo();static void PrintTotal();静态成员函数没有任何理由推荐这种调用方式,因为静态成员函数是独立于类对象的class A public:static void f1()

    16、;private:int x;void A:f1()cout x endl;/错误 A a;cout a.x endl;/正确 为什么?#include#include class Point public:Point(double xi,double yi)X=xi;Y=yi;double GetX()return X;double GetY()return Y;friend double Distance(Point&a,Point&b);private:double X,Y;double Distance(Point&a,Point&b)double dx=a.X-b.X;double

    17、dy=a.Y-b.Y;return sqrt(dx*dx+dy*dy);int main()Point p1(3.0,5.0),p2(4.0,6.0);double d=Distance(p1,p2);coutThe distance is dendl;return 0;class A friend class B;public:void Display()coutxendl;private:int x;class B public:void Set(int i);void Display();private:A a;void B:Set(int i)a.x=i;void B:Display(

    18、)a.Display();class Complex/复数类声明复数类声明public:Complex(double r=0.0,double i=0.0)real=r;imag=i;/构造函数构造函数void display();/显示复数的值显示复数的值private:double real;double imag;class Complex Complex operator+(const Complex&);Complex operator (const Complex&);Complex complex:operator+(const Complex&r)Complex t;t.rea

    19、l=real+r.real;t.imag=imag+r.imag;return t;Complex complex:operator+(const Complex&r)return Complex(real+r.real,imag+r.imag);可以简化为需要定义构造函数Complex(double,double)#includeclass complex/复数类声明复数类声明public:/外部接口外部接口complex(double r=0.0,double i=0.0)real=r;imag=i;/构造函数构造函数 friend complex operator+(complex c1

    20、,complex c2);friend complex operator-(complex c1,complex c2);void display();/显示复数的值显示复数的值private:/私有数据成员私有数据成员double real;double imag;工 具 车轿 车面 包 车小 汽 车卡 车旅 行 车汽汽 车车交交 通通 工工 具具猴子猴子狮子虎猎豹猫猫鸟鸟动物动物圆圆矩矩 形形几几 何何形形状状class Person public:Person();Person(Person&);Person();int Age();private:char name20;Date bi

    21、rthday;boolean sex;protected:char title10;class Student:public Person public:Student();Student(Student&);Student();private:int sno;char dept20;基类派生类class A public:int a;Private:int b;Protected:int c;class B:public A public:int d;int f()int i=a;/OKAY i=b;/incorrect i=c;/OKAY Private:int e;Protected:i

    22、nt f;void main()B bb;int j=bb.c;/incorrect j=bb.a;/okayclass Rectangle:private Location public:void InitR(int x,int y,int w,int h);void Move(int xOff,int yOff);int GetX()return Location:GetX();int GetY()return Location:GetY();int GetH()return H;int GetW()return W;private:int W,H;void Rectangle:InitR

    23、(int x,int y,int w,int h)InitL(x,y);W=w;H=h;void Rectangle:Move(int xOff,intyOff)Location:Move(xOff,yOff);int main()/通过派生类对象只能访问本类成员通过派生类对象只能访问本类成员 Rectangle rect;rect.InitR(2,3,20,10);rect.Move(3,2);/rect.Location:Move(3,2);coutrect.GetX(),rect.GetY(),rect.GetH(),rect.GetW()endl;return 0;class A pr

    24、otected:int x;int main()A a;a.X=5;/错误错误class A protected:int x;class B:public A public:void Function();void B:Function()X=5;/正确正确C c;c.b /二义性二义性c.B:b/二义性二义性c.B1:b /无二义性无二义性c.B2:b/无二义性无二义性bb1bb2dB类成员B类成员B1类成员B2类成员C类对象#includeclass Point public:Point(double i,double j)x=i;y=j;double Area()const return

    25、 0.0;private:double x,y;class Rectangle:public Point public:Rectangle(double i,double j,double k,double l);double Area()const return w*h;private:double w,h;Rectangle:Rectangle(double i,double j,double k,double l):Point(i,j)w=k;h=l;void fun(Point&s)coutArea=s.Area()endl;void main()Rectangle rec(3.0,5

    26、.2,15.0,25.0);fun(rec);运行结果:运行结果:Area=0s.Area():属于静态联编#includeclass Point public:Point(double i,double j)x=i;y=j;virtual double Area()const return 0.0;private:double x,y;class Rectangle:public Point public:Rectangle(double i,double j,double k,double l);virtual double Area()const return w*h;private:d

    27、ouble w,h;/其它函数同前例其它函数同前例void fun(Point&s)coutArea=s.Area()0 x:-x;double absolute(double x)return x 0 x:-x;float absolute(float x)return x 0 x:-x;如此下去可能会需要很多这样的函数,显得很繁琐Template 类型名 函数名(参数表)函数体的定义 Template 类型名 函数名(参数表)函数体的定义#include Template T absolute(T x)return x 0?x:-x;void main()cout “n absolute(

    28、-99)=”absolute(-99);cout “n absolute(-99.99)=”absolute(-99.99);cout “n absolute()=”absolute();Template 类型名 函数名(参数表)函数体的定义 Template 类型名 函数名(参数表)函数体的定义#include Templatevoid outputArray(const T*P_array,const int count)for(int i=0;icount;i+)count P_arrayi “”;cout endl;void main()const int aCount=8,bCoun

    29、t=8,cCount=20;int aArrayaCount=1,2,3,4,5,6,7,8;double bArray bCount =1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8;char cArray cCount =“Welcome to see you!”;cout “a Array contains;”endl;outputArray(aArray,aCount);cout “b Array contains;”endl;outputArray(bArray,bCount);cout “c Array contains;”endl;outputArray(cArr

    30、ay,cCount);运行结果:A Array contain:1 2 3 4 5 6 7 8A Array contain:1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8A Array contain:Welcom to see you!#include Template T1*add(T1 data,T2 d,int n)for(int i=0;i n;i+)datai+=d;return data;void main()float a10=1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2;add(a,1,5);for(int i=0;i 10;i

    31、+)cout “”ai;Template T absolute(T x)return x 0?X:-x;double absolute(complex cx)return sqrt(real(cx)*real(cx)+imag(cx)*imag(cx);模板函数的特例Template T max(T x,T y)return x=y?X:y;Template T max(T x,T y,T z)T w=(x=y)?X:y;return(w=z)?w”z;Template T max(T x,int n)T maxinum=x0;for(int i=0;in;i+)if(maxinum xi)m

    32、axinum=xi;return maxinum;和普通函数一样,编译器会根据参数的不同来联编 不同的模板函数8524352438243582345823458初始状态第一趟结果第二趟结果第三趟结果第四趟结果小的逐渐上升每趟沉下一个最大的Template void BubbleSort(T A,int n)int i,j;int lastExchangeIndex;i=n 1;while(i 0)lastExchangeIndex=0;for(j=0;ji;j+)if(Aj+1Aj)Swap(Aj,Aj+1);lastExchangeIndex=j;i=lastExchangeIndex;Ai

    33、局部有序jClass IntArray int*element;int n;Public:Array(int*data,int i);Array();void sort();int find(int a);int sum();Class FloatArray float*element;int n;Public:Array(float*data,int i);Array();void sort();int find(float a);float sum();Template class Array T*element;int n;Public:Array(T*data,int i);Array

    34、();void sort();int find(T a);T sum();Template T Array:sum()T s=0;for(int i=0;i n;i+)s+=elementi;return s;Array cI(Idata,10);Array cF(fData,10);#include Template class Array T*element;int n;Public:Array(T*data,int i):element(data),n(i)Array()void sort();int find(T key);T sum();Template void Array:sor

    35、t()int i,j;T d;for(i=1;i=i;i-)if(elementj-1 elementj)d=elementj-1;elementj-1=elementj;elementj=d;Template int Array:find(T key)for(int i=1;in;i+)if(elementi=key)return i;return-1;Template T Array:sum()T s=0;for(int i=0;in;i+)s+=elementi;return s;Template class Data2 T1 a;T2 b;Public:Data2(T1 x,T2 y)

    36、:a(x),b(y);Data2()void OutIt();Template void Data2:OutIt()cout “a=”a endl;cout “b=”b endl;Data2 Da(A,5.5);Template class Array T*element;int n;Public:Array(T*data,int i):element(data),n(i);Array();void sort();int find(T key);T sum();friend ostream&operator(ostream&out,Array&array);Template void Arra

    37、y:sort()int i,j;T d;for(i=1;i=i;i-)if(elementj-1 elementj)d=elementj-1;elementj-1=elementj;elementj=d;Template int Array:find(T key)for(int i=1;in;i+)if(elementi=key)return i;return-1;Template T Array:sum()T s=0;for(int i=0;in;i+)s+=elementi;return s;Template ostream&operator(ostream&out,Array&array

    38、)for(int i=0;iarray.n;i+)out “array.elementi;return out;class Array char*element;int n;Public:Array(char*data,int i):element(data),n(i);Array();void sort();int find(char*key);/T sum();friend ostream&operator(ostream&out,Array&array);void Array:sort()int i,j;char*d;for(i=1;i=i;i-)if(strcmp(elementj-1

    39、,elementj)0)d=elementj-1;elementj-1=elementj;elementj=d;int Array:find(T key)for(int i=1;in;i+)if(strcmp(elementi,key)=0)return i;return-1;Template ostream&operator(ostream&out,Array&array)for(int i=0;iarray.n;i+)out “array.elementi;return out;Const int MaxStackSize=50;Template class Stack Private:T

    40、 stackListMaxStackSize;int top;Public:Stack(void);void Push(const T&item);T Pop(void);woid ClearStack(void);T Peek(void)const;int StackEmpty(void)const;int StackFull(void)const;Template Stack:Stack(void):top(-1)Template Void Stack:Phsu(const T&item)if(top=MaxStackSize-1)std:cout“Stack overflow!n”;ex

    41、it(-1);top+;stacklisttop=item;Template T Stack:Pop(void)T temp;if(top=-1)std:cout:Attemp to pop an empty stack!N”;exit(-1);return stacklist top;Template int Stack:StackEmpty(void)const return top=-1;Template int Stack:StackFull(void)const return top=MaxStackSize-1;Template Void Stack:ClearStack(void)top=-1;

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:C讲义完整版课件.ppt
    链接地址:https://www.163wenku.com/p-3606305.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库