还剩46页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
程序设计清华大学课C++件精讲课程简介与学习目标清华大学课程体系概述C++本课程是清华大学计算机科学与技术专业的核心课程,涵盖语言C++的完整知识体系课程设计注重理论与实践相结合,通过大量编程练习和项目实战,培养学生的编程思维和解决问题的能力课程目标与实践意义发展历程C++1语言时代C年由开发,奠定了系统编程语言的基础,以其简洁1972Dennis Ritchie高效著称2诞生C++年在语言基础上开发了,引入了面向对1983Bjarne StroustrupC C++象编程概念3标准化发展从到,语言不断演进,增加了模板、、智能指针等现C++98C++23STL代特性4现代应用广泛应用于游戏开发、系统软件、金融系统、人工智能等高性能计算领域编程环境C++主流开发工具配置与调试方式是平台最受欢迎的开发环境,提环境配置包括编译器安装、路径设置、库文件链接等步骤调试Visual StudioWindows C++供了强大的智能代码补全、调试器和项目管理功能技巧涵盖断点设置、变量监视、内存检查等实用方法()是和平台的掌握命令行编译和图形化调试两种方式,能够适应不同的开GCC GNUCompiler CollectionLinux macOSIDE标准编译器,支持最新的标准,具有优秀的代码优化能力发场景和团队协作需求C++基本语法要素C++基本数据类型变量声明与初始化提供了丰富的内置数据类变量必须先声明后使用,支持多C++型,包括整型(、、种初始化方式引入了统int longC++11)、浮点型(、一初始化语法,使代码更加清晰short float)、字符型()和和安全理解变量的作用域和生double char布尔型()每种类型都有命周期对编写高质量代码至关重bool特定的存储大小和取值范围要常量定义关键字用于定义常量,用于编译时常量常量的使用能const constexpr够提高代码的可读性和安全性,避免意外修改重要数值输入与输出基本输入操作使用对象从标准输入读取数据,支持各种数据类型的自动cin转换掌握输入流的状态检查和错误处理机制基本输出操作对象用于向标准输出写入数据,支持流式操作符的链cout式调用理解输出缓冲区的工作原理和刷新时机格式化输入输出使用库中的操纵符控制输出格式,如设置精度、对齐iomanip方式、填充字符等掌握格式化技巧能够让程序输出更加美观和专业程序结构与流程控制顺序结构选择结构程序按照代码编写顺序逐行执行,是最基本使用和语句根据条件选择执if-else switch的程序结构行不同的代码分支跳转语句循环结构、、等语句用于改变、、循环用于重复执行break continuegoto forwhile do-while程序的正常执行流程特定代码块函数模块化设计函数声明与定义函数声明告诉编译器函数的存在,函数定义提供具体实现分离声明和定义有助于代码组织和编译效率的提升理解函数原型的作用和重要性参数传递机制掌握值传递、指针传递和引用传递三种参数传递方式的区别和适用场景理解形参和实参的关系,以及参数传递对程序性能的影响函数返回值函数可以返回各种类型的值,包括基本类型、指针、引用等学会使用语句控制函数执行流程和返回结果return作用域与可见性全局作用域在所有函数外定义的变量具有全局作用域文件作用域使用关键字限制在当前文件内可见static函数作用域函数内定义的变量只在函数内部可见块作用域在大括号内定义的变量具有最小的作用域对象的生存期静态生存期自动生存期动态生存期静态变量在程序启动时自动变量在进入作用域通过操作符动态分new创建,程序结束时销时创建,离开作用域时配的对象,需要程序员毁它们在整个程序运自动销毁这是最常见显式使用释放内delete行期间都存在,但只初的变量生存期类型,由存动态对象的生存期始化一次静态局部变编译器自动管理内存分完全由程序员控制,使量在函数首次调用时初配和释放用不当容易造成内存泄始化漏数组与指针基础数组的声明与使用指针变量与数组关系一维数组是相同类型元素的连续存储集合,通过下标访问元素指针是存储内存地址的变量,可以指向任何类型的数据指针算多维数组可以看作数组的数组,在内存中按行主序存储术运算允许通过指针遍历数组元素数组大小必须在编译时确定,不能动态改变理解数组名实际上数组名可以隐式转换为指向首元素的指针,但数组本身不是指是指向第一个元素的指针常量针掌握指针与数组的等价性对理解内存模型很重要C++动态内存分配内存分配使用对象使用操作符在堆上动态分配内存,通过指针访问和操作动态分配的对象,new返回指向分配内存的指针执行相关业务逻辑异常处理内存释放处理内存分配失败等异常情况,确保程使用操作符释放动态分配的内delete序的健壮性存,避免内存泄漏引用与常量参数1引用的基本概念2常量引用的优势引用是已存在变量的别名,必常量引用参数避免了不必要的须在声明时初始化且不能重新拷贝开销,特别适用于传递大绑定到其他变量引用提供了型对象同时确保函数不会修比指针更安全、更直观的间接改传入的参数,提高了代码的访问方式安全性和可读性3引用在函数参数中的应用使用引用参数可以实现函数对实参的直接修改,避免了指针操作的复杂性这是相对于语言的重要改进之一C++C结构体与联合体结构体()的特点联合体()的应用struct union结构体是将不同类型的数据组合成一个整体的复合数据类型每联合体的所有成员共享同一块内存空间,任何时候只能存储其中个成员都有独立的内存空间,可以同时存储多个不同类型的值一个成员的值这种设计节省了内存空间,适用于互斥数据的存储中的结构体相比语言增强了功能,支持构造函数、析构函联合体常用于底层编程、网络协议解析、硬件接口等场景,需要C++C数和成员函数,实际上与类非常相似,默认访问权限为谨慎使用以避免数据覆盖问题public枚举类型传统枚举()强类型枚举(enum enum)class传统枚举为一组相关的整数常量提供了命名,提高了代码的可读引入的强类型枚举解决了C++11性枚举值会隐式转换为整型,传统枚举的类型安全问题它不这在某些情况下可能导致类型安会隐式转换为整型,必须使用作全问题用域解析符访问枚举值,避免了命名冲突枚举的实际应用枚举类型广泛用于状态机、错误代码、配置选项等场景合理使用枚举可以让代码更加清晰,减少魔法数字的使用,提高程序的可维护性类与对象基础类的定义类是用户自定义的数据类型,封装了数据和操作数据的方法对象实例化对象是类的具体实例,每个对象都有独立的内存空间数据成员类中的变量,用于存储对象的状态信息成员函数类中的函数,用于操作对象的数据和实现功能构造函数与析构函数对象创建当对象被创建时,构造函数自动调用,负责初始化对象的数据成员构造函数可以重载,支持不同的初始化方式对象使用对象在其生命周期内可以调用各种成员函数,执行相应的操作对象的状态可能在使用过程中发生变化对象销毁当对象超出作用域或被显式删除时,析构函数自动调用,负责清理资源,如释放动态分配的内存类的继承基类设计基类定义了通用的属性和方法,为派生类提供公共接口单继承派生类从一个基类继承,获得基类的所有公有和保护成员多继承派生类可以从多个基类继承,需要注意菱形继承问题派生类与基类指针123向上转型动态绑定类型安全派生类对象可以隐式转换为基类指针,这通过虚函数实现运行时的函数调用绑定,向下转型需要使用进行安dynamic_cast是多态的基础机制提供了真正的多态行为全的类型转换检查多态与虚函数函数覆盖虚函数声明派生类重新定义基类的虚函数,实现特定行在基类中使用关键字声明虚函数virtual为虚函数表动态绑定编译器为每个类维护虚函数表,支持多态机运行时根据对象的实际类型调用相应的函数制版本封装与数据隐藏私有成员()private只能在类内部访问,实现完全的数据隐藏保护成员()protected类内部和派生类可以访问,支持继承体系公有成员()public任何地方都可以访问,提供类的对外接口静态成员与静态函数静态数据成员静态数据成员属于整个类而不是特定对象,所有对象共享同一份数据它在程序启动时初始化,直到程序结束才销毁常用于实现计数器、单例模式等静态成员函数静态成员函数不依赖于特定对象,只能访问静态数据成员和其他静态成员函数它没有this指针,可以通过类名直接调用,常用于工厂方法、工具函数等场景应用场景静态成员广泛应用于单例模式、对象计数、共享配置信息等场景合理使用静态成员可以减少内存占用,提供便捷的类级别功能访问方式友元与运算符重载友元机制运算符重载友元函数可以访问类的私有和保护成员,但不是类的成员函数运算符重载允许用户定义类型使用内置运算符,使代码更加直友元类的所有成员函数都可以访问另一个类的私有成员观可以重载的运算符包括算术、比较、赋值、下标等运算符友元破坏了封装性,应谨慎使用通常用于运算符重载、输入输出流操作符等需要访问私有数据的场景重载运算符时要保持语义的一致性,遵循用户的直觉期望某些运算符如赋值运算符、下标运算符通常作为成员函数重载名字空间与作用域解析命名空间定义关键字用于定义命名空间,将相关的类、函数、变量组织在namespace一起,避免命名冲突命名空间可以嵌套定义,支持分布式声明作用域解析操作符双冒号()操作符用于指定名字所属的作用域可以访问全局作用::域、特定命名空间或类的成员正确使用作用域解析符能够消除命名歧义声明与指令using声明引入特定名字到当前作用域,指令引入整个命名using using空间合理使用能够简化代码,但要避免引入过多名字造using成冲突预处理命令文件包含指令宏定义与替换指令用于包含头文件,指令定义宏,在编译前#include#define分为系统头文件(尖括号)和用进行文本替换虽然现代推C++户头文件(引号)两种形式正荐使用常量和内联函数,const确的头文件组织是大型项目成功但宏在某些场景下仍然有用的关键条件编译、、等指令实现条件编译,用于平台兼容性、调试控#ifdef#ifndef#if制、特性开关等这是实现跨平台代码的重要技术多文件结构与工程管理头文件设计头文件包含类声明、函数原型、常量定义等接口信息使用头文件保护符(或)防止重复包含良好的头#ifndef#pragma once文件设计是模块化编程的基础实现文件分离实现文件包含具体的函数定义和类方法实现分离声明和实现可以减少编译依赖,提高编译速度,同时保护实现细节不被外部直接访问构建系统管理、等构建工具用于管理复杂项目的编译过程掌Makefile CMake握构建系统能够有效组织大型项目,实现增量编译和跨平台构建字符串处理C++风格字符串类C std::string风格字符串是以空字符结尾的字符数组,使用或是标准库提供的字符串类,自动管理内存,提C char*char[]std::string C++表示需要手动管理内存和边界检查,容易出现缓冲区溢出等安供了丰富的字符串操作方法支持动态调整大小,比风格字符C全问题串更安全和便利标准库提供了、、等函数进行字符串操类重载了多个运算符,支持字符串连接、比较、赋值等操C strlenstrcpy strcatstring作,但这些函数不提供自动的安全检查,需要程序员格外小心作提供了查找、替换、截取等常用字符串处理功能初步容器与迭代器STL容器容器vector list动态数组,支持随机访问和尾部高效插入删双向链表,支持任意位置的高效插入删除操除作迭代器容器map统一的容器访问接口,类似于指针的抽象关联容器,基于红黑树实现的键值对存储算法库STL排序算法查找算法变换算法函数提供了高效的排序功能,、、等、等算法用于sort findfind_if binary_search transformfor_each默认使用快速排序的优化版本支算法提供了强大的查找功能这些对容器元素进行批量处理结合持自定义比较函数,可以对各种容算法可以在各种容器中高效地查找表达式或函数对象,可以lambda器中的元素进行排序特定元素或满足条件的元素实现复杂的数据变换操作保证相等元素的相对stable_sort顺序不变异常处理Exception异常抛出使用语句抛出异常对象,可以是任何类型的值当程序throw遇到无法处理的错误情况时,抛出异常来通知调用者异常捕获语句块用于捕获和处理异常不同类型的异常可以用try-catch不同的块处理,实现精确的错误处理策略catch资源清理异常发生时,栈展开过程会自动调用局部对象的析构函数技术确保资源的正确释放,避免内存泄漏RAII文件输入与输出文件流对象创建用于读取文件,用于写入文件,支持读写操ifstream ofstreamfstream作创建文件流对象时可以指定文件名和打开模式,如二进制模式、追加模式等文件操作执行使用流操作符和进行格式化读写,或使用、方法read write进行二进制操作可以通过、方法控制文件指针位seekg seekp置错误检查与关闭检查文件流的状态标志,如、等,确保文件操作的正确fail eof性文件使用完毕后应及时关闭,或依赖析构函数自动关闭表达式基础Lambda捕获列表方括号内指定如何捕获外部变量,支持值捕获和引用lambda捕获参数列表圆括号内定义函数的参数,语法与普通函数相同lambda返回类型可选的返回类型声明,编译器通常能够自动推导函数体大括号内包含函数的具体实现代码lambda模板编程函数模板用关键字定义泛型函数,支持类型参数化template类模板定义泛型类,可以用不同类型实例化相同的类结构模板特化3为特定类型提供特殊的模板实现,优化性能或行为深入对象模型指针机制this是指向当前对象的隐式指针,在成员函数中自动可用通过指针,this this成员函数可以访问调用该函数的具体对象的数据成员理解指针有this助于深入理解面向对象机制对象内存布局对象在内存中的布局包括数据成员的存储和虚函数表指针编译器可能添加填充字节以满足对齐要求理解内存布局对性能优化和底层编程很重要对象身份与生命周期每个对象都有唯一的内存地址作为其身份标识对象的生命周期从构造函数执行开始,到析构函数执行结束正确管理对象生命周期是编写可靠程序的关键成员与const mutable成员函数关键字const mutable成员函数承诺不修改对象的状态,可以被对象调关键字允许在成员函数中修改特定的数据成员const constmutable const用在函数声明和定义时都要加上关键字成员函通常用于缓存、计数器等不影响对象逻辑状态的辅助数据const const数中只能调用其他成员函数const的使用应该谨慎,只有在确实需要在环境下修改mutable const正确性是编程的重要概念,有助于编写更安全、更清某些数据时才使用过度使用可能破坏的语义const C++mutable const晰的代码编译器会检查约束,防止意外修改const新特性概览C++11nullptr关键字auto类型安全的空指针常量,替代传统的NULL自动类型推导,简化复杂类型的声明范围循环for简化容器遍历的语法糖,提高代码可读性智能指针表达式lambda自动内存管理,减少内存泄漏风险匿名函数对象,支持函数式编程风格智能指针与资源管理unique_ptr shared_ptr weak_ptr独占所有权的智能指针,不能被复制共享所有权的智能指针,使用引用计弱引用智能指针,不影响对象的生命只能移动当超出作用域数管理对象生命周期多个周期,用于打破的循环引unique_ptr shared_ptr时自动删除所管理的对象适用于明可以指向同一个对象,当用可以检查所引用的对象是否仍然shared_ptr确单一所有者的场景,是最轻量级的最后一个被销毁时,对象存在,提供安全的对象访问方式shared_ptr智能指针才被删除函数对象与回调机制1函数对象()回调机制实现与算法协作Functor STL通过重载操作符创建的函数对象常用作回调函数,传递给算法大量使用函数对象作为参operator STL可调用对象,比普通函数指针更灵算法或事件处理系统相比函数指数,如的比较函数、的sort find_if活函数对象可以携带状态信息,针,函数对象提供了更好的类型安谓词函数等结合表达lambda支持内联优化,在算法中广泛全性和性能,同时保持了代码的可式,可以创建简洁而强大的算法调STL使用读性用现代的思想C++RAII资源获取自动管理在对象构造时获取资源,如内存分配、利用的栈语义和析构函数,自动管C++文件打开、锁获取等理资源的生命周期资源释放异常安全对象销毁时在析构函数中自动释放所有即使发生异常,析构函数仍会被调用,获取的资源确保资源正确释放调试与单元测试调试技巧与工具单元测试框架是下强大的命令行调试器,支持断点设置、变量查是中最流行的单元测试框架,提供了丰富的断GDB LinuxGoogle TestC++看、堆栈跟踪等功能提供了友好的图形化调试言宏和测试组织功能是另一个轻量级的测试框架,具Visual StudioCatch2界面,集成了内存检查、性能分析等工具有简洁的语法和强大的功能掌握调试技巧包括合理设置断点、监视变量变化、分析调用堆良好的单元测试可以确保代码质量,便于重构和维护测试驱动栈、检查内存状态等有效的调试能够快速定位问题,提高开发开发()是现代软件开发的重要实践方法TDD效率常见错误解析C++内存相关错误内存泄漏、悬垂指针、双重删除、数组越界等是中最常见C++的运行时错误使用智能指针、边界检查、内存分析工具可以有效预防这些问题编译时错误语法错误、类型不匹配、模板实例化失败等编译错误通常比较容易发现和修复理解编译器错误信息的含义,掌握常见错误模式很重要逻辑错误算法错误、边界条件处理不当、并发竞争条件等逻辑错误最难发现需要通过代码审查、测试覆盖、静态分析等手段来预防和发现性能优化建议编译器优化使用或优化级别启用编译器优化,可以显著提升程序性-O2-O3能编译器能够进行内联展开、循环优化、死代码消除等多种优化理解不同优化级别的权衡很重要代码层面优化避免不必要的拷贝构造、合理使用引用传递、选择合适的容器类型、减少函数调用开销等使用性能分析工具识别热点代码,针对性地进行优化算法与数据结构选择合适的算法和数据结构往往比底层优化更重要理解时间复杂度和空间复杂度,根据具体应用场景选择最优的解决方案缓存友好的数据访问模式也很关键工程实践管理代码风格规范版本控制系统团队协作经验统一的代码风格提高了是现代软件开发的标代码审查、持续集成、Git代码的可读性和维护准版本控制工具,支持文档编写、测试覆盖等性分布式开发、分支管都是成功团队项目的重Google C++、理、合并冲突解决等功要要素建立良好的开Style GuideLLVM等能掌握工作流程对发流程和沟通机制,确Coding StandardsGit都是广泛采用的规范团队协作至关重要保项目质量和进度使用等工clang-format具可以自动格式化代码项目案例分析学生管理C++系统需求分析与设计学生管理系统需要管理学生基本信息、课程成绩、选课记录等设计、、等核心类,使用继承和组合关系建立对象模型Student Course Grade考虑数据持久化和用户交互界面核心类实现类包含姓名、学号、年级等属性,提供信息查询和修改方法Student类管理课程信息和选课学生列表类关联学生和课程,记录CourseGrade成绩信息使用容器管理对象集合STL系统集成测试实现菜单驱动的用户界面,提供学生信息管理、成绩录入查询、统计分析等功能编写单元测试验证核心功能,进行集成测试确保系统稳定性典型算法实战排序与查找On²冒泡排序简单但效率较低的排序算法,适合学习和小规模数据排序On logn快速排序平均情况下最高效的比较排序算法,STL sort的基础实现Olog n二分查找在有序序列中进行高效查找的经典算法O1哈希查找平均情况下最快的查找方法,unordered_map的实现基础跨平台开发与移植性平台差异分析移植性最佳实践和在文件系统、线程模型、动态库加载等方面使用标准特性而非编译器特定扩展,利用预处理器宏处理平Windows LinuxC++存在差异使用反斜杠作为路径分隔符,使用台相关代码采用等跨平台构建系统,统一管理不同平Windows LinuxCMake正斜杠不同平台的换行符、字符编码也可能不同台的编译配置编译器差异包括、、在语言特性支持、优化设计抽象接口隔离平台相关实现,使用工厂模式或策略模式处理MSVC GCC Clang策略、错误报告等方面的不同了解这些差异有助于编写可移植平台差异进行持续的多平台测试确保代码质量的代码与其他语言接口C++语言兼容性集成C Python几乎完全兼容语言,可以使用、等工具可C++C Pybind11SWIG直接调用库函数使用以方便地创建的绑C externC++Python指令防止名字修饰,确定这允许在中调用高C C++Python保函数的正确链接这种兼容性能的代码,或在程序CC++C++性使得可以复用大量现有的中嵌入脚本引擎C++Python代码库C跨语言注意事项不同语言的内存管理、异常处理、数据类型映射等机制可能不同需要处理数据转换、错误传播、资源管理等问题,确保接口的稳定性careful和安全性清华课程作业与考试模式编程作业类型考试题型分析课程作业通常包括基础语法练考试通常包含选择题、填空习、算法实现、面向对象设题、程序分析题、编程题等多计、小型项目开发等类型作种题型重点考察语法掌握、业难度递增,从简单的控制结面向对象理解、使用、程STL构练习到复杂的系统设计,全序调试等核心技能机试环节面考察学生的编程能力要求学生在限定时间内完成编程任务学习高分建议勤练编程基本功,熟练掌握使用;深入理解面向对象思想,不仅会IDE用还要知道为什么;多做项目实践,培养工程思维;积极参与讨论,学习他人优秀代码。
个人认证
优秀文档
获得点赞 0