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

类型第4课:C++函数与类讲义课件.pptx

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

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

    特殊限制:

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

    关 键  词:
    C+ 函数 讲义 课件
    资源描述:

    1、灵训教育灵训教育C+C+语言基础语言基础第第4 4课课:C+C+函数函数与类与类2023-5-232第第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 限定符限定符2023-5-233 熟悉熟悉C+C+函数和类的概念(函数和类的概念(函数函数,重载重载,函数指针函数指针,类类,继承继承,构造函数构造函数,析构函数析构函数,虚函数虚函数,纯虚函数纯虚函数,右值引用右值引用,抽象基类抽象基类,接口接口,覆盖覆盖,隐藏隐藏,多重继承多重继承,虚基类虚基类)。)。掌握掌握C+C+的语法关键字:的语法关键字:protectedprotected、privateprivate、typedeftypedef、friendfriend、staticstatic、constconst、constexprconstexpr、mutablemutable、vo

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

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

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

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

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

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

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

    10、起来。2023-5-2316函数重载在获取函数指针时,也使用最匹配原则,有时也可以使用强制类型转换。2023-5-2317运算符重载与函数有相同的特性,也可以赋值给一个函数指针变量。2023-5-2318 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 多态多态 6 6.8 8 限定符限定符接第接第1.31.3节,

    11、本章详细讲解类的语法概念节,本章详细讲解类的语法概念。2023-5-23196 6.1 1.1 .1 构造、析构函数构造、析构函数6.1.2 6.1.2 数据成员、数据成员、成员函数成员函数6.1.3 6.1.3 访问控制访问控制6.1.4 6.1.4 成员指针成员指针2023-5-2320每个类都会有构造函数和析构函数,如果用户未定义,C+编译器会自动生成默认的无参数的构造、析构函数。用户可以定义自己的构造、析构函数,构造函数可以带参数,析构函数不能有参数。如果自定义的无参数的构造、析构函数,希望保留与默认相同的功能,可以使用default关键字,如果希望删除默认的构造、析构函数,可以使用d

    12、elete关键字。类的成员变量,可以在构造函数的初始化列表中赋初值,赋值的顺序与定义的顺序相同。类实例对象在创建的时候,构造函数被调用,销毁的时候,析构函数被调用。2023-5-2321不用循环语句,不使用递归,从1打印到100。2023-5-2322类中的函数成员被称为成员函数,包括普通成员函数和静态成员函数。类中的数据成员,包括成员变量、成员常量、成员引用、静态成员变量等;数据成员可在定义时,直接赋初值,也可以在构造函数的初始化列表里赋初值。静态成员变量需要在实现文件中赋初值。成员引用只能在构造函数的初始化列表中赋初值。2023-5-2323C+的类成员,有三种访问控制类型:私有priva

    13、te、保护protected、公有public。private:私有,只能被本类中的成员函数访问。protected:保护,只能被本类及子类中的成员函数访问。public:可被所有的函数访问。2023-5-2324严格上说,成员指针并不真正属于指针,只不过是在类中的偏移量。定义方式相对于真正的指针,需要在指针前加上类界定。成员指针定义好并赋值后,可以使用类实例对象变量加上成员指针运算符引用。2023-5-23256 6.2 2.1 .1 拷贝构造拷贝构造6.2.2 6.2.2 拷贝赋值拷贝赋值6.2.3 6.2.3 类型转换类型转换2023-5-2326拷贝构造函数的形参类型是本身类的引用,用

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

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

    16、可以引用右值。右值引用的另一个常用场景,用于把即将销毁的对象中的资源直接移动给接收的变量,就是下一节要讨论的移动构造和移动赋值。2023-5-2332只有一个形参,并且形参类型为类本身的右值引用的构造函数,称为移动构造。用于直接将右值引用中资源移动给自己,而不是拷贝资源。使用移动构造时,要特别注意,原对象的资源已被转移,原对象将不再做资源清理工作。2023-5-2333与移动构造类似,只有一个形参,并且形参类型为类本身的右值引用的赋值运算符重载,称为移动赋值。用于直接将右值引用中资源移动给自己,而不是拷贝资源。2023-5-23346 6.4 4.1 .1 嵌套类嵌套类6.4.2 6.4.2

    17、局部类局部类 2023-5-2335C+允许在类内部定义子类,称为嵌套类。相当于命名空间的嵌套。嵌套类与上层的包裹类之间除了嵌套关系外,并没有其他任何关系,是相对独立的。嵌套类在访问时,需要添加上层包裹类的界定。2023-5-2336在函数体内也可以定义类,称为局部类。2023-5-23376 6.5 5.1 .1 类型别名类型别名6 6.5 5.2 2 友元函数友元函数6.5.3 6.5.3 友元类友元类 2023-5-2338使用typedef关键字,可以将繁琐的类型名称定义成一个简单的别名。2023-5-2339使用friend关键字,将一个函数定义为一个类的友元函数,则该函数可以访问类

    18、中的任何数据成员,包括私有和保护的。2023-5-2340使用friend关键字,将一个类定义为另一个类的友元类,则该类中的成员函数可以访问另一个类中的任何数据成员,包括私有和保护的。2023-5-23416 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 虚继承虚继承2023-5-2342 基类与派生类都是类,派生类从基类继承而来,派生类也可以作为另外派生类的基类;派生类将默认包含基类成员

    19、中除私有成员外的所有成员,实现了功能的复用。继承的语法形式:class 派生类名称:继承访问控制 基类名称 类体;继承访问控制与类成员的访问控制形式一致,也分为私有、保护、公有三种;用于继承后降低基类成员的访问控制权限;一般用public,表示基类成员的访问控制不变;特殊场合,如果使用protected,表示基类公有成员变为保护成员,私有成员访问控制不变;使用private,表示将基类所有成员变为私有成员。2023-5-2343派生类中如果定义了与基类中相同名称的成员,则基类中的该成员,在派生类中被隐藏。如果要在派生类中使用被隐藏的基类成员,需要加上基类名的界定。针对成员函数,如果基类和派生类

    20、中存在形式完全相同的成员函数,则称派生类的该成员函数覆盖基类的对应成员函数(覆盖主要用于虚函数)。考虑一下,成员函数的重载、隐藏、覆盖的区别。2023-5-2344在派生类中(以及在外部使用派生类),基类中的可访问到的成员,和派生类中的成员一样,没有使用上的限制;基类中被隐藏或覆盖的成员,使用前需加上基类名的界定。反过来,在基类中(以及在外部使用基类),则不能使用派生类中的成员(覆盖的虚函数除外)。在派生类的构造函数中的初始化列表中,可以调用基类的构造函数。2023-5-2345在派生类中,可以使用using关键字,将基类中的保护成员提升为公有成员。2023-5-2346C+支持一个派生类从多

    21、个基类继承,称为多重继承。多个基类中的成员同时被派生类继承复用,当多个基类中的成员有重名时,在派生类中使用时,需要加上不同基类的名称界定。不建议使用多重继承。2023-5-2347在多重继承中,如果多基类中又存在从共同的上层基类派生,则在最终的派生类中,会存在隔层基类的多份拷贝;如果不希望隔层基类在最终的派生类中有多份拷贝,则需要中间层基类虚继承上层基类,标明该基类为共享基类,在多重继承的最终派生类中,只保留一份拷贝。虚继承的定义,需要在继承访问控制前(或后)加上virtual关键字。2023-5-23486 6.7 7.1 .1 虚函数、纯虚函数虚函数、纯虚函数6.7.2 6.7.2 抽象基

    22、类、接口抽象基类、接口6.7.3 6.7.3 多态多态2023-5-2349在基类中,使用virtual关键字限定的函数为虚函数。虚函数可以实现使用基类的指针(或引用)调用派生类中成员函数的能力。在基类中未实现的虚函数被称为纯虚函数,需要在定义时,在虚函数结尾加上“=0”。在派生类中一般要覆盖虚函数,覆盖时,可以加上virtual关键字,也可以不加;建议在派生类中覆盖虚函数时,在结尾处加上override关键字限定,明确表示覆盖基类的虚函数,减少因代码编辑错误,照成的逻辑错误。在派生类的覆盖虚函数的定义的结尾加上final关键字限定,则禁止后续的派生类再覆盖该虚函数。类的析构函数可以定义为虚函

    23、数,这样使用delete运算符和基类的指针,就可以销毁派生类对象。类的构造函数不允许定义为虚函数。2023-5-2350定义有纯虚函数的类,被称为抽象基类,抽象基类不能实例化对象。类中仅包含纯虚函数的类,称为接口。2023-5-2351同一个基类可以有多个派生类;可以通过基类的指针(或引用),调用不同派生类中虚成员函数。当同一个基类指针,在不同的场景下,调用不同派生类中的虚成员函数的行为,被称为多态。2023-5-23526.8.1 6.8.1 静态静态staticstatic6.8.2 6.8.2 外部声明外部声明externextern6.8.3 6.8.3 常量常量constconst和

    24、和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 内联函数内联函数inlin

    25、einline6.8.12 6.8.12 线程变量线程变量thread_localthread_local2023-5-2353用于定义静态全局函数、静态成员函数、静态成员变量。还可以定义静态局部变量,在函数中使用static关键字定义的变量是静态局部变量,只在函数第一次被调用时,分配内存并赋初值,函数再次被调用时,静态局部变量能保持上次退出函数时,遗留下来的值。2023-5-2354全局函数在定义和实现后,可以在其他位置使用extern关键字声明,并被使用。对于定义的全局变量,也可以使用该关键字声明使用。如果全局函数和全局变量在定义时,被限定为static,则不能在外部用extern声明使用

    26、。2023-5-2355常量和常量表达式使用const和constexpr关键字定义。使用const限定,表示在语法层面上限定不可修改。(实际上还是可以通过常量转换、可变成员限定等语法规则改变不可修改的限定)成员函数也可以使用const关键字限定,用于限定this隐含形参的类型。使用constexpr限定,表示在编译器即可得到结果,且该值没有途径可以修改。2023-5-2356当类实例对象变量被定义为常量时,相应的类数据成员也全变为常量,只有被mutable关键字限定的成员变量,仍可以被修改。2023-5-2357volatile关键字告诉编译器不要优化指定的变量。2023-5-2358在类中

    27、定义的类型转换函数,在表达式中会隐式转换,使用explicit关键字限定后,该转换将不得不使用明确的类似转换。2023-5-2359noexcept关键字用于限定函数,表示该函数不会抛出异常,C+编译器可以做相应的优化,不为函数生成异常捕捉代码。2023-5-2360virtual关键字用于定义虚函数。2023-5-2361override关键字用于明确定义继承的虚函数。2023-5-2362final关键字用于完结类定义和函数,不允许再被继承或覆盖。2023-5-2363inline关键字用于定义内联函数,该函数并不在栈中被调用,而是直接在调用处展开代码,提供更好的调用性能。2023-5-2364thread_local关键字用于定义线程变量,在不同的线程中会保持不同副本,保证线程的安全。

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

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


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


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

    163文库