还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
程序设计课程介绍C++欢迎来到程序设计课程!本课程将带领您深入学习这门强大而C++C++灵活的编程语言是一种通用的编程语言,广泛应用于系统软件、C++应用软件、设备驱动程序、嵌入式系统、高性能服务器和客户端应用程序等领域作为语言的扩展,不仅保留了语言的高效性,还增加了面向对象C C++C编程、泛型编程、库等现代编程特性通过本课程,您将从基础语STL法开始,逐步掌握的高级特性,为您的软件开发之路打下坚实基础C++无论您是编程新手还是有其他语言经验的开发者,这门课程都将帮助您全面理解编程,并能够独立开发实用的应用程序C++C++课程目标和要求知识目标技能要求12通过本课程学习,学生将掌握学生需要具备基本的计算机操C++的基本语法结构、面向对象作能力,最好有一定的编程基编程思想、泛型编程等核心概础(如C语言)课程将要求学念熟悉C++标准库的使用,能生完成多个编程作业和项目,够理解并应用复杂的数据结构需要投入足够的时间进行实践和算法培养学生分析问题、学习过程中需要主动解决问题,设计解决方案的能力,为进一善于利用在线资源和文档进行步学习高级编程打下基础自主学习学习成果3完成课程后,学生将能独立开发中小型C++应用程序,具备解决复杂编程问题的能力掌握面向对象设计原则,能够设计和实现类层次结构具备良好的代码风格和编程习惯,为今后的软件开发工作奠定坚实基础语言概述C++C++的起源1C++由比雅尼·斯特劳斯特鲁普于1979年开始设计开发,最初称为带类的C他的目标是在保持C语言的高效性和灵活性的同时,增加面向对象编程的特性1983年,这门语言被命名为C++,其中++是C语言中的递增运算符,象征着对C语言的改进发展历程2C++经历了多次标准化,包括C++
98、C++
03、C++
11、C++
14、C++17和C++20等重要版本每一次标准更新都为语言增添了新特性,使其更加强大和易用特别是C++11标准的推出,为C++注入了新的活力,引入了许多现代编程特性语言特点3C++是一种通用的、多范式的编程语言,支持过程式编程、面向对象编程和泛型编程它提供了高级抽象和底层控制的平衡,让程序员能够编写高效且可维护的代码C++既可用于系统级编程,也适用于应用开发,这种灵活性使其成为最流行的编程语言之一开发环境配置C++选择编译器C++开发首先需要选择适合的编译器Windows系统下常用的有Visual C++(Microsoft Visual Studio的一部分)、MinGW(Minimalist GNUfor Windows)和CygwinLinux系统可使用GCC(GNU CompilerCollection)Mac OS可使用Clang或通过Xcode提供的工具链初学者推荐选择Visual Studio或Code::Blocks等集成开发环境安装IDE集成开发环境(IDE)集编辑、编译、调试等功能于一体,能极大提高开发效率推荐的C++IDE包括Visual Studio(Windows),CLion(跨平台,付费),Code::Blocks(跨平台,免费),Dev-C++(Windows,免费),Qt Creator(跨平台,适合GUI开发)对于喜欢轻量级工具的开发者,可以选择VisualStudioCode配合C++插件使用配置与测试安装完成后,需要正确配置编译器路径和环境变量创建一个简单的Hello World程序进行测试,确保环境正常工作熟悉IDE的基本功能,如代码编辑、项目管理、编译和调试了解如何使用断点、观察变量等调试工具,这将对后续的学习和开发极为重要第一个程序C++Hello World程序结构代码示例编译与运行每个程序都由一系列函数和类组在中,通常只需点击构建或运行C++#include iostreamIDE成,而函数是程序执行的入口点按钮即可编译并执行程序在命令main intmain{一个最简单的程序包含头文行环境中,需要使用编译器命令(如Hello Worldstd::coutHello,World!std::endl;件包含、函数定义和输出语句三)进行编main return0;g++helloworld.cpp-o helloworld个基本部分头文件提供了译,然后运行生成的可执行文件程iostream}输入输出的基本功能,是几乎所有这段代码首先包含了头文件,序成功运行后,将在控制台显示iostream Hello,程序都会用到的标准库然后定义了函数在函数体内,文本C++main World!使用输出字符串,std::cout Hello,World!并用结束当前行函数最后返std::endl回表示程序正常结束0基本语法结构C++注释语句与语句块C++支持两种注释形式单行注释C++中的语句以分号结尾,多个语使用//,从双斜线开始到行尾的句可以组成语句块语句块用花括内容都会被编译器忽略;多行注释号{}包围,在条件语句、循环语使用/**/,注释开始于/*,结束句和函数定义中经常使用即使只于*/,中间的所有内容(包括换有一条语句,也建议使用花括号形行)都会被忽略注释是提高代码成语句块,以提高代码的清晰度和可读性的重要工具,应当合理使用一致性标识符与关键字标识符是程序中用来命名变量、函数、类等的名称,由字母、数字和下划线组成,但必须以字母或下划线开头C++区分大小写,因此count和Count是不同的标识符关键字是C++语言预定义的、有特殊含义的标识符,如int、if、while等,不能用作自定义名称数据类型概览修饰符派生数据类型类型修饰符可以改变基本数据类型的特性常用的修饰符包括C++中的派生数据类型包括数组、引基本数据类型signed/unsigned(有符号/无符号)、用、指针、函数和类等这些类型用户自定义类型short/long(短/长)等例如,都是基于基本数据类型构建的派C++提供了丰富的基本数据类型,包C++允许用户通过结构体(struct)、unsigned int表示无符号整型,能够表生类型使C++具有强大的抽象能力,括整型(int、short、long、long long)、类(class)和枚举(enum)定义自己示更大的正整数;long double提供更能够表达复杂的数据结构和算法,浮点型(float、double、long double)、的数据类型这些自定义类型可以高精度的浮点数表示是实现高级程序设计的基础字符型(char、wchar_t)和布尔型封装数据和操作,实现特定的业务(bool)每种类型都有特定的大小逻辑面向对象编程主要就是通过和表示范围,程序员应根据实际需定义和使用这些用户自定义类型来求选择合适的类型组织程序结构2314变量与常量变量声明与定义常量定义变量作用域变量是计算机内存中存常量是程序执行过程中变量的作用域决定了变储数据的命名空间在值不能改变的量C++中量在程序中的可见范围C++中,变量必须先声明定义常量的方法有两种C++中主要有局部作用域后使用变量声明指定使用const关键字修饰变(函数或块内部)、文了变量的类型和名称,量(如const int件作用域(整个文件)例如int count;变量定MAX_VALUE=100;)和使和类作用域(类内部)义不仅声明了变量,还用#define预处理指令局部变量在其定义的块为其分配了内存空间(如#define PI
3.14159)结束时销毁;静态局部在C++中,变量声明和定const方式更为推荐,因变量(使用static关键字义通常同时进行,但在为它提供了类型检查并定义)在程序结束前一某些情况下(如使用且可以在调试时查看常直存在,但其可见性仍extern关键字)可以分开量值限于定义它的块运算符和表达式类别运算符说明算术运算符+,-,*,/,%执行基本的数学运算,如加减乘除和取模关系运算符==,!=,,,=,=比较两个值的关系,返回布尔值逻辑运算符,||,!执行逻辑与、逻辑或和逻辑非操作位运算符,|,^,~,,对整数的二进制位执行操作赋值运算符=,+=,-=,*=,/=,%=将值赋给变量或修改变量的值递增递减++,--增加或减少变量的值C++表达式由运算符和操作数组成,用于执行计算并产生结果表达式的类型取决于其操作数的类型和参与运算的运算符表达式可以是简单的单一值(如常量或变量),也可以是复杂的组合运算理解运算符优先级和结合性对正确编写和理解表达式至关重要输入输出流标准输入输出文件输入输出流操纵算子标准库提供了头文件,定头文件提供了文件输入输出功提供了一系列流操纵算子,用于C++iostream fstreamC++义了处理标准输入输出的对象能用于从文件读取数据,控制输入输出的格式常用的包括ifstream是标准输入流对象,用于从键用于向文件写入数据,而(结束当前行),std::cin ofstreamstd::endl std::setw盘读取数据;是标准输出流对则同时支持读写使用这些类(设置宽度),(设置std::cout fstreamstd::setprecision象,用于向控制台输出数据这些对需要先创建流对象,然后打开文件,浮点数精度),象使用(输出)和(输入)运接着进行读写操作,最后关闭文件(设置整数的std::hex/std::dec/std::oct算符来传输数据例如,文件操作是许多实际应用程序不可或进制)等使用这些操纵算子需要包std::cout将输出到控缺的功能,掌握它对开发各类应用都含头文件合理使用流操纵算\Hello\std::endl;Hello iomanip制台并换行非常重要子可以使输出更加美观和易读条件语句if-else基本if语句if语句是最基本的条件控制结构,用于在条件为真时执行特定代码块其基本形式为if条件{语句块}条件表达式必须产生一个布尔值(true或false)如果条件为真,则执行花括号内的语句块;否则,跳过该语句块继续执行后续代码if-else语句if-else语句在条件为真时执行一个代码块,在条件为假时执行另一个代码块其形式为if条件{语句块1}else{语句块2}这种结构使程序能够在不同条件下执行不同的操作,是构建复杂逻辑的基础只有一个语句块会被执行if-else if-else链通过组合多个if-else语句,可以创建if-else if-else链,用于处理多个条件其形式为if条件1{语句块1}else if条件2{语句块2}...else{语句块n}条件按顺序检查,一旦找到第一个为真的条件,执行对应的语句块后就会跳出整个链,不再检查后续条件嵌套if语句if语句可以嵌套在另一个if或else语句内,形成更复杂的逻辑结构嵌套if语句在处理多条件逻辑时非常有用,但过深的嵌套会降低代码的可读性在实际开发中,应当尽量保持条件逻辑的清晰和简洁,必要时可以将复杂条件抽取为单独的函数条件语句switch基本语法switch语句是一种多分支条件语句,常用于根据一个变量的不同值执行不同的代码路径其基本语法为switch表达式{case常量1:语句块1;break;case常量2:语句块2;break;default:默认语句块;}表达式的值与每个case后的常量相比较,如果匹配则执行对应的语句块break与贯穿在switch语句中,break关键字用于跳出整个switch结构如果省略break,程序会继续执行下一个case中的代码,这种现象称为贯穿(fall-through)有时贯穿是有意为之的,用于多个case共享相同的代码;但在大多数情况下,遗漏break是一个常见的错误,会导致程序执行意外的代码路径default分支default标签表示当表达式的值不匹配任何case常量时执行的代码它类似于if-else链中的最后一个elsedefault分支是可选的,如果没有提供且表达式值不匹配任何case,则不执行任何操作虽然default通常放在最后,但它实际上可以放在switch语句的任何位置与if-else的比较switch语句对比if-else链有几个优势在大量分支条件时代码更整洁,编译器通常能生成更高效的代码(通过跳转表实现)但switch也有局限性只能测试相等性,不能用于范围比较;case常量必须是整型或字符型的常量表达式在选择使用哪种结构时,应考虑具体场景需求循环结构循环for基本语法for循环是C++中最常用的循环结构之一,特别适合已知循环次数的情况其基本语法为for初始化;条件;递增{循环体}初始化部分在循环开始前执行一次;条件部分在每次循环迭代前检查;递增部分在每次循环体执行后执行只有当条件为真时,循环体才会执行循环控制C++提供了两个特殊的语句来控制循环执行break和continuebreak语句立即终止循环,程序流程跳到循环后的第一条语句;continue语句跳过当前迭代的剩余部分,直接进入下一次迭代这两个语句使循环结构更加灵活,能够处理更复杂的控制流需求无限循环当for循环的条件部分始终为真时,会形成无限循环无限循环的常见写法是for;;{...}虽然有时无限循环是有意设计的(如服务器主循环),但更常见的是由于编程错误导致无限循环如果不被适当地终止(如通过break语句或其他机制),会导致程序挂起范围for循环(C++11)C++11引入了范围for循环,为遍历容器或数组提供了更简洁的语法for类型变量:容器{循环体}这种形式的for循环自动遍历容器中的每个元素,大大简化了迭代编码它适用于所有提供begin和end方法的容器,以及普通数组循环结构和while do-while循环循环循环选择while do-while循环是一种先判断后执行的循环循环是一种先执行后判断的循在中,、和三种循while do-while C++for while do-while结构,其基本语法为环结构,其基本语法为环结构在功能上是等价的,即任何一条件种循环都可以用另一种来实现选择while{do{循环体循环体使用哪种循环主要基于代码的清晰度条件和具体需求循环适合已知迭代次}}while;for在每次迭代开始前,都会先检查条件与循环不同,循环至少会数的情况;循环适合基于条件的whiledo-while while表达式只有当条件为真时,循环体执行一次循环体,然后才检查条件决未知次数循环;适合需要先执do-while才会执行;如果初始条件就为假,则定是否继续循环这种特性使行后判断的情况do-while循环体一次都不会执行循环适适合需要至少执行一次操作的场景,while合不确定具体循环次数,需要根据条如用户输入验证件动态决定是否继续循环的场景数组基础数组定义数组初始化数组是存储同类型数据的连续内存块,数组可在声明时初始化int numbers
[5]提供基于索引的快速访问数组声C++;也可以省略大小={1,2,3,4,5}int明语法类型数组名大小,如[]int未指定初始值的元numbers[]={1,2,3}1数组大小必须是常量表达式,numbers
[5]素会被初始化为(对于内置类型)02指定了可以存储的元素数量数组访问数组遍历通过下标操作符访问数组元素,如[]4常用循环遍历数组元素for inti=0;i numbers
[0]表示第一个元素C++数组下35;i++{...numbers[i]...}C++11引入了范标从0开始,因此最后一个元素的索引围for循环,使遍历更简洁for intn:是数组大小-1越界访问不会被编译器检测,可能导致未定义行为numbers{...}多维数组二维数组初始化与访问多维数组二维数组是数组的数组,用于表示表格二维数组可以在声明时初始化int C++支持任意维度的数组,如三维数组(int或矩阵等数据结构在C++中,二维数组的matrix
[2]
[3]={{1,2,3},{4,5,6}}通过两个cube
[2]
[3]
[4])、四维数组等维度越高,声明形式为类型数组名[行数][列数]例索引访问元素matrix[i][j]表示第i+1行、第声明和使用语法越复杂,需要更多的嵌套如,int matrix
[3]
[4]声明了一个有3行4列的j+1列的元素与一维数组一样,二维数组循环进行遍历多维数组在表示复杂的多整型二维数组二维数组在内存中是按行的索引也是从0开始的遍历二维数组通常维数据结构时非常有用,如三维空间中的连续存储的,即先存储第一行的所有元素,需要嵌套循环,外层循环遍历行,内层循点、时间序列数据等但高维数组也更容然后是第二行,依此类推环遍历列易出现索引错误,使用时需特别小心字符串处理风格字符串类字符串操作实例C std::string风格字符串是以空字符结尾的字标准库提供了类,它是对字符C\0C++string string str1=Hello;符数组声明形式串的面向对象封装,在头文件中char str
[100]=string stringstr2=World;;或标准库提定义相比风格字符串,提连接字符Hello charstr[]=Hello CC std::string stringresult=str1++str2;//供了一系列处理风格字符串的函数,供了更安全、更方便的字符串处理方式串C如、、、它自动管理内存,支持直接使用进行输出strlen strcpystrcat strcmp+coutresultendl;//Hello World等,它们在头文件中定字符串连接,提供了丰富的成员函数如长度cstringstring.h coutresult.lengthendl;义风格字符串使用简单,但容易出、、等现代程子串C lengthsubstr findC++coutresult.substr6,5endl;现缓冲区溢出等安全问题序通常优先使用从位置开始的个字符std::string//65查找coutresult.findWorld返回字符串的首字符位置endl;//World函数基础函数定义函数调用函数是一组执行特定任务的语句,有助于函数调用通过函数名和实参列表进行函代码复用和程序模块化C++函数定义语法数名实参1,实参2,...调用时,程序执行返回类型函数名参数列表{函数体}函流程跳到函数定义处,执行函数体内的语数必须先声明后使用,通常函数声明放在1句,然后返回调用点继续执行函数调用头文件中,定义放在源文件中2使程序执行变得非线性,实现逻辑的复用和分解返回值参数传递函数可返回计算结果给调用方,通过return函数参数可通过值传递(复制实参值)、4语句实现返回类型必须与函数声明一致引用传递(使用实参的别名)或指针传递3void类型表示函数不返回值函数可以没有(传递实参的地址)选择传递方式取决return语句,但有返回类型的函数必须通过于函数的目的值传递适合小型数据且不return语句返回符合类型的值需修改实参;引用和指针适合大型数据或需修改实参的情况函数参数传递值传递引用传递指针传递值传递是C++中最基本的引用传递中,函数参数指针传递中,函数接收参数传递方式,函数接是实参的别名例如指向实参的指针例如收实参的副本例如void double_valueint x{x voiddouble_valueint*xvoid double_valueint x{x*=2;}这种方式下,函{*x*=2;}通过解引用*=2;}在函数内部对参数内对参数的修改会直操作符(*),函数可以数的修改不会影响实参,接影响实参,因为参数访问和修改指针指向的因为函数操作的是实参和实参实际上是同一内内存指针传递在功能的副本值传递适合小存位置的不同名称引上类似于引用传递,但型数据(如基本类型),用传递避免了复制大型语法上更复杂,且指针对于大型对象可能会有对象的开销,常用于需可以为空在C++中,当性能问题,因为需要复要修改实参或传递大型需要表达可能没有值的制整个对象数据结构的情况概念时,指针比引用更适合函数重载重载基本概念函数重载是面向对象编程中的一个重要特性,它允许在同一作用域中定义多个同名函数,只要它们的参数列表不同1(参数类型、数量或顺序)函数重载使程序员能够使用相同的函数名表达相似的操作,提高代码的一致性和可读性重载解析当调用重载函数时,编译器通过比较函数调用中的实参类型和顺序与各个重载函数的形参列2表,确定应该调用哪个重载函数这个过程称为重载解析如果编译器找不到匹配的函数,或者找到多个可能的匹配而无法确定,将产生编译错误重载的限制函数重载只能基于参数列表的差异,不能仅基于返回类型的不同例3如,int func和double func不能共存于同一作用域此外,参数的默认值不参与重载解析,即void funcintx=0和void func被视为相同函数,不能同时定义指针概念指针基础指针操作12指针是存储内存地址的变量,通过指针操作主要包括取地址(运算它可以间接访问存储在该地址的数符)和解引用(*运算符)取地据C++中,指针变量的声明形式址运算符获取变量的内存地址,如为类型*变量名,如int*ptr指var;解引用运算符访问指针所指针的特点是能够动态分配内存、高向的值,如*ptr指针变量本身也效处理大型数据结构以及实现复杂可以进行算术运算,如递增/递减的数据结构(如链表和树)指针(ptr++/ptr--)和加减整数使C++程序员能够直接操作内存,(ptr+n/ptr-n),这使得指针在数但同时也增加了编程的复杂性和出组操作中特别有用错风险指针和null3未初始化的指针含有随机地址,使用它们会导致未定义行为为避免这种危险,应该始终在声明时初始化指针当指针不指向任何有效对象时,应该将其设置为nullptr(C++11)或NULL(C++98)访问空指针会导致运行时错误,因此在解引用前应该总是检查指针是否为空指针与数组数组名与指针指针算术指针与多维数组在中,数组名通常会隐式转换为指针算术使指针能够在数组中移动多维数组可以通过指针的嵌套来表示C++指向数组第一个元素的指针例如,当对指针进行加法操作时,增加的实例如,二维数组的元int matrix
[3]
[4]对于数组,表达式的值际字节数取决于指针所指类型的大小素可以通过访问,int arr
[5]arr**matrix+i+j是这种转换允许我们使用指例如,如果是类型(假设即这种表示方法反映了arr
[0]p int*int matrix[i][j]针表示法访问数组元素等占字节),那么的地址值比大多维数组在内存中的实际存储模式*arr+i4p+1p价于然而,数组名并不是真个字节这一特性使得指针能够高处理多维数组的指针操作较为复杂,arr[i]4正的指针变量它是固定的,不能被效地遍历数组,执行需要正确理解指针类型和数组内存布—for int*p=arr;p赋予新值(不能执行这样的等同于局arr=ptrarr+5;p++for inti=0;i5;操作)i++动态内存分配new和deleteC++提供了new和delete运算符进行动态内存管理new用于分配内存并返回一个指向该内存的指针;delete用于释放之前分配的内存动态分配的基本语法是int*p=new int10;(分配并初始化)和delete p;(释放)正确使用这些运算符对于避免内存泄漏和野指针至关重要数组动态分配对于数组的动态内存分配,C++使用特殊语法int*arr=new int
[10];(分配10个整数的数组)和delete[]arr;(释放数组)注意,释放数组内存必须使用delete[]运算符,而不是普通的delete,否则只会释放第一个元素,导致内存泄漏动态数组在需要运行时确定数组大小时特别有用内存管理问题动态内存管理中常见的问题包括内存泄漏(未释放不再使用的内存)、野指针(指向已释放内存的指针)和双重释放(对同一内存位置执行多次delete)为避免这些问题,应养成良好习惯每个new对应一个delete,分配后立即检查返回值是否为nullptr,释放后将指针设置为nullptr智能指针为简化内存管理,C++11引入了智能指针unique_ptr(独占所有权)、shared_ptr(共享所有权)和weak_ptr(不影响引用计数的shared_ptr)智能指针在离开作用域时自动释放所管理的资源,实现了资源获取即初始化(RAII)原则,大大降低了内存泄漏的风险,是现代C++中推荐的内存管理方式引用类型引用基础引用与指针的区别引用应用场景123引用是C++中的一种特殊类型,提供了已存虽然引用和指针都提供了间接访问变量的引用最常见的应用是作为函数参数,避免在变量的别名引用声明通过在类型后添方式,但它们有重要区别引用必须初始复制大型对象void processBigObjectobj;加符号int ref=original;引用必须在化且不能为空,而指针可以为nullptr;引用在这种情况下,函数直接操作原始对象,声明时初始化,并且一旦绑定到一个变量,一旦初始化就不能改变引用对象,而指针而不是其副本另一个重要用途是作为函就不能再绑定到其他变量引用看起来像可以指向不同对象;引用不需要解引用操数返回值,特别是在运算符重载中是一个新变量,但实际上它只是原始变量作符即可访问所引用的值,而指针需要使MyClass operator+=const MyClassother;的另一个名称,对引用的所有操作都直接用*操作符这些差异使引用在某些场景当需要返回函数内部已存在对象的引用时,影响原始变量中比指针更安全、更易用这种方式比返回副本更高效结构体结构体定义结构体初始化与访问结构体是C++中用户自定义的复合数据类型,结构体变量可以通过多种方式初始化用于将不同类型的数据组合成一个单元结Student s1={Alice,20,
3.9};//按顺序初始化构体定义的基本语法是Student s2={.name=Bob,.age=22,.gpa=
3.8};//struct结构体名{C++20指定初始化器成员类型1成员名1;Student s3;//默认初始化成员类型2成员名2;s
3.name=Charlie;s
3.age=21;s
3.gpa=
3.7;//成//...员赋值};结构体成员通过点操作符.访问s
1.name,例如,定义一个表示学生的结构体struct s
1.age等当使用结构体指针时,使用箭头操Student{string name;int age;float gpa;};作符-Student*ps=s1;ps-name结构体作为函数参数结构体可以像基本类型一样作为函数参数传递和返回为了提高效率,大型结构体通常通过引用或指针传递void updateStudentStudent s{s.gpa+=
0.1;}//引用传递void displayStudentconstStudents{couts.nameendl;}//常量引用Student createStudent{return{Dave,19,
3.5};}//返回结构体使用引用传递避免了复制整个结构体的开销;常量引用进一步确保函数不会修改原始数据类和对象基础类的定义对象创建与使用封装与访问控制类是C++面向对象编程的基本单元,它将对象是类的实例,创建对象的方式有封装是面向对象编程的核心原则之一,通数据(成员变量)和行为(成员函数)封ClassName obj;//默认构造过访问控制实现C++提供三种访问修饰装在一起类的基本定义语法为ClassName objargs...;//带参数构造符class类名{ClassName*pobj=new ClassName;//动态分public可以被任何函数访问private://私有成员,只能在类内部访问配private只能被类的成员函数访问数据成员声明;通过对象,可以访问类的公有成员protected只能被类的成员函数及派生类public://公有成员,可以在类外部访问obj.memberFunction;或pobj-的成员函数访问成员函数声明;memberFunction;每个对象都有自己的数良好的封装通常将数据成员设为私有,通};据成员副本,但所有对象共享相同的成员过公有的访问器(getter)和修改器相比结构体(默认公有),类的成员默认函数代码(setter)函数来控制对数据的访问和修改是私有的,更好地实现了数据封装类的成员函数成员函数定义访问器和修改器成员函数是类内部定义的函数,用于操访问器(getter)和修改器(setter)是特作类的数据成员成员函数可以在类定殊的成员函数,用于控制对类私有数据义内直接实现(内联函数)或在类外部成员的访问访问器通常是const成员函定义内部定义class MyClass{public:数,只读取数据而不修改int getValuevoid func{/*实现*/}};外部定义class const{return value;}修改器用于安全地MyClass{public:voidfunc;};void修改数据void setValueintv{if v=0MyClass::func{/*实现*/}每个成员函value=v;}这种模式实现了数据封装,数都有一个隐藏的this指针,指向调用该允许类在保持内部一致性的同时提供受函数的对象控的外部访问常量成员函数常量成员函数是承诺不会修改调用对象的函数,通过在函数声明和定义中添加const关键字实现void displayconst;常量成员函数可以被常量对象调用,而非常量成员函数不能被常量对象调用在常量成员函数中,隐式的this指针是指向常量对象的指针,因此不能修改数据成员,除非该数据成员声明为mutable构造函数和析构函数构造函数析构函数对象生命周期构造函数是一种特殊的成析构函数是另一种特殊的对象的生命周期从构造开员函数,用于初始化对象成员函数,在对象销毁时始,到析构结束了解对的数据成员构造函数的自动调用,用于释放对象象何时创建和销毁对编写名称与类名相同,没有返占用的资源析构函数的无内存泄漏的代码至关重回类型C++支持多个构造名称是类名前面加上~,要局部变量(栈对象)函数(通过重载),包括没有参数和返回类型在声明点创建,在离开作默认构造函数(无参数)、~ClassName每个类只能用域时销毁动态分配的带参数构造函数和复制构有一个析构函数析构函对象(堆对象)在使用new造函数构造函数通常在数在对象离开作用域(栈时创建,在使用delete时销类的public部分声明,以便对象)、被明确删除(堆毁静态对象在程序开始在类外部创建对象成员对象)或程序结束时调用前创建,在程序结束时销初始化列表是构造函数的析构函数对于资源管理毁全局对象的初始化顺一个重要特性,允许直接(如释放动态分配的内存、序不确定,因此应避免依初始化成员ClassNameint关闭文件或网络连接)至赖全局对象间的初始化顺x:memberVarx{}关重要序对象数组和对象指针对象数组1对象数组是包含多个同类型对象的数组创建对象数组的语法与基本类型数组类似ClassName objectArray[size];当创建对象数组时,每个元素都会调用类的默认构造函数如果类没有默认构造函数,则必须为每个元素提供初始化值ClassName objectArray
[2]={ClassNamearg1,ClassNamearg2};对象数组的元素通过常规数组语法访问objectArray[i].memberFunction对象指针2对象指针是指向对象的指针声明和使用对象指针的语法为ClassName*pObj=obj;或ClassName*pObj=new ClassName;对象指针通过箭头操作符-访问对象的成员pObj-memberFunction;使用动态分配的对象指针时,需要记住在不再需要对象时通过delete释放内存delete pObj;适当使用智能指针可以自动管理内存,避免内存泄漏对象数组的动态分配3对象数组也可以动态分配ClassName*pArray=new ClassName[size];这会调用每个元素的默认构造函数为动态分配的对象数组提供初始化值较为复杂,常见方法是创建数组后逐个初始化元素释放动态分配的对象数组时,必须使用数组形式的delete delete[]pArray;这确保数组中的每个对象都会调用析构函数,从而正确释放资源静态成员静态数据成员静态成员函数单例模式实现静态数据成员是属于类而不是对象的变量,静态成员函数也是属于类而不是对象的函静态成员是实现单例设计模式的关键单所有对象共享同一个静态成员静态数据数,不依赖于任何对象实例静态成员函例确保一个类只有一个实例,并提供全局成员在类定义中声明时使用static关键字数在声明时使用static关键字static void访问点典型实现static intcount;静态成员必须在类外部定printCount;静态成员函数没有this指针,class Singleton{义和初始化(通常在源文件中)int因此只能访问静态数据成员和其他静态成private:ClassName::count=0;静态数据成员存在于员函数,不能访问非静态成员静态成员static Singleton*instance;类的所有对象之外,其生命周期是整个程函数可以通过类名直接调用,无需对象实Singleton{}//私有构造函数序运行期间它们常用于跟踪类的所有实例ClassName::printCount;,也可以通过对public:例共享的信息,如对象计数、配置设置等象调用obj.printCount staticSingleton*getInstance{if!instance instance=new Singleton;return instance;}};Singleton*Singleton::instance=nullptr;//初始化静态成员友元函数与友元类友元函数基础友元函数是非成员函数,但被授予访问类的私有和保护成员的权限在类定义中使用friend关键字声明友元函数friend voidfuncClassName obj;友元函数的声明可以放在类定义的任何部分(private、protected或public),位置不影响友元函数的访问权限友元函数通常用于需要访问多个类的私有成员的操作,如重载非成员运算符或实现特殊的功能函数友元类友元类是被授予访问另一个类的私有和保护成员的权限的类在被访问的类中使用friend关键字声明友元类friend classFriendClass;友元类的所有成员函数都可以访问声明它为友元的类的私有和保护成员友元关系不是对称的(A是B的友元不意味着B是A的友元),也不是可传递的(A是B的友元,B是C的友元,不意味着A是C的友元)另一个类的成员函数作为友元C++允许将另一个类的特定成员函数声明为友元,而不是整个类语法为friend voidAnotherClass::funcClassName obj;这提供了更细粒度的访问控制,只允许需要访问的特定函数有权限,而不是整个类使用这种方式时,被声明为友元的成员函数必须已经在其类中声明友元的利与弊友元机制破坏了封装性,因为它允许类外的函数或其他类访问私有成员过度使用友元可能导致代码耦合度高、维护困难然而,在某些情况下,友元是必要且有益的,如运算符重载、高效访问多个对象的私有数据等正确使用友元应当遵循最小特权原则,只授予确实需要访问私有成员的函数或类友元资格运算符重载基础运算符重载概念成员函数重载运算符重载允许C++中的运算符应用于用户作为成员函数的运算符重载定义在类内部,自定义类型,使代码更加直观和易读通过其第一个(隐式)操作数是调用对象基本定义特殊的函数,可以指定运算符对自定义形式返回类型operator运算符参数列表;类型的行为大多数C++运算符都可以重载,例如,Complex类中重载加法运算符Complex1但部分运算符(如::、.*、.、:)不能被重载operator+const Complexother const{return2Complexre+other.re,im+other.im;}常见重载实践非成员函数重载复合赋值运算符(+=、-=等)应作为成员函运算符也可以作为非成员函数重载,通常为数重载,通常返回*this引用;算术运算符(+、4友元函数,以保持对称性和允许左操作数的-等)可基于复合赋值实现;输入输出运算符3隐式转换基本形式friend返回类型(、)通常作为非成员函数实现;比较operator运算符参数1,参数2;例如friend运算符应保持传统语义,维持一致性和可传Complex operator+const Complexlhs,const递性;自增/自减运算符区分前缀和后缀形式Complex rhs;继承与派生多态能力1通过虚函数机制实现运行时多态扩展和专用化2添加新功能并修改现有行为代码重用3复用基类已有的属性和方法建立类层次结构4反映概念间的是一种关系继承是面向对象编程的核心概念之一,允许创建从现有类(基类)派生出的新类(派生类)派生类继承基类的属性和行为,并可以添加新的属性和行为,或者修改继承的行为C++中的继承语法使用冒号表示class DerivedClass:public BaseClass{//派生类特有的成员};访问修饰符(public、protected、private)控制派生类从基类继承成员的访问级别public继承表示是一种关系,是最常用的继承方式派生类可以访问基类的public和protected成员,但不能访问private成员多重继承基本概念菱形继承问题多重继承的实际应用多重继承是C++中允许一个类同时从多个菱形继承(或钻石继承)是多重继承中的虽然多重继承有复杂性,但在某些场景下基类继承的特性语法为常见问题当类D同时继承自类B和类C,是有用的,特别是实现多个接口(纯抽象class DerivedClass:public BaseClass1,public而B和C都继承自类A时,类D会包含A的两类)时C++标准库中的iostreams就使用了BaseClass2{个副本例如多重继承ostream继承了ios和//派生类特有的成员A ostream_iterator多重继承也常用于实现};/\混入(mixin)模式,将可重用的功能组合多重继承使类可以组合多个基类的功能,到类中然而,在许多情况下,组合B C实现更复杂的关系模型然而,它也引入\/(has-a关系)比多重继承更适合,可以实了一系列复杂性和潜在问题,因此在使用现类似功能而避免继承的复杂性D时需要谨慎这会导致歧义(D中A的哪个副本)和资源浪费通过虚拟继承可以解决这个问题class B:virtual publicA{};class C:virtual publicA{};使D中只包含A的一个副本虚函数和多态性虚函数基础虚函数表机制虚函数是C++实现运行时多态性的机制在虚函数的实现通常使用虚函数表(vtable)机基类中使用virtual关键字声明的函数可以在制每个包含虚函数的类都有一个vtable,存派生类中被重写(override)当通过基类指储着该类虚函数的地址每个对象隐含地存针或引用调用虚函数时,实际调用的是指向储一个指向其类vtable的指针(vptr),这使的对象的类型对应的函数版本,而不是指针得在运行时能找到适当的函数版本虚函数或引用的静态类型对应的版本虚函数的声调用会被转换为通过对象的vptr查找vtable,明virtual voidfunc;在派生类中重写虚函然后调用表中相应位置的函数这个机制导数时,virtual关键字是可选的,但为了清晰,致虚函数调用比非虚函数略微慢一些,但差通常会保留异很小多态性应用多态性是面向对象编程的核心原则之一,允许使用统一的接口(基类)处理不同的对象(派生类)典型应用包括
1.通过基类指针/引用存储和操作不同类型的对象
2.使用策略模式,在运行时切换不同的实现
3.实现框架,其中基类定义通用流程,派生类提供特定实现多态性使代码更加灵活、可扩展,是开放/封闭原则(对扩展开放,对修改封闭)的重要实现机制抽象类和纯虚函数纯虚函数抽象类接口设计模式纯虚函数是在基类中声明包含至少一个纯虚函数的在C++中,接口通常通过只但没有实现的虚函数,它类称为抽象类抽象类不包含纯虚函数的抽象类来通过在函数声明后加=0能被直接实例化,只能作实现,类似于Java的表示virtual voidfunc=0;为基类使用抽象类的主interface接口类通常不包纯虚函数是一种接口声明,要目的是定义接口,确保含数据成员,所有函数都告诉派生类必须提供该函派生类实现特定功能抽是纯虚的命名通常以I数的实现纯虚函数可以象类可以包含非纯虚函数、前缀表示这是一个接口,有默认实现,虽然这种用普通函数和数据成员,为如IDrawable接口隔离原则法不常见virtual voidfunc派生类提供部分实现派建议多个特定接口优于一=0;在类外void生类必须实现所有纯虚函个通用接口,这样客户端BaseClass::func{/*默认实数,否则它也是抽象类只需依赖它们实际使用的现*/}派生类仍需声明抽象类是实现接口和框架方法接口设计是实现低该函数,但可以选择调用的强大工具耦合、高内聚系统的关键基类实现模板函数模板基础模板实例化12函数模板是C++中实现泛型编程的一种机使用模板时,编译器会为每个使用的类型制,允许函数对不同类型使用相同的代码生成特定版本的函数,这个过程称为模板模板定义使用template关键字,后跟尖括实例化实例化可以隐式发生(根据函数号中的类型参数template或template调用参数推导类型)max10,20;(生成typename和class在这里是等价的函数模int版本);max
1.5,
2.5;(生成double版板示例template TmaxT a,T b{return a本)也可以显式指定类型max10,20;ba:b;}模板函数可以接受任何支持其在模板被实例化时,编译器会检查所有操中使用操作(如示例中的)的类型作对特定类型是否有效,这种延迟检查是泛型编程的关键特性模板特化3模板特化允许为特定类型提供不同的实现全特化完全替换通用模板template const char*maxconst char*a,constchar*b{return strcmpa,b0a:b;}这个特化处理字符串比较,使用strcmp而不是运算符部分特化只适用于类模板,不适用于函数模板为某些参数指定特定行为而保留其他参数泛型,需要用重载template TmaxT*a,T*b{return*a*b*a:*b;}类模板类模板定义类模板是C++泛型编程的核心,允许设计适用于多种数据类型的类类模板定义语法templateclass MyContainer{private:T element;public:void setElementconstT el{element=el;}T getElementconst{return element;}};类模板中,类型参数T可以用于成员变量类型、成员函数参数和返回类型等类模板实例化使用类模板时,必须显式指定模板参数类型创建类模板对象的语法MyContainer intContainer;这会触发编译器为int类型生成MyContainer的特定版本与函数模板不同,类模板不能进行模板参数推导(C++17前)类模板的成员函数只有被调用时才会实例化,这允许模板用于可能不支持所有操作的类型,只要不调用使用这些操作的成员函数模板特化与偏特化类模板可以进行全特化,为特定类型提供完全不同的实现templateclass MyContainer{//对字符串的特殊实现};类模板还支持偏特化,只特化部分模板参数templateclass MyContainer{//对所有指针类型的特殊实现};特化和偏特化允许为不同类型提供优化的或特殊的实现类模板中的非类型参数类模板不仅可以有类型参数,还可以有非类型参数(如整数常量)templateclass Array{private:T elements[Size];public://成员函数};使用时需指定类型和非类型参数Array intArray;非类型参数必须是常量表达式,通常用于指定容量、大小或其他编译时常量属性异常处理机制异常基础异常是C++中处理运行时错误和异常情况的机制异常允许将错误检测与错误处理分离,使代码更清晰C++异常处理基于三个关键字try(尝试可能引发异常的代码)、throw(抛出异常)和catch(捕获并处理异常)基本语法try{//可能抛出异常的代码if errorConditionthrow exceptionObject;}catch ExceptionTypee{//处理异常}异常类层次结构C++标准库定义了一个异常类层次结构,基类是std::exception常用派生类包括std::runtime_error、std::logic_error等自定义异常类通常应继承自标准异常类之一,并提供有意义的错误信息例如class MyException:public std::runtime_error{public:MyExceptionconst std::string msg:std::runtime_errormsg{}};通过继承建立异常类层次结构,可以在不同级别捕获异常,实现灵活的错误处理异常捕获与处理异常处理采用抛出后查找处理程序的模型当异常被抛出时,程序寻找匹配的catch块如果当前函数没有合适的catch块,异常会传播到调用者,一直到找到匹配的catch或到达主函数多个catch块按顺序匹配,派生类异常应先捕获,再捕获基类异常catch...可以捕获任何类型的异常,用作后备处理程序RAII与异常安全资源获取即初始化(RAII)是C++中实现异常安全代码的关键技术RAII确保资源(如内存、文件句柄)在构造函数中获取,在析构函数中释放当异常发生时,析构函数会自动调用,确保资源被正确释放这使得不需要在catch块中显式清理资源,减少了资源泄漏的风险使用智能指针(如std::unique_ptr)和标准容器是实践RAII的典型方式文件操作基础文件流类文件打开与关闭文件读写操作C++通过fstream头文件提供文件操作功能,打开文件可以在构造时指定文件名和模式文件读写使用与标准I/O相同的运算符和方定义了三个主要的文件流类ifstream(输ifstream inFileinput.txt;,或通过open方法法读取文件内容入文件流,用于读取)、ofstream(输出文ofstream outFile;outFile.openoutput.txt,int num;stringstr;inFilenumstr;//按格件流,用于写入)和fstream(文件流,可ios::out|ios::app;常用模式标志包括ios::in式读取读可写)这些类都派生自iostream类层次(读取)、ios::out(写入)、ios::app(追char buffer
[100];inFile.getlinebuffer,100;//读结构,因此它们继承了cin和cout使用的操加)、ios::binary(二进制模式)等打开取一行作符和方法使用这些类需要包含头文件后应检查文件是否成功打开if写入文件内容#include fstream!inFile.is_open{/*错误处理*/}使用完outFileNumber:42endl;//格式化写文件后,应调用close方法关闭入inFile.close;文件读写时应检查操作是否成功whileinFiledata{/*处理数据*/},利用流的布尔转换行为(成功返回true,失败返回false)来控制循环文本文件和二进制文件操作文本文件处理二进制文件处理12文本文件以人类可读的字符存储数据,每二进制文件以内存中表示的原始形式存储行通常以换行符结束C++对文本文件的数据,没有字符转换处理二进制文件需处理默认进行平台相关的转换,如将\n要使用ios::binary标志打开文件fstream转换为适当的行结束符处理文本文件的filedata.bin,ios::in|ios::out|ios::binary;读常用方式是使用流操作符(、)或行写二进制数据使用read和write方法,它读取函数(getline)文本文件适合存储们接受一个指向内存区域的指针和字节数配置信息、日志和其他需要人类直接读取file.writereinterpret_castdata,sizeofdata;或编辑的数据文本模式是默认的文件打和file.readreinterpret_castdata,开模式,无需特别指定sizeofdata;随机访问3文件流支持随机访问,允许在文件中移动读/写位置主要的定位函数有seekg/seekppos将读/写位置设置为文件中的绝对位置seekg/seekpoffset,dir相对于起点ios::beg、当前位置ios::cur或结尾ios::end设置位置tellg/tellp返回当前的读/写位置这些功能在处理结构化数据文件(如数据库)时特别有用,允许直接跳转到特定记录而不需要顺序读取整个文件标准模板库()概述STL容器STL核心组件容器是存储对象集合的数据结构STL提供C++标准模板库(STL)是一个强大的通用库,三类容器序列容器(vector、list、deque等,提供了常用的数据结构和算法STL由六个维护元素顺序),关联容器(set、map等,主要组件组成容器、迭代器、算法、函数基于键组织元素),无序关联容器1对象、适配器和分配器这些组件通过模板(unordered_set、unordered_map等,哈希表实2实现,提供了类型无关的编程支持现)每种容器都有特定的访问、插入和删除特性算法迭代器STL提供了丰富的算法,如排序、搜索、转4迭代器是类似指针的对象,用于遍历容器元3换和数值操作大多数算法通过迭代器操作素STL定义了五种迭代器类别输入、输容器,这种设计使算法与容器分离,提高了出、前向、双向和随机访问,每种支持不同代码重用性常用算法包括sort、find、的操作集迭代器提供了容器和算法间的统transform和for_each等,都在algorithm头文件一接口,使算法可以独立于容器类型工作中定义容器类序列容器关联容器无序关联容器序列容器按照线性顺序(如插入顺序)组织元素关联容器通过键来组织和访问元素主要包括:C++11引入的无序关联容器基于哈希表实现,提供主要包括:-set:唯一键的集合,按键排序常数时间复杂度的搜索、插入和删除操作主要-vector:动态数组,支持快速随机访问,在末尾添-multiset:允许重复键的集合,按键排序包括:加/删除元素效率高-map:键值对的集合,键唯一且排序-unordered_set:唯一键的无序集合-list:双向链表,支持快速插入和删除任何位置的-multimap:允许重复键的键值对集合,按键排序-unordered_multiset:允许重复键的无序集合元素这些容器通常基于红黑树实现,提供对数时间复-unordered_map:键值对的无序集合,键唯一-deque:双端队列,支持两端的快速插入和删除,杂度的搜索、插入和删除操作关联容器自动将-unordered_multimap:允许重复键的键值对无序集合以及随机访问元素按键排序,便于二分查找当不需要排序但需要快速查找时,无序容器比对-arrayC++11:固定大小的数组,比传统数组更安应的关联容器效率更高全-forward_listC++11:单向链表,比list占用空间更小,但只能向前遍历迭代器迭代器概念迭代器类别12迭代器是STL的核心概念,提供了访问容器元STL定义了五种迭代器类别,按功能由弱到强素的统一方式迭代器类似于指针,支持解排列引用(*iter访问元素值)和递增(++iter移动
1.输入迭代器只读,只能前进,只能访问一到下一元素)等操作不同类型的迭代器支次(如istream_iterator)持不同操作集,从基本的输入迭代器(只能
2.输出迭代器只写,只能前进,只能写入一前进和读取一次)到功能强大的随机访问迭次(如ostream_iterator)代器(类似于指针,支持算术运算和任意跳
3.前向迭代器可读写,可多次遍历,只能前转)迭代器使算法和容器解耦,使得同一进(如forward_list迭代器)算法可以用于不同容器
4.双向迭代器可读写,可多次遍历,可前进和后退(如list迭代器)
5.随机访问迭代器可读写,支持随机访问(如vector迭代器)每种容器提供最适合其内部结构的迭代器类型迭代器使用3容器通过begin和end方法提供迭代器,分别指向第一个元素和最后一个元素之后的位置C++11引入的范围for循环简化了迭代器使用for autoelem:container{...}迭代器失效是一个常见问题当容器结构改变(如元素插入或删除)时,现有迭代器可能变得无效每种容器对迭代器失效有不同的规则,理解这些规则对安全使用迭代器至关重要算法STL算法是一套在迭代器范围上操作的函数模板,定义在algorithm和numeric头文件中这些算法独立于特定容器类型,通过迭代器与容器交互,体现了STL的泛型设计算法可分为几类非修改性序列操作(如find、count)、修改性序列操作(如copy、transform)、排序和相关操作(如sort、merge)以及数值操作(如accumulate、inner_product)大多数STL算法采用前开后闭区间[first,last,这意味着操作包括first指向的元素,但不包括last指向的元素这种设计使得连接多个算法操作变得简单,因为一个区间的结束恰好是下一个区间的开始许多算法还接受谓词(返回布尔值的函数)作为参数,允许自定义操作条件与手写循环相比,使用STL算法有多种优势代码更简洁、更易读;算法经过优化,通常比手写循环更高效;减少出错机会,特别是边界条件和特殊情况;允许更好的代码重用现代C++鼓励优先使用算法而非手写循环,尤其是C++11引入的lambda表达式使算法更加灵活函数对象函数对象基础预定义函数对象函数对象(或仿函数)是可以像函数一样调用的STL在functional中提供了一组预定义的函数对象对象,通过重载operator实现示例-算术运算plusT,minusT,multipliesT,struct AddValue{dividesT,modulusT,negateTint value;-比较运算equal_toT,not_equal_toT,greaterT,AddValueint v:valuev{}lessT,greater_equalT,less_equalTint operatorintx const{return x+value;}-逻辑运算logical_andT,logical_orT,};logical_notTAddValue add55;这些函数对象实现了对应的运算符操作,常用于int result=add510;//返回15算法的谓词参数,如sortv.begin,v.end,函数对象比普通函数有更多优势可以保持状态、greaterint将向量降序排序更易于内联优化、可作为模板参数传递类型信息函数适配器STL提供了函数适配器,用于转换或组合函数对象常见适配器包括-bind将一个函数绑定到特定参数(C++11,取代旧的bind1st/bind2nd)-mem_fn将成员函数转换为普通函数对象(C++11)-not_fn创建一个函数对象,返回原函数对象结果的逻辑非(C++17)C++11还引入了函数包装器std::function,可以存储任何可调用对象(函数、函数对象、lambda表达式等),提供了统一的函数接口智能指针智能指针概述1智能指针是C++中用于自动内存管理的类模板,它们遵循RAII(资源获取即初始化)原则,确保资源在不再需要时自动释放智能指针包装了原始指针,提供了类似指针的语法(如*和-操作符),但增加了自动管理内存的能力C++11标准库在memory头文件中定义了三种主要的智能指针unique_ptr、shared_ptr和weak_ptr,它们取代了旧的auto_ptr(C++17中废弃)unique_ptr2unique_ptr实现了独占所有权语义,即一个资源只能被一个unique_ptr拥有当unique_ptr离开作用域或被重置时,它所管理的资源会自动删除unique_ptr不允许复制(禁用了复制构造函数和赋值运算符),但支持移动语义(使用std::move)这种设计确保了资源的唯一所有权,避免了悬挂指针和双重释放的问题unique_ptr适用于不需要共享资源的场景,是最轻量级的智能指针shared_ptr3shared_ptr实现了共享所有权语义,允许多个shared_ptr指向同一资源它使用引用计数跟踪有多少shared_ptr指向资源,只有当最后一个shared_ptr离开作用域或被重置时,资源才会被删除shared_ptr支持复制和移动,每次复制会增加引用计数,每次销毁会减少引用计数shared_ptr适用于需要在多个对象间共享资源的场景,但引用计数机制会带来一定的运行时开销weak_ptr4weak_ptr是对shared_ptr的补充,提供了对资源的非拥有引用weak_ptr不增加引用计数,因此不影响资源的生命周期使用weak_ptr可以检查资源是否仍然存在(expired),并在资源存在时获取对应的shared_ptr(lock)weak_ptr主要用于打破shared_ptr循环引用(可能导致内存泄漏),以及实现观察者模式等需要弱引用的设计模式新特性概览C++11核心语言特性标准库增强并发编程C++11引入了众多核心语言改进C++11显著扩展了标准库C++11首次将并发编程引入了标准,提供了-自动类型推导(auto、decltype)简化了复-智能指针(unique_ptr、shared_ptr、一套完整的多线程支持杂类型的声明weak_ptr)-std::thread类用于创建和管理线程-基于范围的for循环for autoitem:-新容器(array、forward_list、-互斥量(std::mutex等)和锁container{...}unordered_map等)(std::lock_guard等)用于同步-Lambda表达式允许创建匿名函数对象-线程支持库(thread、mutex、-条件变量(std::condition_variable)用于线-右值引用和移动语义提高了性能,减少condition_variable等)程通信不必要复制-正则表达式库(regex)-原子操作(std::atomic)支持无锁编程-nullptr替代了容易混淆的NULL宏-随机数生成库(random)-future和promise提供异步结果传递机制-强类型枚举(enum class)提供了更好的-chrono库提供时间相关功能-async函数模板简化了异步任务的启动类型安全-元组类型(tuple)扩展了pair的概念这些特性使C++能够原生支持现代多核处理-静态断言(static_assert)在编译时检查-function类模板可存储任何可调用对象器编程,不再依赖第三方库条件这些库显著简化了常见任务的实现,提高-可变参数模板实现了类型安全的不定参了开发效率数函数程序设计最佳实践C++代码风格与规范性能优化原则安全编程实践良好的代码风格提高可读C++性能优化应遵循先测C++的底层特性需要谨慎使性和可维护性建议采用量,后优化原则使用性用以避免安全漏洞建议一致的命名约定(如类使能分析工具识别瓶颈,避使用智能指针而非裸指针用首字母大写的驼峰命名,免过早优化常见优化技避免内存泄漏和悬挂指针;变量使用小写加下划线)、术包括减少内存分配和检查所有输入数据防止缓合理的缩进和格式化、适复制(使用移动语义、预冲区溢出、注入攻击等;当的注释说明代码意图而留容器容量)、选择合适对用户输入进行严格验证;非操作遵循团队或行业的数据结构和算法、避免避免使用不安全的函数标准的代码规范,如Google虚函数调用的过度使用、(如gets、strcpy);正确C++风格指南或C++Core利用编译器优化和内联处理整数溢出;避免类型Guidelines使用自动格式了解CPU缓存行为,设计误用和未定义行为;定期化工具和静态分析工具检缓存友好的数据结构,尤使用静态分析和安全扫描查代码质量和潜在问题其对于大型数据处理工具检测潜在问题课程总结与展望探索前沿技术1Web Assembly,量子计算,与AI结合高级应用领域2游戏引擎,金融系统,科学计算进阶技能3设计模式,多线程编程,网络编程核心知识4语法基础,面向对象,STL,内存管理本课程涵盖了C++的基本语法、面向对象编程、STL、内存管理以及现代C++特性通过系统学习,您已具备使用C++进行软件开发的基本能力,能够理解和应用主要编程概念C++作为一种强大而灵活的语言,在系统编程、游戏开发、高性能计算等领域仍有不可替代的地位未来的学习方向可以包括深入研究设计模式、多线程编程、网络编程、图形编程等专业领域,或是探索C++20/23等新标准带来的特性持续编程实践和参与实际项目是提高C++技能的最佳途径鼓励您加入开源社区,阅读高质量代码,并在实际应用中不断挑战自己C++的学习是一条漫长而有回报的道路,正如Bjarne Stroustrup所说C++使困难的事情成为可能,而使本已可能的事情变得更简单。
个人认证
优秀文档
获得点赞 0