第4课:C++函数与类_第1页
第4课:C++函数与类_第2页
第4课:C++函数与类_第3页
第4课:C++函数与类_第4页
第4课:C++函数与类_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

1、灵训教育灵训教育C+C+语言基础语言基础第第4 4课:课:C+C+函数与类函数与类2021-11-42第第5 5章、函数章、函数5.1 5.1 函数的定义与使用函数的定义与使用5.2 5.2 函数重载函数重载5.3 5.3 函数指针函数指针第第6 6章、类章、类6.1 6.1 成员与访问控制成员与访问控制6.2 6.2 拷贝构造、赋值,类型转换拷贝构造、赋值,类型转换6.3 6.3 右值引用,移动构造、赋值右值引用,移动构造、赋值6.4 6.4 嵌套类、局部类嵌套类、局部类6.5 6.5 类型别名、友元类型别名、友元6.6 6.6 继承、多重继承继承、多重继承6.7 6.7 多态多态6.8 6

2、.8 限定符限定符2021-11-43 熟悉熟悉C+C+函数和类的概念(函数和类的概念(函数函数,重载重载,函数指针函数指针,类类,继承继承,构造函数构造函数,析构函数析构函数,虚函数虚函数,纯虚函数纯虚函数,右值引用右值引用,抽象基类抽象基类,接口接口,覆盖覆盖,隐藏隐藏,多重继承多重继承,虚基类虚基类)。)。掌握掌握C+C+的语法关键字:的语法关键字:protectedprotected、privateprivate、typedeftypedef、friendfriend、staticstatic、constconst、constexprconstexpr、mutablemutable、v

3、olatilevolatile、explicitexplicit、noexceptnoexcept、virtualvirtual、overrideoverride、finalfinal、thread_localthread_local、 virtual、override、final。2021-11-44 5 5.1 .1 函数的定义与使用函数的定义与使用5 5. .2 2 函数重载函数重载5 5. .3 3 函数指针函数指针接第接第1.51.5节,本章将详细讲解函数的相关语法概念节,本章将详细讲解函数的相关语法概念。 2021-11-455 5. .1 1.1 .1 全局函数全局函数5.1.2

4、 5.1.2 形参、实参、返回值形参、实参、返回值5.1.3 5.1.3 成员函数成员函数5.1.4 5.1.4 局部函数(局部函数(lambdalambda)2021-11-46 在程序结构中,全局函数需要首先定义(或声明),然后在具体的实现文件中实现代码,之后才可以在其他代码中调用。全局函数在调用时,可以使用命名空间加界定运算符符的方式引用,或直接用界定运算符引用,防止与同名的成员函数混淆。一个函数可以被另外一个函数调用,当函数直接或间接调用到自己时,也称为递归调用,要特别注意递归调用产生的死循环,会导致栈溢出。函数的实现代码只能是一份,可以在多处声明,多次调用,调用前必须首先声明,如果函

5、数的实现部分在函数的调用部分之前,则函数的声明可省略。函数在声明时,可以添加extern关键字限定。函数在实现时,如果添加static关键字限定,表示该函数是静态全局函数(内部函数),只能在该实现文件内部使用,不能被声明调用。不建议滥用全局函数。2021-11-47 函数在定义(或声明)、实现部分定义的参数是形参,在调用的部分带入的参数是实参;实参与形参要一一对应;可以从右向左为形参定义默认值,在实参调用时,有默认值的形参可以不指定实参。一般形参的改变不会影响到实参,不过可以将形参定义为引用类型,这样在函数体内改变形参的值,可以最终影响实参。函数实参的求值顺序是从右向左。一个函数可以有且只能有

6、一个返回值,该返回值必须通过return关键字返回,且必须与函数定义的返回值类型一致,返回值可以参与表达式运算;如果函数没有返回值,可以将返回值类型定义为void型,函数仍然可以使用return返回。建议一个函数自有一个出口,对于有返回值的函数,用一个return语句,对于无返回值的函数,无return语句。2021-11-48定义在类中的函数被称为成员函数。成员函数不能被外部声明引用,只能被定义一次,实现一次,可被调用多次。成员函数在定义时,可以直接编写代码(不建议),也可以分离到外部,在实现文件中编写代码;如果函数在外部编写代码,需要加上类名的界定。在成员函数内部可以使用类的数据成员;在成

7、员函数内部还隐含一个形参this,表示该类的实例对象指针。成员函数在被调用时,需要使用一个实例化的类对象变量加成员引用运算符,该变量的指针被作为this的实参传递给成员函数,成员函数操作的所有数据成员全通过this指针获取。(考虑下,用空指针引用成员函数的情况)成员函数在类中定义时,如果加上static关键字,被称为静态成员函数。静态成员函数类似全局函数,不隐含this指针,不得使用数据成员,可以使用静态数据成员,使用时需要用类加界定运算符。2021-11-49C+没有子函数的概念,不过C+11标准中,增加了lambda表达式的语法概念。可以在一个函数内部定义一个局部函数,定义形式如下:捕获列

8、表(形参列表)-返回值类型函数体代码;捕获列表:获取上级函数的局部变量。使用&表示以引用的方式获取,使用=表示以值的方式获取;也可以具体指定上级函数的局部变量名。形参列表、返回值类型、函数体:与正常函数定义形式一样。lambda表达式需要赋值给一个变量(函数对象),才可以正常使用。2021-11-410不使用循环,仅使用函数,实现从1加到100。2021-11-4115 5. .2 2.1 .1 函数重载定义函数重载定义5.2.2 5.2.2 实参匹配实参匹配2021-11-412在相同作用域中的函数,如果名称相同,形参不同,则称为函数重载。形参不同指形参的类型或数量不同。运算符重载可

9、以看作是一种函数重载。2021-11-413函数重载在使用时,C+编译器会根据实参与形参的类型匹配程度最接近的函数。如果两个函数匹配程度一样,则会产生二义性的编译错误。2021-11-4145 5. .3 3.1 .1 函数指针的定义函数指针的定义5.3.2 5.3.2 函数重载的指针函数重载的指针5.3.3 5.3.3 运算符重载的指针运算符重载的指针2021-11-415函数指针的定义形式类似于函数声明,将函数名替换为指针。函数指针是个指针类型的变量,用取地址运算符获取函数的地址;调用时,与普通函数的调用方式相同。函数指针只针对全局函数和静态成员函数。注意,由于函数调用运算符的优先级较高,

10、解地址运算符与函数指针需要用括号括起来。2021-11-416函数重载在获取函数指针时,也使用最匹配原则,有时也可以使用强制类型转换。2021-11-417运算符重载与函数有相同的特性,也可以赋值给一个函数指针变量。2021-11-418 6 6.1 .1 成员与访问控制成员与访问控制6 6. .2 2 拷贝构造、赋值,类型转换拷贝构造、赋值,类型转换 6 6. .3 3 右值引用,移动构造、赋值右值引用,移动构造、赋值 6 6. .4 4 嵌套类、局部类嵌套类、局部类 6 6. .5 5 类型别名、友元类型别名、友元 6 6. .6 6 继承、多重继承继承、多重继承 6 6. .7 7 多态

11、多态 6 6. .8 8 限定符限定符接第接第1.31.3节,本章详细讲解类的语法概念节,本章详细讲解类的语法概念。 2021-11-4196 6. .1 1.1 .1 构造、析构函数构造、析构函数6.1.2 6.1.2 数据成员、成员函数数据成员、成员函数6.1.3 6.1.3 访问控制访问控制6.1.4 6.1.4 成员指针成员指针2021-11-420每个类都会有构造函数和析构函数,如果用户未定义,C+编译器会自动生成默认的无参数的构造、析构函数。用户可以定义自己的构造、析构函数,构造函数可以带参数,析构函数不能有参数。如果自定义的无参数的构造、析构函数,希望保留与默认相同的功能,可以使

12、用default关键字,如果希望删除默认的构造、析构函数,可以使用delete关键字。类的成员变量,可以在构造函数的初始化列表中赋初值,赋值的顺序与定义的顺序相同。类实例对象在创建的时候,构造函数被调用,销毁的时候,析构函数被调用。2021-11-421不用循环语句,不使用递归,从1打印到100。2021-11-422类中的函数成员被称为成员函数,包括普通成员函数和静态成员函数。类中的数据成员,包括成员变量、成员常量、成员引用、静态成员变量等;数据成员可在定义时,直接赋初值,也可以在构造函数的初始化列表里赋初值。静态成员变量需要在实现文件中赋初值。成员引用只能在构造函数的初始化列表中赋初值。2

13、021-11-423C+的类成员,有三种访问控制类型:私有private、保护protected、公有public。private:私有,只能被本类中的成员函数访问。protected:保护,只能被本类及子类中的成员函数访问。public:可被所有的函数访问。2021-11-424严格上说,成员指针并不真正属于指针,只不过是在类中的偏移量。定义方式相对于真正的指针,需要在指针前加上类界定。成员指针定义好并赋值后,可以使用类实例对象变量加上成员指针运算符引用。2021-11-4256 6. .2 2.1 .1 拷贝构造拷贝构造6.2.2 6.2.2 拷贝赋值拷贝赋值6.2.3 6.2.3 类型转

14、换类型转换2021-11-426拷贝构造函数的形参类型是本身类的引用,用于使用一个已有的类对象实例克隆出一个的类对象实例。如果未定义拷贝构造,C+编译器会自动生成一个默认的拷贝构造,可以使用delete关键字删除。2021-11-427拷贝赋值就是类中重载了赋值运算符,用于将一个类对象实例的数据赋值给另一个类对象实例。如果未定义拷贝赋值,C+编译器会自动生成一个默认的拷贝赋值,可以使用delete关键字删除。2021-11-428带一个形参的构造函数,用于在表达式中将形参的类型转换为类本身的类型。2021-11-4296 6. .3 3.1 .1 右值引用右值引用6.3.2 6.3.2 移动构

15、造移动构造6.3.3 6.3.3 移动赋值移动赋值2021-11-430接第4.5节,能被赋值的操作数被称为左值,左值代表一个持久存在的对象,可以取地址,可以引用;不能被赋值的操作数被称为右值,常数、常量、临时变量等都是右值,不能取右值的地址,旧的标准也不能引用右值。为了在数据传递过程中,减少拷贝的次数,保证更好的性能,C+11制定了右值引用类型,可以看做是一个复合数据类型,由“&”定义,用于引用一个右值。使用标准库中的std:move函数可以将左值引用转化为右值引用。相对的,使用一个“&”定义的引用,可称为左值引用;左值引用只能引用左值。2021-11-431 右值引用多用于

16、函数的参数传递,与左值引用一样,减少对象的拷贝次数,提高了性能;与左值引用不同的是,右值引用可以引用右值。右值引用的另一个常用场景,用于把即将销毁的对象中的资源直接移动给接收的变量,就是下一节要讨论的移动构造和移动赋值。2021-11-432只有一个形参,并且形参类型为类本身的右值引用的构造函数,称为移动构造。用于直接将右值引用中资源移动给自己,而不是拷贝资源。使用移动构造时,要特别注意,原对象的资源已被转移,原对象将不再做资源清理工作。2021-11-433与移动构造类似,只有一个形参,并且形参类型为类本身的右值引用的赋值运算符重载,称为移动赋值。用于直接将右值引用中资源移动给自己,而不是拷

17、贝资源。2021-11-4346 6. .4 4.1 .1 嵌套类嵌套类6.4.2 6.4.2 局部类局部类 2021-11-435C+允许在类内部定义子类,称为嵌套类。相当于命名空间的嵌套。嵌套类与上层的包裹类之间除了嵌套关系外,并没有其他任何关系,是相对独立的。嵌套类在访问时,需要添加上层包裹类的界定。2021-11-436在函数体内也可以定义类,称为局部类。2021-11-4376 6. .5 5.1 .1 类型别名类型别名6 6. .5 5. .2 2 友元函数友元函数6.5.3 6.5.3 友元类友元类 2021-11-438使用typedef关键字,可以将繁琐的类型名称定义成一个简

18、单的别名。2021-11-439使用friend关键字,将一个函数定义为一个类的友元函数,则该函数可以访问类中的任何数据成员,包括私有和保护的。2021-11-440使用friend关键字,将一个类定义为另一个类的友元类,则该类中的成员函数可以访问另一个类中的任何数据成员,包括私有和保护的。2021-11-4416 6. .6 6.1 .1 基类与派生类基类与派生类6 6. .6 6. .2 2 隐藏、覆盖隐藏、覆盖6.6.3 6.6.3 基类成员的使用基类成员的使用6.6.4 6.6.4 访问权限提升访问权限提升6.6.5 6.6.5 多重继承多重继承6.6.6 6.6.6 虚继承虚继承20

19、21-11-442 基类与派生类都是类,派生类从基类继承而来,派生类也可以作为另外派生类的基类;派生类将默认包含基类成员中除私有成员外的所有成员,实现了功能的复用。继承的语法形式:class 派生类名称 : 继承访问控制 基类名称 类体 ;继承访问控制与类成员的访问控制形式一致,也分为私有、保护、公有三种;用于继承后降低基类成员的访问控制权限;一般用public,表示基类成员的访问控制不变;特殊场合,如果使用protected,表示基类公有成员变为保护成员,私有成员访问控制不变;使用private,表示将基类所有成员变为私有成员。2021-11-443派生类中如果定义了与基类中相同名称的成员,

20、则基类中的该成员,在派生类中被隐藏。如果要在派生类中使用被隐藏的基类成员,需要加上基类名的界定。针对成员函数,如果基类和派生类中存在形式完全相同的成员函数,则称派生类的该成员函数覆盖基类的对应成员函数(覆盖主要用于虚函数)。考虑一下,成员函数的重载、隐藏、覆盖的区别。2021-11-444在派生类中(以及在外部使用派生类),基类中的可访问到的成员,和派生类中的成员一样,没有使用上的限制;基类中被隐藏或覆盖的成员,使用前需加上基类名的界定。反过来,在基类中(以及在外部使用基类),则不能使用派生类中的成员(覆盖的虚函数除外)。在派生类的构造函数中的初始化列表中,可以调用基类的构造函数。2021-1

21、1-445在派生类中,可以使用using关键字,将基类中的保护成员提升为公有成员。2021-11-446C+支持一个派生类从多个基类继承,称为多重继承。多个基类中的成员同时被派生类继承复用,当多个基类中的成员有重名时,在派生类中使用时,需要加上不同基类的名称界定。不建议使用多重继承。2021-11-447在多重继承中,如果多基类中又存在从共同的上层基类派生,则在最终的派生类中,会存在隔层基类的多份拷贝;如果不希望隔层基类在最终的派生类中有多份拷贝,则需要中间层基类虚继承上层基类,标明该基类为共享基类,在多重继承的最终派生类中,只保留一份拷贝。虚继承的定义,需要在继承访问控制前(或后)加上vir

22、tual关键字。2021-11-4486 6. .7 7.1 .1 虚函数、纯虚函数虚函数、纯虚函数6.7.2 6.7.2 抽象基类、接口抽象基类、接口6.7.3 6.7.3 多态多态2021-11-449在基类中,使用virtual关键字限定的函数为虚函数。虚函数可以实现使用基类的指针(或引用)调用派生类中成员函数的能力。在基类中未实现的虚函数被称为纯虚函数,需要在定义时,在虚函数结尾加上“= 0”。在派生类中一般要覆盖虚函数,覆盖时,可以加上virtual关键字,也可以不加;建议在派生类中覆盖虚函数时,在结尾处加上override关键字限定,明确表示覆盖基类的虚函数,减少因代码编辑错误,照

23、成的逻辑错误。在派生类的覆盖虚函数的定义的结尾加上final关键字限定,则禁止后续的派生类再覆盖该虚函数。类的析构函数可以定义为虚函数,这样使用delete运算符和基类的指针,就可以销毁派生类对象。类的构造函数不允许定义为虚函数。2021-11-450定义有纯虚函数的类,被称为抽象基类,抽象基类不能实例化对象。类中仅包含纯虚函数的类,称为接口。2021-11-451同一个基类可以有多个派生类;可以通过基类的指针(或引用),调用不同派生类中虚成员函数。当同一个基类指针,在不同的场景下,调用不同派生类中的虚成员函数的行为,被称为多态。2021-11-4526.8.1 6.8.1 静态静态stati

24、cstatic6.8.2 6.8.2 外部声明外部声明externextern6.8.3 6.8.3 常量常量constconst和和constexprconstexpr6.8.4 6.8.4 可变成员可变成员mutablemutable6.8.5 6.8.5 禁止优化禁止优化volatilevolatile6.8.6 6.8.6 明确类型转换明确类型转换explicitexplicit6.8.7 6.8.7 无异常无异常noexceptnoexcept6.8.8 6.8.8 虚函数虚函数virtualvirtual6.8.9 6.8.9 明确覆盖明确覆盖overrideoverride6.8.10 6.8.10 禁止覆盖(或继承)禁止覆盖(或继承)finalfinal6.8.11 6.8.11 内联函数内联函数inlineinline6.8.12 6.8.12 线程变量线程变量thread_localthread_local2021-11-453用于定义静态全局函数、静态成员函数、静态成员变量。还可以定义静态局部变量,在函数中使用static关键字定义的变量是静态局部变量,

温馨提示

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

评论

0/150

提交评论