还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
面向对象编程C++欢迎大家来到面向对象编程课程本课程将深入探讨语言中面向对C++C++象编程的核心概念、技术和应用通过系统学习,您将掌握如何利用强C++大的面向对象特性设计和实现高效、可维护的软件系统面向对象编程是现代软件开发中不可或缺的编程范式,而作为一种支持C++多种编程风格的语言,其面向对象特性尤为强大无论您是初学者还是有经验的程序员,本课程都将帮助您提升面向对象编程技能C++课程概述课程目标学习要求12本课程旨在帮助学生掌握学生需要具备基本的语C++面向对象编程的核心概言基础,包括数据类型、控C++念和技术通过理论学习和制结构、函数等知识课程实践练习,学生将能够使用期间需完成指定的编程作业语言设计和实现基于对和项目,积极参与课堂讨论C++象的程序,解决实际编程问和实践活动,通过自主学习题,并深入理解面向对象编拓展知识面程的思想和方法考核方式3考核将分为平时成绩()、实验和项目()以及期末考试30%30%()平时成绩包括出勤率、课堂表现和平时作业;实验项目40%重点考察学生的实际编程能力;期末考试则综合评估理论知识掌握情况第一章面向对象编程概述什么是面向对象编程面向对象面向过程的优势vs OOP面向对象编程是一种以对象为中心的编面向过程编程关注的是问题的解决步骤,面向对象编程具有多方面优势代码重程范式它将数据和行为封装在对象中,将程序看作一系列的函数调用而面向用性高,可通过继承复用已有代码;模通过对象之间的交互来实现程序功能对象编程则关注参与解决问题的实体,块化程度高,对象可作为独立单元开发面向对象编程的核心理念是将真实世界通过定义这些实体(对象)及其交互来和测试;维护成本低,封装使内部实现中的实体抽象为程序中的对象,每个对解决问题面向对象方法更接近人类思的修改对外部影响小;提高开发效率,象都有自己的属性和行为考问题的方式,更适合处理复杂系统抽象层次更高,更接近人类自然思维面向对象的三大特性多态同一接口,不同实现1继承2基类派生出子类,实现代码重用封装3数据和方法组合成类,隐藏实现细节面向对象编程的三大核心特性构成了其技术基础封装是最基本的特性,它将数据和操作这些数据的方法绑定在一起,对外隐藏实现细节,只公开必要的接口,增强了安全性和模块化继承允许子类继承父类的特性,实现代码重用,建立类之间的层次关系,便于创建和维护分类系统多态则使同一个行为具有多种不同表现形式,增强了代码的灵活性和扩展性,使得程序更易于修改和拓展语言特点C++语言的超集支持面向对象C保留了语言的所有特性和语引入了类、对象、继承、多态C++C C++法,包括指针操作、内存管理和高等面向对象编程机制,使得程序员效的底层控制这使得程序员可可以采用面向对象的方式设计程序C以平滑过渡到,同时也让这种编程范式提高了代码的重用性、C++具备了高性能和底层系统编程可维护性和可扩展性的面向C++C++的能力兼容大部分代码,对象特性非常强大,支持多重继承、C++C可以直接调用语言编写的函数和虚函数、抽象类等高级概念C库标准模板库()STL提供了强大的标准模板库,包含了常用的数据结构和算法,极大地提高C++了开发效率的容器、算法和迭代器设计精巧,性能优异,是程序STL C++员必备的工具箱的模板机制实现了类型安全和代码复用的完美结合STL第二章基础回顾C++数据类型1C++提供了丰富的数据类型,包括基本数据类型(如int,float,char等)和复合数据类型(如数组、结构体、指针等)C++11后又引入了新的类型如auto、decltype等理解数据类型及其内存表示是掌握C++的基础控制结构2C++的控制结构包括分支语句(if-else,switch-case)和循环语句(for,while,do-while)此外,C++还提供了goto语句和异常处理机制合理使用控制结构可以实现复杂的程序逻辑和流程控制函数3函数是C++程序的基本构建块C++支持函数重载、默认参数、内联函数等特性函数可以返回值,也可以通过引用或指针参数修改调用者提供的数据合理设计函数可以提高代码的模块化和可读性新特性C++引用函数重载默认参数引用是相对于语函数重载允许多个同名默认参数允许在函数声C++C言的一个重要扩展,本函数具有不同的参数列明时为参数指定默认值,质上是一个别名,必须表,编译器根据实参类调用时可以省略这些参在创建时初始化,初始型和数量自动选择合适数默认参数必须从右化后不能改变引用的对的函数版本调用这大向左指定,不能在函数象引用常用于函数参大增强了代码的表达能声明和定义中同时指定数和返回值,可以避免力,使函数名更直观,默认参数可以简化函数对象拷贝,提高效率同时保持接口一致性调用,提高代码可读性引用作为参数时,可以函数重载是多态性和灵活性,特别适合有C++直接修改原始数据,使的一种表现形式,称为多个可选配置的函数函数接口更加简洁编译时多态内存管理和操作符内存分配过程内存泄漏防范new deleteC++提供了new和delete操作符用于动态内存当使用new操作符时,系统首先分配足够的内C++内存管理的一个主要挑战是防止内存泄漏分配和释放new操作符分配内存并调用构造存空间,然后调用相应的构造函数初始化对象程序员需要确保每个new操作都有对应的函数,delete释放内存并调用析构函数对于这一过程是原子的,确保对象总是处于有效状态delete操作现代C++推荐使用智能指针(如数组,使用new[]和delete[]操作符这些操作如果内存分配失败,new操作符会抛出unique_ptr、shared_ptr)自动管理内存,遵符比C语言的malloc和free更安全、更面向对象std::bad_alloc异常,而不是返回空指针循RAII原则,通过对象生命周期管理资源第三章类与对象(上)对象的概念对象是类的一个实例,具有类定义的所有特性每个对象都有自己的状态(数据)和行2为(方法)对象是程序运行时的实体,占类的概念用内存空间,可以相互交互,构成程序的基类是面向对象编程的核心,它是用户C++本运行单元定义的数据类型,描述了特定种类的对象的共同属性和行为类是对象的模板,定义了1类的定义一组属性和方法,封装了数据和操作数据的中使用或关键字定义类类C++class struct方法,实现了数据抽象和信息隐藏定义包括成员变量(属性)和成员函数(方法)默认访问控制为,而class private3默认为类定义通常包括声明struct public和实现两部分,可以分离在头文件和源文件中类的成员数据成员数据成员是类中的变量,用于存储对象的状态信息数据成员可以是基本数据类型、指针、引用或其他类的对象在对象创建时,每个对象都有自己的数据成员副本,除非数据成员被声明为静态的成员函数成员函数是类中定义的函数,用于操作类的数据成员和实现类的行为成员函数可以访问类的所有成员,包括私有成员成员函数可以在类定义内部实现,也可以在类外实现,后者需要使用类名限定符访问修饰符提供了三种访问修饰符(公有成员,可从类外访问)、C++public(私有成员,只能在类内访问)和(保护成员,private protected可在类内和派生类中访问)访问修饰符控制类成员的可见性和可访问性,是实现封装的重要手段对象的创建与使用中创建对象的方式多样,可以创建栈对象(自动变量)、堆对象(动态分配)或全局静态对象栈对象声明形式为C++/ClassName,生命周期限于所在作用域堆对象通过创建,形式为,需要手objectName;new ClassName*pObject=new ClassName;动使用删除delete对象的初始化通常通过构造函数完成,可以使用直接初始化、复制初始化、列表初始化等多种形式后还引入了统一初始化语C++11法对象创建后,可以通过对象名和点运算符(对象成员)或通过指针和箭头运算符(指针成员)访问公有成员.-构造函数默认构造函数带参数的构造函数12默认构造函数是不带参数的构造带参数的构造函数允许在创建对函数,或者所有参数都有默认值象时提供初始值,实现对象的定的构造函数如果用户没有定义制化初始化参数可以有默认值,任何构造函数,编译器会生成一提高构造函数的灵活性带参数个隐式的默认构造函数默认构的构造函数对实现类的封装和保造函数在创建对象数组或者不提证对象状态的有效性非常重要供初始值的对象时会被调用构造函数重载3构造函数可以重载,即可以定义多个具有不同参数列表的构造函数,以支持不同的初始化方式重载构造函数使得类的使用更加灵活便捷在设计重载构造函数时应避免歧义,确保每个构造函数都有明确的用途析构函数析构函数的作用1析构函数负责清理对象占用的资源,如释放动态分配的内存、关闭文件、断开网络连接等析构函数的定义2析构函数名为类名前加,无参数无返回值,每个类只有一个析构函数~析构顺序对象析构顺序与构造顺序相反,先构造的后析构,子对象按声明顺3序逆序析构析构函数是中实现资源管理的关键机制,它与(资源获取即初始化)原则密切相关当对象生命周期结束时,析构函数自动调用,确C++RAII保资源被正确释放,防止资源泄漏对于管理动态资源的类,定义适当的析构函数尤为重要栈对象在离开作用域时自动调用析构函数;堆对象在被时调用析构函数如果类中有指针成员管理动态内存,析构函数必须负责释放这delete些内存在继承体系中,基类的析构函数应定义为虚函数,确保派生类对象被正确析构指针this区分同名局部变量和返回对象自身的引用在成员函数中访问成作为参数传递当前对判断两个对象是否相成员变量员象同this指针是C++中一个特殊的隐含指针,它指向调用成员函数的对象每个非静态成员函数都有一个this指针参数,虽然程序员不需要显式声明它this指针在成员函数内部使用,让函数能够访问调用它的对象的成员变量和成员函数this指针的一个重要应用是在成员函数中区分同名的参数和成员变量例如,在void setXintx{this-x=x;}中,this-x表示成员变量,而x表示参数另一个常见用法是在链式调用中返回对象自身的引用,如MyClass func{/*...*/;return*this;},这样就可以写出obj.func
1.func
2.func3这样的代码第三章类与对象(下)12静态成员常量成员静态成员由所有对象共享,不依赖于任何具常量成员函数不能修改对象的状态,通过在体对象,通过类名访问静态数据成员必须函数声明后加const实现常量对象只能调在类外定义和初始化,可用于计数或共享资用常量成员函数常量数据成员必须在构造源静态成员函数只能访问静态成员,不能函数初始化列表中初始化,不能在函数体内访问普通成员赋值3友元友元(函数或类)可以访问类的私有和保护成员友元破坏了封装性但增加了灵活性,应谨慎使用友元关系不是对称的、传递的或可继承的,需要显式声明运算符重载重载形式语法格式适用场景成员函数形式左操作数是当前类对象return_typeoperator#parameters;友元函数形式需要对称性或左操作数不friend return_type是本类对象operator#parameters;全局函数形式无需访问类的私有成员return_typeoperator#parameters;运算符重载使得用户自定义类型可以像内置类型一样使用C++的运算符,使代码更直观易读重载运算符实际上是具有特殊名称(operator+、operator=等)的函数,既可以作为成员函数实现,也可以作为非成员函数(通常是友元)实现并非所有运算符都可以重载,如条件运算符:、作用域解析运算符::、sizeof运算符等不能重载重载运算符时应遵循运算符的原始语义,如+应该表示某种加法关系,不应改变运算符的优先级和结合性特别注意的是,重载赋值运算符=、流运算符和以及下标运算符[]在类设计中的重要性第四章继承与派生继承的概念继承的语法继承类型继承是面向对象编程的核心机制之一,它中继承使用冒号语法支持单继承(一个派生类只有一个直C++class C++允许创建新类(派生类)时复用已有类接基类)和多重继承(一个派生类有多个Derived:access-specifier Base(基类)的属性和行为继承建立了类之可以是、直接基类)根据访问控制方式,又分为access-specifier public间的层次关系,形成是一种的关系通或,决定基类成员在派公有继承、保护继承和私有继承公有继protected private过继承,派生类自动获得基类的成员,同生类中的访问级别派生类中可以添加新承建立是一种关系,最为常用;保护和时可以添加新成员或重定义基类成员成员、重定义基类函数(非虚函数)或重私有继承主要用于实现细节的重用写基类虚函数派生类派生类的定义派生类的构造指定基类和继承方式,添加新成员,扩展基类功1先调用基类构造函数,再执行派生类构造函数体能2访问控制派生类的析构4通过继承方式确定基类成员在派生类中的可见性先执行派生类析构函数体,再调用基类析构函数3派生类定义时需要指定继承方式和基类,可以添加新的数据成员和成员函数,也可以重新定义基类的成员函数派生类的对象包含基类的子对象,因此派生类对象的内存布局通常包含基类部分和派生类新增部分派生类的构造过程先调用基类构造函数初始化基类部分,再执行派生类构造函数初始化派生类部分可以在派生类构造函数的初始化列表中显式指定调用基类的哪个构造函数,否则将调用基类的默认构造函数析构过程与构造过程相反,先执行派生类析构函数,再执行基类析构函数继承中的特殊关系公有继承公有继承(public inheritance)建立是一种关系,表示派生类是基类的一个特殊化基类的公有成员在派生类中仍为公有,保护成员在派生类中仍为保护,私有成员在派生类中不可访问公有继承允许将派生类对象赋给基类指针或引用,支持多态性保护继承保护继承(protected inheritance)通常用于实现继承基类的公有和保护成员在派生类中均变为保护成员,私有成员在派生类中不可访问保护继承的一个主要特点是,基类的公有接口对派生类可见,但对派生类的客户代码不可见,适用于需要限制外部访问的场景私有继承私有继承(private inheritance)通常用于实现复用,表示使用基类实现而非是一种关系基类的公有和保护成员在派生类中均变为私有成员,私有成员在派生类中不可访问私有继承适用于只想复用基类实现而不想继承其接口的场景多重继承多重继承的概念多重继承的实现多重继承的问题多重继承是支持的一种继承形式,多重继承的语法是在类声明中用逗号分多重继承最著名的问题是菱形继承,C++允许一个类直接继承多个基类多重继隔多个基类当一个类间接继承同一个基类多次时,class Derived:public承使一个类能够组合多个基类的特性,会导致基类的数据成员在派生类中出现Base1,protected Base2,private增强了代码复用的能力在多重继承中,派生类构造函数必须负责调多份副本,引起歧义和浪费此外,多Base3{}派生类拥有所有基类的数据成员和方法,用所有基类的构造函数,调用顺序为声重继承可能导致命名冲突,当多个基类是各个基类的特化与组合明继承顺序多重继承的析构顺序与构有同名成员时,派生类访问这些成员需造顺序相反要使用作用域解析运算符明确指定虚继承虚继承是解决菱形继承问题的机制,通过在继承声明前添加关键字实现虚继C++virtual classDerived:virtual publicBase{}承确保无论一个类在继承层次中出现多少次,在最终派生类中只有一个共享的基类子对象,避免数据冗余和歧义在虚继承中,虚基类的构造由最终派生类负责,中间类对虚基类构造函数的调用被忽略虚继承的内存布局比普通继承复杂,通常包含一个虚基类表指针,指向虚基类子对象虚继承增加了内存开销和访问成本,因此只应在必要时使用,尤其适合解决标准库中的多重继承问题第五章多态性(上)多态的概念静态多态动态多多态的实现机制vs态多态是面向对象程序设动态多态通过虚函C++计的关键概念,允许不C++支持两种多态静数表(vtable)和虚函同的类对同一消息作出态多态(编译时多态)数指针()实现vptr响应,每个类可以根据和动态多态(运行时多包含虚函数的类会有一自身特点对消息进行解态)静态多态通过函个虚函数表,存储虚函释多态使得程序能够数重载和模板实现,在数的地址;该类的每个以统一的方式处理不同编译时确定;动态多态对象都有一个虚函数指类的对象,增强了代码通过虚函数和继承实现,针,指向相应的虚函数的灵活性和可扩展性,在运行时确定静态多表调用虚函数时,通是实现开闭原则的重态效率高但灵活性低,过对象的虚函数指针找要机制动态多态灵活性高但有到虚函数表,再从表中一定运行时开销找到相应的函数地址虚函数虚函数的概念虚函数的声明和定义虚函数表虚函数是实现动态多态的核心机制,虚函数在基类中用关键字声明,如虚函数的实现机制基于虚函数表,每个包C++virtual它是在基类中声明并在派生类中重新定义派生类中可以重写基含虚函数的类都有一个虚函数表,表中存virtual voidfunc的成员函数通过在函数声明前加类的虚函数,不需要再添加关键字储了该类所有虚函数的地址类的每个对virtual virtual关键字,基类指针或引用在指向派生类对(但建议加上增强可读性)若要在派生象都包含一个指向虚函数表的指针(通常象时,调用虚函数将执行派生类版本而非类中显式调用基类版本,使用作用域解析是对象内存布局的第一个元素)当通过基类版本这种运行时的动态绑定机制是运算符,如引入了基类指针调用虚函数时,程序根据对象的Base::func C++11多态性的基础关键字,帮助编译器检查是否正虚函数表指针确定调用哪个版本的函数C++override确重写了基类虚函数纯虚函数与抽象类纯虚函数的定义抽象类的特点12纯虚函数是一种特殊的虚函数,包含至少一个纯虚函数的类称为在基类中只声明但不实现,在函抽象类抽象类不能直接实例化,数声明末尾加上表示例只能作为其他类的基类抽象类=0如的主要目的是定义接口,为派生virtual voidfunc=0;纯虚函数表示一个接口,强制派类提供一个统一的框架抽象类生类必须提供实现在特殊情况可以包含普通成员变量和函数,下,纯虚函数也可以在基类中提为派生类提供部分实现,实现代供定义,但派生类仍然必须重写码复用它抽象类的应用3抽象类在中广泛用于定义接口和实现框架设计它促进了基于接口编C++程的思想,使代码更加灵活和可扩展经典应用包括设计模式中的模板方法模式、策略模式等抽象类也是实现插件架构和组件化设计的基础,允许系统在不修改核心代码的情况下扩展功能第五章多态性(下)运行时类型识别()操作符RTTI typeidRTTI是C++提供的一种机制,允许程序在运行时获取对象的实际类型信息RTTI主要typeid运算符返回一个std::type_info对象的引用,该对象包含类型的信息对于多态通过typeid运算符和dynamic_cast运算符实现RTTI只对包含虚函数的类有效,因类型(包含虚函数的类),typeid返回对象的动态类型;对于非多态类型,返回静态为它依赖于虚函数表中的类型信息RTTI的使用应当谨慎,过度依赖可能导致设计不类型可以使用type_info::name获取类型名称(具体格式由编译器决定),使用良type_info的比较运算符比较类型123dynamic_castdynamic_cast用于安全地将一个基类指针或引用转换为派生类指针或引用如果转换失败(即对象不是目标类型或其派生类),指针转换返回nullptr,引用转换抛出std::bad_cast异常dynamic_cast只能用于包含虚函数的类层次,是实现多态代码安全类型转换的关键工具第六章模板类模板用于创建通用的类定义1函数模板2用于创建通用的函数定义模板的概念3参数化类型的通用编程技术模板是支持泛型编程的核心机制,允许编写与类型无关的代码模板使用关键字声明,后跟模板参数列表模板参数可以是类型C++template参数(用或关键字标识)或非类型参数(具体值,如整数)模板的实例化发生在使用模板时,编译器根据提供的具体参数生typename class成代码模板的主要优势在于代码复用和类型安全相比于宏,模板由编译器处理,提供了类型检查;相比于继承和多态,模板在编译时解析,没有运行时开销但模板也有缺点,如错误信息难以理解、代码膨胀(每个不同的实例化都会生成新代码)、编译时间增加等模板是(标准模STL板库)的基础,也是现代编程的重要工具C++函数模板函数模板的定义函数模板的实例化函数模板的特化函数模板是一种参数化的函数定义,使用函数模板在调用时实例化,编译器根据实参模板特化允许为特定类型提供定制的实现,关键字和类型参数声明基本语法类型推导模板参数,或者可以显式指定语法为template templatereturn_type为template typename T return_type function_namespecific_typeargs function_namespecific_typeparamet在函数体内,模板参数推导只考虑函数参数,不考虑返回当模板与特化版本都匹配时,编译器function_nameparameters ers可以使用类型参数定义变量、参数和返回值类型函数模板的每种不同参数组合都会生优先选择特化版本函数模板还支持重载,T类型函数模板可以有多个类型参数,还可成一个独立的函数实例,这可能导致代码膨允许多个同名但参数不同的模板定义,编译以包含非类型参数和默认模板参数胀器根据最佳匹配原则选择类模板类模板的定义类模板是参数化的类定义,使用template关键字和类型参数声明templatetypename T class ClassName{}类模板中可以使用类型参数T定义成员变量、成员函数参数和返回值类型类模板成员函数可以在类内定义,也可以在类外定义,后者需要使用template前缀和类名限定类模板的实例化类模板在声明对象时实例化,必须显式指定模板参数ClassNamespecific_type obj;与函数模板不同,类模板不能通过参数推导类型,C++17之前必须显式指定所有模板参数类模板的每种不同参数组合都会生成一个独立的类,成员函数只有在被使用时才会实例化类模板的特化类模板支持全特化和偏特化全特化为特定类型提供完全定制的实现templateclass ClassNamespecific_type{}偏特化只指定部分模板参数template typename TclassClassNameT*{},适用于指针、引用等类型修饰符特化使模板能够处理特殊类型的独特需求模板参数类型参数非类型参数默认模板参数类型参数是最常见的模板参数形式,使非类型参数是具有特定类型的值,如整模板参数可以有默认值,类似于函数默用或关键字声明,如数、指针或引用认参数typename classtemplate template typenameT=或非类型参数默认模板参数从右向左指定,有templatetypenameT templatetypenameT,int Sizeint两个关键字在功能上完全等必须是常量表达式,在编译时确定常默认值的参数右侧的所有参数也必须有class T价,但现代倾向于使用见的非类型参数包括整数常量、枚举常默认值函数模板的默认参数从C++typename C++11以避免与类定义混淆类型参数可以用量、指向对象或函数的指针、对对象或开始支持使用默认参数时,可以省略于变量声明、函数参数、返回类型等任函数的引用后也支持作为对应的模板实参C++17auto ClassNameobj;何需要类型名的地方非类型参数占位符表示使用所有默认参数第七章异常处理异常处理的概念异常处理是C++处理程序运行时错误的机制,它将错误检测与错误处理分离,提高代码的清晰度和健壮性异常处理基于抛出-捕获模型错误发生处抛出异常,合适的处理位置捕获并处理异常异常的传播会沿调用栈向上传递,直到被处理或导致程序终止语句try-catchtry块包含可能抛出异常的代码,catch块捕获并处理特定类型的异常一个try块可以有多个catch块,按顺序匹配异常类型可以使用catch...捕获任意类型的异常异常处理遵循栈展开过程,会调用局部对象的析构函数,确保资源正确释放,这是RAII(资源获取即初始化)设计的基础语句throwthrow语句用于抛出异常,可以抛出任何类型的值throw expression;通常抛出的是异常类对象,包含错误信息和上下文重新抛出当前异常使用不带表达式的throw;语句C++11引入noexcept说明符,声明函数不会抛出异常,违反声明将调用std::terminate结束程序异常类C++标准库提供了一个异常类层次结构,根类是std::exception,定义在exception头文件中标准异常类包括std::logic_error(表示可以在程序中预见的错误)和std::runtime_error(表示只能在运行时检测的错误)及其派生类,如std::out_of_range、std::invalid_argument等这些类提供了what方法返回错误描述自定义异常类通常继承自std::exception或其派生类,重写what方法提供错误信息良好的自定义异常类设计应包含充分的错误上下文信息,如错误位置、错误值等,以便更容易诊断问题异常类的继承层次应该反映错误的分类,更具体的错误应该从更一般的错误类派生,便于根据需要在不同层次捕获异常异常处理最佳实践异常安全异常安全是程序在异常发生时维持其正确行为的能力C++定义了三个异常安全保证级别基本何时使用异常异常处理策略保证(不泄露资源,保持有效状态)、强保证(操作成功或无效果)和不抛出保证(操作不会异常适用于处理非局部、不可恢复的错误,如资有效的异常处理策略包括在恰当的抽象层次处源耗尽、违反类不变式等异常不应用于常规控抛出异常)RAII(资源获取即初始化)是实现理异常;避免在析构函数中抛出异常;使用明确异常安全的关键技术,通过对象生命周期管理资制流或可预期的情况性能关键的代码段和嵌入的异常规范(通过注释或noexcept);将资源源,确保资源在异常情况下正确释放式系统中应谨慎使用异常,因为异常处理涉及开管理与错误处理分离;只在真正的错误情况下使销且不确定性构造函数失败时抛出异常是一种用异常;考虑异常对程序性能的影响异常应该常见实践,因为构造函数无法通过返回值表示失在能够有意义地处理它们的地方捕获,而不是简败单地忽略213第八章标准模板库()概述STL容器算法迭代器容器是存储对象集合的数据结构,包括顺序容算法是操作容器中元素的函数模板,独立于具迭代器是连接容器和算法的桥梁,提供了统一器(如、、)、关联容器体容器类型提供了大量通用算法,如排的接口访问容器元素迭代器模拟指针行为,vector listdeque STL(如、)和容器适配器(如、序、搜索、转换等,大部分定义在支持解引用和递增等操作根据支持的操作,set mapstack)容器负责内存管理,自动处理元素头文件中算法通过迭代器访问迭代器分为输入、输出、前向、双向和随机访queue algorithm的创建和销毁不同容器的性能特点各异,应容器元素,这种设计使算法与容器解耦,实现问五种类型不同容器提供不同类型的迭代器,根据实际需求选择合适的容器类型了高度的代码复用算法根据需要的迭代器类型工作顺序容器容器类型特点适用场景vector动态数组,连续内存,随机访问高效,尾部插入高效频繁随机访问,主要在尾部操作list双向链表,不连续内存,插入删除高效,不支持随机访频繁在任意位置插入删除问deque双端队列,分段连续内存,支持随机访问,两端插入删需要两端操作且需随机访问除高效vector是最常用的顺序容器,它实现了动态数组,支持高效的随机访问,在尾部添加和删除元素的复杂度为分摊常数时间vector的元素在内存中连续存储,这有利于缓存性能,但在中间插入或删除元素效率较低当元素数量超过当前容量时,vector会自动重新分配更大的内存块并移动所有元素,这一操作代价较高list实现了双向链表,支持常数时间的插入和删除操作(只要有迭代器指向操作位置)list的元素在内存中不连续存储,每个元素包含数据和指向前后元素的指针list不支持随机访问,访问特定位置的元素需要线性时间deque(双端队列)是一种折中的数据结构,它支持高效的随机访问和在两端的常数时间插入删除操作关联容器1set2map容器存储唯一键的集合,按照容器存储键值对,按照键排序set map键排序存储底层通常使用红黑树存储与类似,也通常使set map实现,提供对数时间复杂度的查找、用红黑树实现,提供对数时间复杂插入和删除操作中的元素不度的操作的键不可修改,但set map可修改(因为修改可能破坏排序),值可以修改提供了运算符,map[]但可以删除和重新插入适用可以通过键直接访问或插入值set于需要保持元素唯一性和有序性的适用于需要将键映射到值的场map场景,如实现数学集合操作景,如字典、配置信息等和3multiset multimap和是和的变体,允许存储重复的键可以multiset multimapset mapmultiset包含多个相同值的元素;可以将多个值关联到同一个键这些容器适multimap用于需要处理一对多关系的场景,如词频统计、分组数据等还引入了C++11无序关联容器(、等),基于哈希表实现,unordered_set unordered_map提供平均常数时间的查找容器适配器queue2先进先出的数据结构,默认基于deque实现stack1后进先出的数据结构,默认基于deque实现priority_queue优先级队列,默认基于vector和heap算法实现3容器适配器是基于基本容器实现的特殊容器,它们提供了受限的接口以支持特定的数据结构语义stack适配器实现了一个栈(后进先出),主要操作包括push(入栈)、pop(出栈)和top(查看栈顶元素)默认情况下,stack基于deque实现,但也可以指定使用list或vector作为底层容器queue适配器实现了一个队列(先进先出),主要操作包括push(入队)、pop(出队)、front(查看队首元素)和back(查看队尾元素)默认基于deque实现,也可以使用listpriority_queue实现了一个优先级队列,元素按优先级排序,每次pop返回优先级最高的元素默认情况下,priority_queue使用vector作为底层容器并使用堆算法实现,也可以自定义比较函数改变优先级定义迭代器随机访问迭代器1支持任意跳转和比较,如vector、deque双向迭代器2支持向前和向后移动,如list、set、map前向迭代器3只支持向前移动,如forward_list输入输出迭代器/4最基本的迭代器,如istream_iterator迭代器是STL的核心概念,它提供了一种统一的方式来访问不同容器的元素迭代器的设计受C指针启发,支持解引用(*it)、递增(++it)等操作每种容器都定义了自己的迭代器类型,通过begin和end成员函数获取迭代器,分别指向第一个元素和最后一个元素之后的位置迭代器根据支持的操作分为不同的类别,形成一个层次结构输入迭代器支持读取元素并前进;输出迭代器支持写入元素并前进;前向迭代器可多次遍历容器;双向迭代器可向后移动;随机访问迭代器支持任意跳转STL算法根据需要的迭代器能力指定要求,例如sort需要随机访问迭代器,而find只需要输入迭代器C++11还引入了反向迭代器(rbegin、rend)和常量迭代器(cbegin、cend)算法非修改序列算法修改序列算法排序和数值算法非修改序列算法不改变容器中元素的值和顺序,修改序列算法会改变容器中元素的值或顺序常排序算法包括sort(排序)、partial_sort(部只进行查找、计数和比较等操作常见的非修改见的修改算法包括copy(复制序列)、分排序)、nth_element(划分)等,要求随机算法包括find(查找元素)、count(计数元transform(变换序列)、replace(替换元访问迭代器数值算法定义在numeric头文素出现次数)、equal(比较两个序列)、素)、fill(填充序列)、remove(移除元素)、件中,包括accumulate(累加)、search(查找子序列)、for_each(对每个元unique(去除重复元素)、reverse(反转序列)inner_product(内积)、partial_sum(部分素应用函数)等这些算法通常只需要输入迭代等这些算法通常需要输出迭代器或更强的迭代和)、adjacent_difference(相邻差)等,主器,适用于所有容器类型器,某些需要双向或随机访问迭代器要用于数值计算此外还有二分查找算法(如binary_search、lower_bound)和合并、集合操作算法函数对象123函数对象的概念预定义函数对象自定义函数对象函数对象(仿函数)是可以像函数一样调用的对象,STL在functional头文件中提供了一系列预定自定义函数对象通过创建一个重载了operator的即实现了operator的类的实例相比普通函数,义的函数对象,包括算术运算(plus、minus、类实现函数对象可以有状态和多个重载的调用运函数对象可以携带状态、更容易内联优化,并能利multiplies等)、比较运算(less、greater、算符C++11引入了lambda表达式,提供了创建用模板生成多种变体函数对象是STL的重要组成equal_to等)和逻辑运算(logical_and、匿名函数对象的简便语法,大大简化了函数对象的部分,广泛用于算法的自定义行为logical_or、logical_not等)这些函数对象是模使用函数对象适配器如bind和mem_fn可以进一板类,可以适用于不同类型步扩展函数对象的能力第九章新特性C++11关键字关键字范围循环auto decltypefor中的关键字用于自动推导变关键字用于获取表达式的类型,范围循环()C++11auto decltypefor range-based forloop量类型,让编译器根据初始化表达式确而不计算表达式的值它常用于泛型编是一种简化的迭代语法for auto定变量类型这简化了复杂类型的声明,程中,可以根据一个表达式的类型声明,它自动迭代容器中item:container尤其是在使用模板和迭代器时适变量或函数返回类型与的每个元素范围循环适用于任何提auto decltypeauto for用于局部变量、循环控制变量和函数结合,可以实现返回类型后置语法供和方法或可以用for beginend beginc返回类型后置声明使用可以提高,这在和全局函数访问的序列,包括auto autofunc-decltypeexpr endc代码的可维护性,减少类型不匹配错误,返回类型依赖于参数类型的函数模板中容器、数组和初始化列表这种语法STL但过度使用可能降低代码可读性特别有用使代码更简洁、更不容易出错,特别是避免了迭代器相关的错误智能指针unique_ptr shared_ptr weak_ptrunique_ptr实现独占所有权语义,同一时刻只有一shared_ptr实现共享所有权语义,多个shared_ptr weak_ptr是shared_ptr的伴随类,它观察个unique_ptr可以指向一个资源它不允许复制,可以指向同一个资源它使用引用计数跟踪指向资shared_ptr管理的对象但不参与引用计数但可以移动(转移所有权)unique_ptr在析构时源的智能指针数量,当最后一个shared_ptr析构时,weak_ptr不会延长对象的生命周期,可以通过自动删除其管理的对象,防止内存泄漏资源会被释放shared_ptr支持复制和移动,每次lock方法获取一个shared_ptr,若对象已被释放unique_ptr适合表示独占资源的所有权,如动态分复制会增加引用计数,每次析构会减少引用计数则返回空shared_ptrweak_ptr主要用于解决配的对象、文件句柄等,是现代C++中动态内存管shared_ptr适合多个对象需要共享资源的场景shared_ptr可能导致的循环引用问题,以及需要临理的首选工具时访问但不拥有对象的场景表达式Lambda表达式语法捕获列表LambdaLambda表达式的基本语法是捕获列表指定了Lambda表达式如何[capture]parameters-访问外部作用域的变量[=]表示按值return_type{body}捕获列表捕获所有外部变量,[]表示按引用捕[capture]定义了外部变量的访问方式;获所有外部变量也可以指定特定变参数列表parameters与普通函数参量[x,y]表示按值捕获x、按引用数类似;返回类型说明-捕获yC++14引入了泛型Lambda,return_type是可选的,通常由编译允许在参数类型使用auto;C++14还器推导;函数体{body}包含实际的引入了初始化捕获,允许在捕获列表代码Lambda表达式可以不接受参中创建和初始化新变量数,此时可以省略空的参数列表表达式的使用LambdaLambda表达式在需要短小函数对象的地方特别有用,如STL算法的谓词、自定义排序规则、GUI事件处理等它避免了定义单独的函数或函数对象类,使代码更紧凑Lambda表达式可以立即调用,也可以赋值给auto变量或std::function对象供以后使用在性能关键场景中,Lambda比函数指针更高效,因为它更容易内联右值引用和移动语义引入了右值引用(使用声明),用于表示临时对象或即将销毁的对象右值引用是移动语义的基础,它允许窃取临时对象C++11的资源而非复制函数将左值转换为右值引用,表明对象可以被移动这一机制显著提高了涉及大量数据移动的操作效率,std::move如容器元素的添加和返回大对象的函数移动构造函数和移动赋值运算符是支持移动语义的关键成员函数它们接受右值引用参数,从源对象窃取资源(如动态分配的内存、文件句柄等),然后将源对象置于有效但未指定的状态标准库容器都支持移动语义,大大提高了性能还引入了完美转发,C++11通过在泛型代码中保持参数的值类别(左值右值),使模板函数能够精确地传递参数std::forward/第十章设计模式简介设计模式的分类设计模式通常分为三大类创建型模式、结构型模式和行为型模式创建型模式关注对象的创建机制,如单例模式、工厂方法等;结构型模式关注类和对象的组织方式,如适配器模式、装饰器模式等;行为型模设计模式的概念式关注对象间的交互和责任分配,如观察者模式、策略模式等每种模式都有特定的适用场景和实现技巧设计模式是软件设计中常见问题的典型解决方案,2是经过验证的、可复用的设计经验它们不是具体的代码,而是解决特定问题的模板设计模式1常见设计模式举例帮助开发者使用经过实践检验的范式,避免重复发明轮子,提高代码质量和可维护性设计模式常见的设计模式包括单例模式(确保类只有一个实的使用需要考虑具体上下文,不应过度使用或强例)、工厂模式(封装对象创建过程)、适配器模式3行套用(使不兼容的接口协同工作)、观察者模式(定义对象间一对多的依赖关系)、策略模式(定义一系列算法并使它们可互换)、命令模式(将请求封装为对象)、装饰器模式(动态添加功能)等C++标准库中使用了多种设计模式,如迭代器模式和适配器模式单例模式单例模式的概念1单例模式(Singleton Pattern)确保一个类只有一个实例,并提供一个全局访问点单例模式适用于需要全局唯一实例的情况,如配置管理器、连接池、线程池等单例的实现需要私有构造函数、禁止复制和移动、静态实例获取方法单例模式的使用需要谨慎,可能导致全局状态、隐藏依赖关系和测试困难懒汉式饿汉式2vs单例模式有两种主要实现方式懒汉式和饿汉式懒汉式在首次请求时创建实例(延迟初始化),优点是按需创建,缺点是需要处理多线程安全问题饿汉式在程序启动时就创建实例,优点是实现简单且线程安全,缺点是即使不使用也会创建实例C++11引入的局部静态变量初始化线程安全特性,使懒汉式实现变得简单线程安全的单例3在多线程环境中,单例模式需要确保线程安全传统方法使用双检锁(DCLP)+volatile,但在C++中存在内存模型问题C++11提供了更好的方法使用局部静态变量(函数内static)实现懒汉式单例,标准保证其初始化是线程安全的对于既需要线程安全又需要控制销毁时机的单例,可以结合智能指针和互斥锁实现工厂模式抽象工厂工厂方法抽象工厂模式(Abstract Factory)提供一个创简单工厂工厂方法模式(Factory Method)定义一个创建建一系列相关或相互依赖对象的接口,而无需指定简单工厂模式(Simple Factory)使用一个工厂对象的接口,但由子类决定实例化哪个类每种产它们的具体类它适用于需要创建产品族的场景,类负责创建产品对象客户端通过参数指定所需产品类型对应一个具体工厂类这种模式将产品创建如不同风格的UI组件抽象工厂模式使产品族的切品类型,工厂根据参数创建并返回相应产品简单延迟到工厂子类,符合开闭原则,添加新产品只需换变得容易,增强了系统的一致性缺点是添加新工厂将对象创建逻辑集中管理,客户端无需了解具添加新的产品类和工厂类缺点是类的数量增加,产品需要修改抽象工厂接口和所有具体工厂实现体产品类缺点是工厂类职责过重,违反开闭原则,系统复杂度上升添加新产品需要修改工厂类代码观察者模式复杂度评分灵活性评分可维护性评分观察者模式(Observer Pattern)定义了对象间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会收到通知并自动更新这种模式由主题(Subject)和观察者(Observer)两个核心角色组成主题维护观察者列表并通知观察者状态变化;观察者定义接收通知的接口观察者模式的优点包括降低对象间的耦合度,支持广播通信,符合开闭原则缺点包括可能引起循环依赖、通知顺序不确定,以及可能导致性能问题(当观察者很多或通知操作很频繁时)观察者模式在GUI编程、事件处理系统、发布-订阅系统中广泛应用C++实现观察者模式可以使用指针/引用、std::function或信号槽机制第十一章面向对象编程最佳C++实践代码重用原则代码优化技巧SOLID有效的代码重用是面向对是面向对象设计的面向对象编程中的性SOLID C++象编程的主要目标之一五个基本原则的首字母缩能优化技巧包括避免虚提供了多种代码重用写单一职责原则()、函数调用开销(适当使用C++S机制类继承(建立是一开闭原则()、里氏替关键字);使用移动O final种关系)、组合(建立换原则()、接口隔离原语义避免不必要的复制;L有一个关系)、模板(参则()和依赖反转原则合理设计内存布局,考虑I数化类型)和策略模式等()这些原则指导如缓存友好性;使用编译时D一般而言,组合优于继承,何组织类和接口,使系统多态(模板)代替运行时因为继承建立了紧密耦合,更加模块化、可理解和可多态(虚函数);合理使而组合更灵活正确选择维护在中,通过抽用内联函数;避免过度封C++重用机制,可以显著提高象类、虚函数和模板等机装导致的函数调用开销开发效率和代码质量制可以实现这些原则优化应基于实际性能分析,而不是主观臆断课程总结进阶方向深入源码分析、设计模式、并发与分布式编程1STL学习建议2实践结合理论、阅读优质代码、参与开源项目知识点回顾3三大特性、类与对象、继承多态、、现代特性OOP STL C++本课程系统地介绍了面向对象编程的核心概念和技术,包括封装、继承、多态三大特性,类与对象的定义和使用,构造函数和析构函数,C++运算符重载,继承与派生,多态性和虚函数,模板编程,异常处理,,以及新特性等内容STL C++11通过本课程的学习,您应该掌握了如何使用设计和实现面向对象系统,了解了面向对象编程的思想和方法,以及如何在中应用各种设C++C++计模式进一步的学习方向包括深入研究实现原理,掌握更多高级设计模式,学习并发编程和网络编程,以及关注、等STLC++C++17C++20新标准带来的特性持续练习和实践是提高编程能力的关键C++参考资料与推荐读物经典书籍在线学习资源练习平台C++《》最全面的入门书最权威的参提供大量算法题目,可以使C++Primer C++cppreference.com C++LeetCode籍,深入浅出地介绍的各个方面考网站,提供了标准库的详细文档用解答,是练习编程能力的好C++C++C++C++《》和《另一个流行的参平台提供各种难度的Effective C++More cplusplus.com C++HackerRank》的经考网站,包含教程、参考和论坛编程挑战,包括语言特性的练习Effective C++Scott MeyersC++典著作,介绍了许多实用的编程技解决具体编程问题的竞争性编程平台,有定期C++Stackoverflow Codeforces巧和最佳实践《深度探索对象模问答社区,有大量相关问题和高质比赛和丰富的问题库查找开C++C++GitHub型》的经典之作,量答案源项目并阅读代码,或者创建自己Stanley LippmanYouTube ChannelC++详细解析了对象在内存中的表示和会议的官方频道,有的项目各大企业的开源项目,如C++CppCon C++各种机制的实现《标准库》大量高质量的讲座视频、的、的等,C++C++Coursera GoogleAbseil FacebookFolly的著作,全面介绍和上的进阶课程都是学习高质量代码的好资源Nicolai JosuttisC++edX UdemyC++C++标准库的使用。
个人认证
优秀文档
获得点赞 0