c期末考试重点.pdf

上传人:奔*** 文档编号:90899113 上传时间:2023-05-18 格式:PDF 页数:20 大小:1.92MB
返回 下载 相关 举报
c期末考试重点.pdf_第1页
第1页 / 共20页
c期末考试重点.pdf_第2页
第2页 / 共20页
点击查看更多>>
资源描述

《c期末考试重点.pdf》由会员分享,可在线阅读,更多相关《c期末考试重点.pdf(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、类1.类的定义:C la s s类名(数据成员;Public:成员函数声明;);成员函数定义(一定要加作用域void类名:函数参数”)例 如:class Tdate 类的定义Int year,mouth,day;Public:Void set(int y,int m,int d);Bool isLeapYear();Void print(););类结束一定要加分号Void Date:set(int y,int m,int d)成员函数的实现Yeat=y;mouth=m;day=d;Int main()Date d;定义对象d.set(2000,12,6)成员函数的调用(点的方式调用,因为成员函

2、数从属于类)类函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义之前,否则编译时会出错。虽然函数在类的外部定义,但在调用成员函数时会根据在类中声明的函数原型找到函数的定义(函 数 代 码),从而执行该函数。注 意:在类体中不允许对所定义的数据成员进行初始化。2,对象(是类的变量)Data d;/定义对象时后面什么都不带时就调用默认构造函数d.pritnO;类对象调用方式d为对象,拥有操作的数据实体3.对象指针例 如:date*p;p-print();对象指针间接调用方式(*p).print();一定要加括号否则会出错 对象数组定 义:类名对象数组名20;Date po

3、ints20;对象数组的每一个元素都是一个对象,有多少个对象就调用多少个析构函数4、构造函数构造函数的作用:定义函数时初始化对象注 意:默认构造函数和函数重载不能同时使用析构函数特点:无返回值,无形参,函数名为类名调 用:自动调用必需使用构造函数的情况:1、当对象有多种初始化时,就需要重载2、当类的成员是指针同时涉及分配空间(此情况一定要写析构函数)3、当类中有子对象,常数据成员4、当该类是派生类三种构造函数:1、默认构造函数形 式:类 名()/data()没有返回值,函数名是类名,没有形参*系统自带默认构造函数,当定义了一个默认构造函数之后,系统定义的构造函数将被覆盖。如果手工定义了无参构造

4、函数,或者其他的任 构造函数,则系统不再提供默认的无参构造函数。P3022、带形参的构造函数形 式:类 名(形 参)data(int n)没有返回值类型,函数名是类名,有形参,可重载运 用:Eg:student(string n=no name“JntssID=O):id(ssID),name(n)/id(ssID)对其他类进行初始化P306Eg:Class A0;Class B0;Class CA a;Bb;PublicC(int x,int y):b(X),a(y);Int main()(C c(15,9);)A先定义,B先构造。调用时定义顺序说了算,构造对象说了不算3、带拷贝构造函数形

5、式:类 名(类名&对 象)/person(person$s)调 用:person pl(jone);浅拷贝:就比如像引用类型,是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(即名称不同),对其中任何一个对像的改变,都会影响另一个对象。深 拷 贝:就比如值类型,源对象与拷贝对象相互独立,其中任何一个对象的改变都不会对另一个对象造成影响。所 以,深拷贝还需要做动态内存分配。9、析构函数形 式:类 名();A()函数名:A功 能:释放对象空间顺 序:先定义的后析构有一个析构函数必需写析构函数的情况:当类的成员是指针变量时,需要动态申请空间时注 意:析构函数和拷贝构造函数成对出现。析构函数的形

6、式是唯一的,没有重载的析构函数,一个类中只有一个析构函数Eg:class APublic:A()cout;A()cout-A;)4.常成员函数(const)运 用:只对对象进行读操作形 式:void data:print()const;定义成员函数,只能调用,不能修改const int a=10;定义常量,a的值不能修改调 用:void print()const;void printQ;data tl;const data t2;tl.printO;I I先调用无const函数t2.print()常对象只能调用常成员函数5.重载成员函数说 明:成员函数与普通函数一样,可以重载要 求:函数名相同

7、,形参个数类型或顺序不同。与返回值无关Const可作为函数重载的条件 构造函数重载的定义:在一个类中可以定义多个构造函数,以便提供不同的初始化的方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类型不相同。这称为构造函数的重载。例 如:#include using namespace std;class Box(public:Box();声明一个无参的构造函数声明一个有参的构造函数,用参数的初始化表对数据成员初始化Box(int h,intw,intlen):height(h),width(w),length(len)int volume();private:int heigh

8、t;int width;int length;);Box:Box()定义一个无参的构造函数(height=10;width=10;length=10;)int Box:volume()return(height*width*length);)int main()(Box boxl;建立对象boxl,不指定实参coutThe volume of boxl is boxl.volume()endl;Box box2(15,30,25);/健 立 对 象box2,指 定3个实参coutThe volume of box2 is box2.volume()endl;return 0;关于构造函数的重载

9、的几点说明:调用构造函数时不必给出实参的构造函数,称为默认构造函数。显 然,无参的构造函数属于默认构造函数。一个类只能有一个默认构造函数。如果在建立对象时选用的是无参构造函数,应注意正确书写定义对象的语句。尽管在一个类中可以包含多个构造函数,但是对于每一个对象来 说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。6.操作符重载 普通的运算符不能直接在新定义的类中实现运算,这就需要在类体内重载运算符形 式:类 名:opreator符号(形参)f f i g:1.不能重载的符号:双目运算:三目运算符:?:,sizeof,typeof2.优先级和结合性不变3.操作个数不变Poinrop

10、erator+(point a,point b);错误,+只能作用在一个变量上函数名为:operator+4.只能用成员形式:5.只能用友元形式:输入,输出符号 例 子:重 载 运 算 符,使之能用于两个复数相加。#include using namespace std;class Complex(public:Complex()real=0;imag=0;Complex(double cdoublei)real=r;imag=i;Complex operator+(Complex&c2);声明重载运算符的函数void display();private:double real;double

11、imag;);Complex Complex:operator+(Complex&c2)定义重载运算符的函数(Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;return c;void Complex:display()(cout(nreal,imagwi)endl;int main()(Complex cl(3,4),c2(5,-10),c3;c3=cl+c2;运算符+用于复数运算cout cl=;cl.display();coutc2=;c2.display();coutcl+c2=;c3.display();return 0;)运行结果

12、:cl=(3+4i)c2=(5-10i)cl+c2=(8,-6i)友元函数的关键词是friend。举个例子就是:class Apublic:A():a;public:int a;friend class B;);class B然后B里面可以直接使用A类里面的元素,但是A不能使用B的元素哦。);7.静态成员 静态数据成员,声明时在前加上static关键字。和其他数据成员一样,静态数据成员也遵循public,protected,private 访问规则。静态数据成员的特点:实际上是类域中的全局变量、被类的所有对象所共享(包括该类派生类的对象).静态数据成员的初始化只能在类体外写。注 意:作用域写在

13、函数名之前,返回值之后。静态成员函数形 式:作用域:函数所在类所有对象共享成员,保留当前值,静态对象成员只创建一次静态成员没有this指针,所以不能直接访问非静态成员,可以直接访问静态成员。若要访问非静态成员需要制定对象例 如:Int Data:a=0;静态成员在类外分配空间和初始化Date r;Void print(date r)(Couta;接访问Coutr.b;间接访问)总 之:不管是静态函数还是静态数据成员,都是该类的所有对象共享的成员。10、类中的特殊成员(this、static,const)子 对 象:驻留在另一个对象中的对象,在一个类的定义中,声明另一个类的对象来作为成员变量。如

14、:class Apublic:.private:.;class Bpublic:.private:A a;.;其中,B 类中成员 a 就是子对象,它是A类的对象作为B类的成员。在类中出现了子对象或称对象成员时,该类的构造区数要包含对子对象的初始化,通常采用成员初始化表的方法来初始化子对象。在成员初始化表中包含对子对象的初始化和对类中其他成员的初始化。下面举一例子说明成员初始化的构造。class A(private:A a;file:子对象int b;public:A(int i,int j)Al=i;A2=j;void print()coutprivate:int A l,A2;);class

15、 B(public:B(int i,intj,int k):a(i,j),b(k)void printQ;);void B:print()(a.print();cout)void main()(Bb(6,7,8);b.printQ;)该程序的输出结果为:6,7 ,8其中,a(i,j),b(k)是成员初始化表,它有二项,前一项是给子对象a初始化,其格式如下:子对象名(参数表)后一项是给类B的数据成员b初始化.这一项也可以写在构造国数的函数体内,使用赋值表达式语句b=k;给类B的数据成员初始化。this:是对象访问成员的指针。是对象的指针访问成员的指针。1 1,友元 友元可以是一个函数,该函数被称

16、为友元函数;友元也可以是一个类,该类被称为友元类。问题的提出:我们已知道类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但 是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。#inc

17、lude#includeUsing namespace std;class Point(public:Point(double xx,double yy)(X=XX;y=yy;);void GetxyO;friend double Distance(Point&a,Point&b);private:double x,y;);void Point:Getxy()(cout (x /y )endl;)Double Distance(Point&a,Point&b)(Double dx=a.x-b.x;Double dy=a.y-b.y;return sqrt(dx*dx+dy*dy);)Int m

18、ain(void)(Point pl(3.0,4.0),p2(6.0,8.0);pl.GetxyQ;p2.Getxy();double d=Distance(pl,p2);cout Distance is d month=mn;(*this).month=mn;这三句是等价的)this只能在成员函数中使用。全局函数,静态函数都不能使用this.什 么 是const?常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。特点:const只修饰其后的变量至于const放在类型前还是类型后并没有区别。如:const int a和int consta都是修饰a为const

19、,注意*不是一种类型,如果*pType之前是某类型,那么pType是指向该类型的指针一个简单的判断方法:指针运算符*,是从右到左,那么如:char const*pContent,可以理解为char const(*pContent),即*pContent 为 const,而 pContent 则是可变的。静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。定义静态全局变量还有以下好处:静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突;12、引用 定 义:int a;int&ra=a;此处一定要做初始化,此处的&不是取地址,而是别名标

20、记说明ra就是a,a就是ra0 使 用:ra=50;相当于a=50;引用规则:引用一旦被初始化,就不能再作为其他对象的引用;引用在定义的同时必须初始化(int&ra=a;);引用类型和变量类型一定相同;引用初始化和引用赋值完全不同(int%ra=a;引用初始化r=15;引用赋值);引用于变量等价,不分彼此。Int*pl=&ra;int*p2=&a;/p l指向ra,p2指向a,本质上都是指向一个东西。13、继承 定 义:继承是指一个对象直接使用另一对象的属性和方法。说 明:1、通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成

21、员.我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。2、在C+语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。单继承的定义格式如下:1 class(派生类名 :2(3 派生类新定义成员4 1;多继承的定义格式如下:1 class,继承方式2,.23(45 派生类新定义成员67;可 见,多继承与单继承的区别从定义格式上看,主要是多继承的基类多于一个。多继承的二义性:class Apublic:void f();)class Bpublic:void f();void g(

22、);)class C:public A,public Bpublic:void g();void h(););如果声明:C c l,则cl.f();具有二义性,而cl.g();无二义性(同名覆盖)。派生类不管以何种访问特性继承基类,都不能直接访问基类的私有成员.#include using namespace std;class Vehicle 父类public:void EditSC(float speedjnt total);protected:float speed;速度int total;最大载人量);void Vehicle:EditSC(float speedjnt total)成

23、员函数的实现Vehicle:speed=speed;Vehicle:total=total;)class Car:public Vehicle /Car 类继承 Vehicle 的特性,Car 类是 Vehicle 的派生类public:Car()aird=0;)protected:int aird;排量);class plane:public Vehicle protected:float wingspan;翼展;void main()Car a;a.EditSC(150,4);cin.get();一旦成功定义派生类,那么派生类就可加作基类的所有数据成员包括是受保护型的。继承的初始化性质:#

24、include using namespace std;class A(private:int n_point;int i_point;public:A(int n,inti):n_point(n),i_point(i)(cout A 的构造函数 endl;)void pr()(cout n_point t i_point t;));class B:public A单继承,在类B中,继承了 A类(基类)int a_point;public:B(int n,int i,int a):A(n,i),a_point(a)(coutB类的构造函数endl;)void pr()(A:pr();couta

25、_point endl;);int main()(A a(10,20);B b(5,15,25);a.pr();coutendl;b.pr();)问:在 类B中,继承了 A类(基 类),那A类中的public成 员i_point为什么不能在B类的构造函数后面引用参数列表来赋值呢?而必须在类B的构造函数的函数体中进行初始化?答:派生类的构造函数只能初始化自己的成员,而不能初始化基类的成员。当 然,有时派生类从基类继承了成员,它也可以初始化其从基类继承的成员。这时要用构造函数初始化列表中包含基类名及其从基类继承的成员:即上例中的A(n).protected意 思 是:对对象来说,声明为protec

26、ted的变量是私有的,而对子类父类来说,声明为protected的变量是公共的。派生类的成员可以访问基类的protected成员(因为派生类成员在派生类的内部)派生类的对象不可以访问基类的protected成员(因为派生类对象在应用程序域,已经出了类内部域)派生类的的对象只能访问各种类的公有成员,或通过公有成员函数间接访问私有或受保护的成员。c+中多继承的二义性:class Apublic:void f();)class Bpublic:void f();void g();)class C:public A,public BPublic:void g();void h(););如果声明:C c

27、 l,则 cl.f();具有二义性,而 cl.g();无二义性(同名覆盖)。多继承二义性的解决办法:1、类名限定(调用时指名调用的是哪个类的函数)Eg:cl.A:f();cl.B:f();2、同名覆盖(在C 中声明一个同名函数,该函数根据需要内部调用A 的 f 或者是B的f。)如:class Cpublic A,public Bpublic:void g();void h();void f();派生类构造函数的调用次序有三个原则:(1)虚基类的构造函数在非虚基类之前调用;(2)若同一层次中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用;(3)若虚基类由非虚基类派生而来,则仍先调用基类

28、构造函数,再调用派生类的构造函数。在派生类继承基类时,加上一个virtual关键词则为虚拟基类继承,如:class derive:virtual public base;虚基类源于共同的间接基类。虚基类主要解决在多重继承时,基类可能被多次继承,虚基类主要提供一个基类给派生类,如#include using namespace std;class BO/声明为基类BOint nv;默认为私有成员public:外部接口BO(int n)nv=n;cout Member of BO endl;/B0 类的构造函数void fun()cout fun of BO endl;);class Bl:vir

29、tual public BO(int nvl;public:Bl(int a):B0(a)cout Member of Bl endl;);class B2:virtual public BO(int nv2;public:B2(int a):B0(a)cout Member of B2 endl;;class DI:public Bl,public B2(int nvd;public:Dl(int a):B0(a),Bl(a)f B2(a)cout Member of DI endl;/此行的含义,参考下边的 使 用 注 意5void fund()cout fun of DI endl;);

30、int main(void)DI dl(l);dl.fund();dl.fun();return 0;)执彳措果:Member of BOMember of BlMember of B2Member of DIfun of DIfun of BO这里D I在 B1,B2上继承,间接继承BO,D I继承的成员变量有nv、n vl、nv2,并且只继承一次,若不是由虚基类继承而来,那么nv会被D1从 B1和 B2各继承一次,造成冗余。使用注意(1)一个类可以在一个类族中既被用作虚基类,也被用作非虚基类。(2)在派生类的对象中同名的虚基类只产生一个虚基类子对象,而某个非虚基类产生各自的子对象。(3)虚

31、基类子对象是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。(4)最远派生类是指在继承结构中建立对象时所指定的类。(5)派生类的构造函数的成员初始化列表中必须列出对虚基类构造函数的调用;如果未列出,则表示使用该虚基类的缺省构造函数。(6)从虚基类直接或间接派生的派生类中的构造函数的成员初始化列表中都要列出对虚基类构造函数的调用。但仅仅用建立对象的最远派生类的构造函数调用虚基类的构造函数,而该派生类的所有基类中列出的对虚基类的构造函数的调用在执行中被忽略,从而保证对虚基类子对象只初始化一次。(7)在一个成员初始化列表中同时出现对虚基类和非虚基类构造函数的调用时,虚基类的构造函数先于非

32、虚基类的构造函数执行。14、派生类对象结构假设类baseclass是基类Class baseclassInt a,b;私有成员Public:共有成员);如果B继承baseclass类Class B:public baseclass/class B:继承方式 类名Int c;其他私有成员;Public:公有成员(包含baseclass的函数及B类新定义的内容);B为派生类包括两个部分,一部分为基类,即含两个整型空间、,另一个为派生类部分,含一个整型空间15、多态性 多态的说明:相同函数名,依据上下文,实现却不同。指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C+支持两种多态性

33、:编译时多态性,运行时多态性。a.编译时多态性:通过重载函数和运算符重载实现。b运行时多态性:通过虚函数和继承实现。多态的实现:通过函数重载(相同的函数名,不同的参数个数);函数模板;虚函数。静态多态(编译时多态):指调用者在编译时已经确定被调用者。(绑定)动态多态:在运行时才确定被调用者(动态绑定),C+中唯一一个就是虚函数。虚函数 在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数(简单地说,那些被virtual关键字修饰的成员函数,就是虚函数)多态还有个关键之处就是一切用指向基类的指针或引用来操作对象 格 式 为:virtual函数返回类型函数名(参数表)(函数体c

34、lass A(public:virtual void print()coutThis is Aendl;);class B:public A(public:void print()cout ThisisB T max(T tl,T t2)(return(tl t2)?t l:t2;)定 义T作为模板参数,或者是占位符,当 实 例 化max()时,它将替代具体的数据类型。m ax是函数名,t l和t2是其参数,返回值的类型为T.你可以像使用普通的函数为屏使用这个m ax(),编译器按照所使用的数据类型自动产生相应的模板特化,或者说是实例:int n=10,m=16;int highest=max(n,m);/产生 int 版本std:complex cl,c2;/.给cl,c2赋值std:complex higher=max(cl,c2);complex 版本类模板,模板的类型参数由关键字class或关键字typename及其后的标识符构成。在模板参数表中关键字class和typename的意义相同。定义类模板的一般形式是:template(类 型 名 参 数 名1,类型名参数名2,class类名类声明体);例如,template class Smemory.public:void input(T x);)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁