• 462.00 KB
  • 2022-04-29 14:27:04 发布

最新C++学期末复习资料课件PPT.ppt

  • 67页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'C++学期末复习资料 C++程序结构//example1_1.cpp:Definestheentrypointfortheconsoleapplication.#include"stdio.h"#include"iostream.h"voidmain(){cout<<"ThisismyfirstC++program!"<=new<数据类型>;或者<指针变量名>=new<数据类型>[<元素个数>];其中:指针变量名:任何合法的指针变量名;数据类型:任何合法的C++基本类型或自己定义的类;元素个数:可以使用new运算符一次申请多个指定数据类型的空间 delete运算符的作用delete运算符用来将动态分配的内存空间归还给系统。delete运算符的定义格式(1)格式1:delete<指针变量>;该语句的作用是将指针变量所指的内存空间归还给系统。如:deletepi;∥将由指针变量pi所指内存空间归还给系统(2)格式2:delete[]<指针变量>;该语句的作用是将指针变量所指的一维数组内存空间归还给系统 (1)用new运算符为数组分配内存时,不能进行初始化赋值。例如:int*p=newint[10](0,1,2,3,4,5,6,7,8,9);∥是错误的。(2)用new分配内存后,若指针变量值为0,则表示分配失败。此时应终止程序执行。(3)用new分配内存空间的指针值必须保存起来,以便用delete归还内存。否则会出现不可预测的后果例如:引用类型引用类型变量的定义格式为:<类型>&<引用变量名>=<变量名>例如,引用一个整型变量:intsomeInt;int&rInt=someInt;引用变量是用来对它进行初始化变量的一个别名,它没有独立的存储空间,而是使用对它进行初始化的那个变量(称为原变量)的空间,以后对引用变量和原变量的操作都是在同一存储空间进行的。 函数的调用方式传值调用:C++中变量值有两种,一种是变量本身的值,另一种是变量地址的值。因此传值调用也分为两种,即变量的值传递和变量的地址传递。引用调用引用是给一个已知变量起个别名,对引用的操作也就是对被它引用的变量的操作。要把形式参数声明为引用类型,只需在参数名字前加上地址操作符&即可。引用主要是用来作函数的形参和函数的返回值。使用引用作函数参数时,调用函数的实参要用变量名,将实参变量名赋给形参的引用,相当于在被调函数中使用了实参的别名。于是在被调函数中,对引用的改变,实质就是直接通过引用来改变实参的值。 变量所占的内存空间C++程序内存被分为4个区:全局变量、静态变量、全局常变量、字符串常量存放在全局数据区,其生存周期为整个程序的生存周期,静态生存期所有函数和代码存放在代码区(包括类的成员函数)函数的参数、局部变量存放在栈区,具有动态生存期堆区用于动态内存分配 【例】用引用调用的方法实现两个数据的交换。#include"stdafx.h"#include"stdio.h"#include"iostream.h"voidswap(int&x,int&y){inttemp;temp=x;x=y;y=temp;}voidmain(){inta=3,b=4;cout<<"a="<<函数名>(<形式参数表>)内联函数的定义应在第一次被调用之前。如果仅在声明函数原型时加上关键字inline,并不能达到内联效果。内联函数的定义必须出现在对该函数的调用之前,因为编译器在对函数调用语句进行替换时,必须事先知道替换该语句的代码是什么。 带默认参数值的函数在C++中定义函数时,允许给形参指定默认值.形参表可写成如下形式:<类型><形参1>=<表达式1>,…,<类型><形参n>=<表达式n>(1)具有默认参数值函数应先定义后调用(2)在定义函数时,具有默认值的参数必须位于参数表的最右边(3)函数调用时,若省略某个实参而使形参采用默认值,则其后的实参都应省略。 函数的重载函数的重载是面向对象程序设计的多态性的实现。重载就是用同一个名字,根据不同的数据类型或参数个数产生不同的行为。重载函数的形式参数表必须是不同的,也就是说函数的参数表中对应的参数类型不同,或参数的个数不同,或参数表中不同类型参数的次序不同。 函数模板template返回类型函数名(形参表){函数体;}函数模板:可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。函数模板的定义形式为:模板参数表意义:对于功能完全一样,只是参数类型不同函数,能写一段通用代码适用于多种不同的数据类型,会使代码的可重用性大大提高,从而提高软件的开发效率。 #includeusingnamespacestd;templateT1add(T1x,T2y){cout<<"("<功能:根据"文件名",把指定文件的全部内容读到当前处理的文件中,作为当前文件的一个组成部分,即把文件的内容替代该#include命令行。 类和对象类与对象的概念及定义方法构造函数与析构函数的概念及作用构造函数与析构函数的定义格式及使用方法new运算符用法this指针的概念 类类是C++面向对象编程语言最重要的一部分。把封装起来的数据和处理数据的代码称为类,类是一个用户自定义的类型。类的定义如下:class标识符{private:私有数据成员;私有成员函数;protected:保护数据成员;保护成员函数;public:公有数据成员:公有成员函数;};classcircle{private:floatr;public:voidget();floatlongth(intr);floatarea(intr)}; 对象定义了一个类后,不能对类的成员进行操作,如同不能对int型进行操作一样。要使用类必须先声明类的对象。类的对象是具有该类类型的某一具体的实例。如果将类看作是自定义的类型,那么类的对象可看成是该类型的变量。声明某个类的对象的与声明一般变量类似,声明格式如下:<类名><对象名1>〔,<对象名2>,…,<对象名n>〕;类名类对象名;例如:PointB;//声明了一个点类的对象B声明了类及其对象,可以访问对象的公有成员。对对象的成员进行访问时可以用访问运算符“.”,其一般形式是:<对象名>.<公有成员函数名>(<参数表>) 构造函数与析构函数构造函数(Constructor)是类中一种特殊的成员函数,主要用来在创建对象时为对象申请存储空间,并为数据成员进行初始化的操作。构造函数的名字与它所属的类名相同,跟其他成员函数一样,构造函数可以在类的内部定义,也可以在类的外部定义。定义构造函数时,利用参数传递来实现对被创建对象中的数据成员赋值,由于构造函数是在创建对象时执行的,所以对数据成员的赋值一般都是初始值。当然,构造函数也可以不带参数。 用构造函数初始化对象的过程,实际上就是对构造函数的调用过程。一般情况下按如下步骤进行:(1)程序执行到定义对象语句时,系统为对象分配内存空间;(2)系统自动调用构造函数,将实参传送给形参,执行构造函数体时,将形参值赋给对象的数据成员,完成数据成员的初始化工作。(3)默认的构造函数每个类必须有一个构造函数,没有构造函数,就不能创建任何对象。若未提供一个类的构造函数(一个都未提供),则C++提供一个默认的构造函数,该默认构造函数是个无参构造函数,它仅负责创建对象,而不做任何初始化工作。只要一个类定义了一个构造函数(不一定是无参构造函数),C++就不再提供默认的构造函数。也就是说,如果为类定义了一个带参数的构造函数,还想要无参构造函数,则必须自己定义。 (4)带参数的构造函数前面介绍的构造函数若不能完全满足初始化的要求,则可以定义带参数的构造函数,否则,往往程序员只能先将对象构造成千篇一律的对象值,甚至一个随机值对象,然后再调用一个初始化成员函数将数据存到该对象中去。(5)拷贝构造函数用类定义对象中,可用带拷贝功能的构造函数将另一个已经存在对象的数据拷贝到新建的对象中。拷贝构造函数是一种特殊的构造函数,其名称与类名称相同。1)拷贝构造函数的特征。拷贝构造函数除了具有一般构造函数的特征外,其形参必须是本类的对象的引用。2)拷贝构造函数的作用。其作用是使用一个已存在的对象去初始化一个新的同类对象;某函数的形参是类的对象,调用该函数需要拷贝构造函数进行形参和实参结合;函数的返回值是类的对象,函数调用返回的时候需要调用拷贝构造函数实现类对象的赋值。 如果用户没有声明类的拷贝构造函数,系统会自动生成一个缺省的拷贝构造函数,这个缺省的拷贝构造函数的功能是把初始化对象的每个数据成员的值都复制到新建的对象中,也可以说是同类对象的克隆。(3)拷贝构造函数的实现。类名:类名(类名&对象名)//拷贝构造函数{函数体;} (4)拷贝构造函数被调用的三种情况。①用类的对象去初始化类的另一个对象的时候。voidmain(void){LocationA(1,2);LocationB(A);cout<::~<类名>(){};默认的析构函数的函数体为空,即该默认的析构函数什么也不执行。实际上,任何对象都有构造函数和析构函数。在定义类时,若没有定义构造函数或析构函数,则编译器自动产生默认的构造函数与析构函数。当产生对象时,若不对数据成员进行初始化,可以不显式地定义构造函数。在撤销对象时,若不做任何结束工作,可以不显式地定义析构函数。但在撤销对象时,要释放对象的数据成员用new运算符分配的动态空间时,必须显式定义析构函数。 this指针用类定义一个对象时,由系统自动建立指向该对象的指针称为this指针。this指针的默认定义格式:<类名>*constthis=&对象;this指针的特性(1)this是每个成员函数的一个隐含参数,通过该参数,成员函数可以获知当前对象的地址,从而可以操纵对象所拥有的数据成员。(2)由于this指针是作为隐含参数传递给成员函数的,所以通常成员函数是以隐含方式使用该指针来访问本类的数据成员的。(3)this指针具有变量和常量的双重特征,当一个对象调用本类的成员函数时,this指针作为常量实参被传递,在函数体内固定指向该对象——常量特征;如果另一对象再调用成员函数时,该this指针必须重新定向——变量特征。(4)在某些场合需要显式地使用this指针来操作调用成员函数的对象 继承与派生1.继承与派生的定义在面相对象程序设计中提供了类的继承机制,允许程序员在保持原有类特性的基础上,进行更具体、更详细的说明。以原有的类为基础产生新的类,我们就说新类继承了原有类的特性,也可以说从原有类派生出新类。原有类称为基类或父类,产生的新类称为派生类或子类。2.单一继承3.多重继承 派生类中成员的访问权限继承方式有三种public、protected、private四条规则:1)无论哪种方式,基类中的私有成员在派生类中都是不可直接访问成员;2)在公有继承时,基类中的公有和保护成员在派生类中不发生变化;3)在保护继承时,基类中的公有和保护成员在派生类中都成为保护成员;4)在私有继承时,基类中的公有和保护成员在派生类中都成为私有成员;派生类中不会继承基类中的构造函数和析构函数。 在C++中,定义派生类的一般语法为:class<派生类名>:<继承方式1><基类名1>,﹝,…,<继承方式n><基类名n>﹞{<派生类新定义成员>};声明中的“基类名”是已有的类的名称,“派生类名”是继承原有类的特性而生成的新类的名称。在派生过程中,派生出来的新类也可作为基类来继续派生新的类,此外,一个基类可以同时派生出多个派生类。也就是说,一个类从父类继承来的特征也可以被其他新的类所继承,一个父类的特征,可以同时被多个子类继承。 派生类的构造函数与析构函数1.构造函数派生类的构造函数需要以合适的初值作为参数,隐含调用基类和新增对象成员的构造函数,来初始化它们各自的数据成员,然后加入新的语句对新增普通数据成员进行初始化。派生类构造函数的一般语法规则为:<派生类名>::<派生类名>(形参表):<基类名1>(实参表1),﹝,…,<基类名n>(实参表n)﹞{<派生类构造函数体>//派生类新增成员的初始化} 如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数,提供一个将参数传递给基类构造函数的途径,保证在基类进行初始化时能够获得必要的数据。如果基类没有定义构造函数,派生类也可以不定义构造函数,全部采用默认的构造函数,这时新增成员的初始化工作可以用其他公有成员函数来完成。①调用基类构造函数;②调用内嵌成员对象的构造函数,调用顺序按照它们在类中定义的顺序。③派生类自己的构造函数。单继承时,派生类构造函数调用的一般次序如下:④当派生类对象析构时,各析构函数的调用顺序正好相反。首先调用派生类析构函数(清理派生类新增成员);然后调用派生类成员对象析构函数(清理派生类新增的成员对象);最后调用基类析构函数(清理从基类继承来的基类子对象)。 类型兼容是指在公有派生的情况下,一个派生类对象可以作为基类的对象来使用。类型兼容又称为类型赋值兼容或类型适应。在C++中,类型兼容主要指以下三种情况:①派生类对象可以赋值给基类对象。②派生类对象可以初始化基类的引用。③派生类对象的地址可以赋给指向基类的指针。 多继承(multipleinheritance,MI)是指派生类具有两个或两个以上的直接基类(directclass)。多继承时派生类构造函数执行的一般次序如下:①调用各基类构造函数;各基类构造函数调用顺序按照基类被继承时声明的顺序,从左向右依次进行。②调用内嵌成员对象的构造函数;成员对象的构造函数调用顺序按照它们在类中定义的顺序依次进行。③调用派生类的构造函数;由于多继承中派生类拥有多个基类,如果多个基类中拥有同名的成员,那么,派生类在继承各个基类的成员之后,当我们调用该派生类成员时,由于该成员标识符不唯一,出现二义性,编译器无法确定到底应该选择派生类中的哪一个成员,这种由于多继承而引起的对类的某个成员访问出现不唯一的情况就称为二义性问题。 通常有两种方法可以解决二意性问题(1)成员名限定通过类的作用域分辨符明确限定出现歧义的成员是继承自哪一个基类。例如:使用Car::show()与Wagon::show()来表明调用哪个类的show()。(2)成员重定义在派生类中新增一个与基类中成员相同的成员,由于同名覆盖,程序将自动选择派生类新增的成员。可以对派生类StationWagon的ShowSW()改名为show()。这样,类StationWagon中的show()覆盖了基类中的两个同名的show(),使用SW.show();时不会出现二义性问题。 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。虚基类的定义是在融合在派生类的定义过程中的,其定义格式如下:class派生类名:virtual继承方式基类名其中:virtual是关键字,声明该基类为派生类的虚基类。在多继承情况下,虚基类关键字的作用范围和继承方式关键字相同,只对紧跟其后的基类起作用。声明了虚基类之后,虚基类在进一步派生过程中始终和派生类一起,维护同一个基类子对象的拷贝。 C++将建立对象时所使用的派生类称为最远派生类。对于虚基类而言,由于最远派生类对象中只有一个公共虚基类子对象,为了初始化该公共基类子对象,最远派生类的构造函数要调用该公共基类的构造函数,而且只能被调用一次。虚基类的构造函数调用分三种情况:(1)虚基类没有定义构造函数程序自动调用系统缺省的构造函数来初始化派生类对象中的虚基类子对象。(2)虚基类定义了缺省构造函数程序自动调用自定义的缺省构造函数和析构函数。(3)虚基类定义了带参数的构造函数这种情况下,虚基类的构造函数调用相对比较复杂。因为虚基类定义了带参数的构造函数,所以在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的初始化表中列出对虚基类的初始化。但是,只有用于建立派生类对象的那个最远派生类的构造函数才调用虚基类的构造函数,而派生类的其它非虚基类中所列出的对这个虚基类的构造函数的调用被忽略,从而保证对公共虚基类子对象只初始化一次。 C++同时规定,在初始化列表中同时出现对虚基类和非虚基类构造函数的调用,虚基类的构造函数先于非虚基类的构造函数的执行。虚基类的析构顺序与构造顺序完全相反,最开始析构的是最远派生类自身,最后析构的是虚基类。尽管从程序上看,虚基类被析构多次,实际上只有在最后一次被执行,中间的全部被忽略。。 1.虚基类使得在继承间接共同基类时只保留一份成员。 2.虚基类是在声明派生类时,指定继承方式时声明的,而不是在声明基类时声明基类时声明的。 3.由于虚基类在派生类中只有一份数据成员,所以这份数据成员的初始化必须由派生类直接给出。 4.如果在虚基类中定义了带参构造函数,在最后的派生类中不仅要负责对其直接基类进行初始化,还要负责对虚基类初始化。总结: 静态数据成员静态数据成员在内存中只有一个拷贝。使用静态数据成员可以节省内存空间。静态数据成员的值对于每一个对象都是一样的。静态数据成员的定义格式如下:static<数据类型><变量名>;静态数据成员初始化格式如下:<数据类型类名>::<静态数据成员名>=<初始值>;引用静态数据成员的格式如下:<类名>::<静态数据成员名> 静态成员函数静态成员函数也是属于该类的所有对象,而不是属于任何对象。静态成员函数的引用不用对象名,而是类名。静态成员函数一般用于操作该类中的静态数据成员。在静态成员函数的实现中不能直接引用类中的非静态成员,但可以引用类中的静态成员。如果静态成员函数中需要引用非静态成员时,只能通过对象来引用。静态成员函数调用格式为:<类名>::<静态成员函数名>(<参数表>) 友元函数友元函数的特点是能够访问类中的私有和保护成员的非该类的成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。友元函数要在类定义时声明,声明时要在其函数名前加上关键字friend。该声明可以放在公有部分,也可以放在私有部分。友元函数的定义既可以在类内部进行,也可以在类外部进行。定义普通友元函数的格式为:friend<类型><友元函数名>(形参表) 友元类友元除了前面讲过的函数以外,友元还可以是类,即一个类可以作另一个类的友元。当一个类作为另一个类的友元时,该类称为友元类。友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。友元类可以在另一个类的公有部分或私有部分进行说明,说明方法如下:friend<类名>;//友元类类名 运算符重载运算符重载的实质就是函数重载。在实现过程中,先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型确定需要调用的函数,这个过程是在编译过程中完成的。 运算符重载使同一个运算符作用与不同类型的数据时导致不同的行为的这种机制称为运算符重载。运算符重载的实质就是函数重载。在实现过程中,先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型确定需要调用的函数,这个过程是在编译过程中完成的。C++编译器在对运算符进行编译处理时,将一个运算符编译成如下形式:一元运算符:@obj编译成operator@(obj)二元运算符:obj1@obj2编译成operator@(obj1,obj2)其中,关键字operator加上运算符名的函数称为运算符函数。由于C++中有前置++、--,后置++、--,为了区分它们,C++将后置++、--编译成:后置--:  obj--    编译成  operator--(obj,0)后置++:  obj++   编译成  operator++(obj,0) 运算符的重载规则(1)重载后运算符的优先级与结合性不会改变。(2)不能改变原运算符操作数的个数。(3)不能重载C++中没有的运算符。(4)不能改变运算符的原有语义。运算符可以重载为两种形式:(1)重载为某个类的友元函数;(2)重载为某个类的成员函数。重载为类的成员函数时,参数个数要少一个(成员函数是通过类的对象来调用的,该对象本身充当了第一个操作数)。 虚函数调用重载函数时,编译器根据调用时参数的类型与个数在编译时实现静态联编,将调用体与函数绑定。静态联编支持的多态性也称为编译时的多态性,或静态多态性。动态联编则在程序运行的过程中,根据指针与引用实际指向的目标调用对应的函数,也就是在程序运行时才决定如何动作。虚函数(virtualfunction)允许函数调用与函数体之间的联系在运行时才建立,是实现动态联编的基础。虚函数经过派生之后,可以在类族中实现运行时的多态,充分体现了面向对象程序设计的动态多态性。虚函数定义的一般语法形式如下:virtual函数类型函数表(形参表){函数体;}(1)虚函数的声明只能出现在类的定义中,应满足类型兼容规则。(2)在基类中定义虚函数,并且在派生类中要重新定义虚函数。(3)要由成员函数或者是通过指针、引用访问虚函数。 虚析构函数在C++中,不能定义虚构造函数,但析构函数可以是虚函数,而且通常声明为虚函数,即虚析构函数。虚析构函数定义形式如下:virtual ~类名();当基类的析构函数被声明为虚函数,则派生类的析构函数,无论是否使用virtual关键字进行声明,都自动成为虚函数。析构函数声明为虚函数后,程序运行时采用动态联编,因此可以确保使用基类类型的指针就能够自动调用适当的析构函数对不同对象进行清理工作。当使用delete运算符删除一个对象时,隐含着对析构函数的一次调用,如果析构函数为虚函数,则这个调用采用动态联编,保证析构函数被正确执行。 纯虚函数(purevirtualfunction)是一个在基类中说明的虚函数,它在该基类中没有定义具体实现,要求各派生类根据实际需要定义函数实现。纯虚函数的作用是为派生类提供一个一致的接口。纯虚函数定义的形式为:virtual函数类型函数名(参数表)=0;纯虚函数实际上,它与一般虚函数成员的原型在书写格式上的不同就在于后面加了=0。C++中,有一种函数体为空的空虚函数,它与纯虚函数的区别为:①纯虚函数根本就没有函数体,而空虚函数的函数体为空。②纯虚函数所在的类是抽象类,不能直接进行实例化,空虚函数所在的类是可以实例化的。③它们共同的特点是都可以派生出新的类,然后在新类中给出新的虚函数的实现,而且这种新的实现可以具有多态特征。 抽象类与具体类抽象类具有下述一些特点:(1)抽象类只能作为其它类的基类使用,抽象类不能定义对象,纯虚函数的实现由派生类给出;(2)派生类仍可不给出所有基类中纯虚函数的定义,继续作为抽象类;如果派生类给出所有纯虚函数的实现,派生类就不再是抽象类而是一个具体类,就可以定义对象。(3)抽象类不能用作参数类型、函数返回值或强制类型转换。(4)可以定义一个抽象类的指针和引用。通过抽象类的指针和引用,可以指向并访问各派生类成员,这种访问是具有多态特征的。(5)一个抽象类中至少包含一个纯虚函数。 政府接待礼仪制作者:刘慧时间:2014-7-15 一、政府接待礼仪之座次安排领导为单数时,主要领导居中以左为尊123453 领导为双数时,主要领导居中以左为尊 二、宴席座次“以右为上”。当餐桌有左右之分时,应以面向门的右侧之餐桌为上桌。“内侧为上”。当餐桌距离餐厅正门有远近之分时,一般以距门较远的餐桌,即靠内侧的餐桌为上桌。亦称“以远为上”。“居中为上”。当多张餐桌排列时,一般居中央者为上。 主陪副陪1243门口门口 三、仪式的座次签字双方主人在左边,客人在主人的右边。客主 四、乘车的座次 司机主人 五、合影座次安排与主席台座次安排相同——以左为尊注意:政界的会议以左为尊,商界的会议以右为尊。(政界)开会以左为上,(政商)吃饭以右为上。国际礼仪以右为尊。 谢谢观看!'