还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
的初步知识C++欢迎来到初步知识的学习之旅本课程将带领大家系统地了解C++C++编程语言的基础知识,从语言特性到实际应用无论您是编程新手还是有其他语言经验的开发者,本课程都将帮助您建立扎实的基础C++作为一种强大的通用编程语言,被广泛应用于系统软件、游戏开发、C++嵌入式系统等多个领域通过本课程的学习,您将逐步掌握的核心C++概念和编程技巧,为今后深入学习和应用打下坚实基础C++课程概述课程目标学习计划考核方式123本课程旨在帮助学生掌握编程语课程将分为十个单元,每周进行两次课程考核包括平时成绩()、编C++30%言的基础知识和技能通过系统的讲课堂教学,每次小时课程内容包程作业()和期末项目()230%40%解和实践,使学生能够理解的核括理论讲解和上机实践相结合,学生平时成绩主要考察课堂表现和出勤情C++心概念,包括数据类型、控制结构、需完成规定的编程作业和项目,巩固况,编程作业包括每周的小型编程任函数、类和对象等,并能够独立编写所学知识教师将提供一对一辅导和务,期末项目要求学生独立完成一个简单的程序解决实际问题在线答疑,确保学习效果综合性程序,展示所学知识C++C++简介C++的历史C++1由丹麦计算机科学家比亚尼斯特劳斯特鲁普于年开始设计和开发,最初C++·1979被称为带类的()年,它被重新命名为,正式发布C Cwith Classes1983C++随后经历了多次标准化,包括、、、和等重要版C++98C++11C++14C++17C++20本,不断增加新特性和改进性能与语言的关系C2是语言的超集,意味着任何合法的程序也是合法的程序保留了C++C CC++C++C语言的所有特性,如高效性和可移植性,但增加了面向对象编程、泛型编程等现代编程范式的支持比语言提供了更丰富的抽象机制和更强大的类型系C++C统主要特性3的主要特性包括面向对象编程、泛型编程、异常处理、标准模板库()、C++STL多范式编程支持等它既保留了语言的高效性和底层控制能力,又提供了高级C抽象和安全性,使其成为系统编程、游戏开发、嵌入式系统等领域的首选语言之一开发环境设置常用介绍编译器选择环境配置步骤IDE是系统上最流主流的编译器包括(环境配置通常包括安装或编辑器、Visual StudioWindows C++GCC GNUIDE行的开发环境,提供了强大的调),适合和安装编译器、配置构建系统(如C++Compiler CollectionLinux试功能和丰富的插件是跨平;()、设置调试器和其他工具链CLion MacOSMSVC MicrosoftVisual CMake台的现代,基于平台开),平台的标准编译器;对于初学者,建议选择集成了这些工C++IDE IntelliJC++Windows发,代码分析能力强,项目的一部分,跨平台具的,如下的Code::Blocks ClangLLVM IDEWindows Visual是轻量级跨平台,适合初学者支持良好不同编译器对标准的,简化配置过程配置完成后,IDE C++Studio此外,配合适当的支持程度和优化能力有所不同,选择应创建简单测试程序验证环境是否正Visual StudioCode扩展也是优秀的选择时应考虑项目需求和目标平台常工作第一个程序C++示例Hello World以下是一个基本的程序C++Hello World#include iostreamintmain{std::coutHello,World!std::endl;return0;}这个简单的程序引入了库,定义了函数,并使用对象将输出到iostream maincout Hello,World!控制台程序结构解析第一行的是预处理器指令,用于包含标准输入输出流库函数是程序的入口点,#include main所有程序都必须有一个函数是标准输出流对象,是输出运算符,用于C++main std::cout将数据发送到输出流程序最后返回表示正常结束0编译运行过程程序的编译运行涉及四个阶段预处理(处理等指令)、编译(将源代码转C++#include换为目标代码)、链接(将目标代码与库文件链接)和执行在中,这些步骤通常可IDE以通过点击构建和运行按钮完成,也可以在命令行中使用相应编译器命令执行基本语法C++标识符规则关键字列表标识符是用于命名变量、函数、类包含多种关键字,如、、C++C++auto break等程序元素的名称有效的标识符必须、、、、、case classconst continuedefault以字母或下划线开头,后跟字母、数字、、、、、do doubleelse enumextern或下划线区分大小写,所以、、、、、、C++float forif intlong namespace和是不同的标识符标识、、、、count Countnew private protected public符不能是关键字,也不应使用以两、、、、C++return staticstruct switch个下划线开头或以一个下划线后跟大写、、、、、template thisthrow trytypedef字母开头的名称,这些通常保留给编译、、等这些关键字有virtual voidwhile器使用特定的语义和用途,不能用作标识符注释方式支持两种注释方式单行注释使用双斜杠(),从双斜杠开始到行尾的内容都是C++//注释;多行注释使用和包围,这种方式可以跨越多行注释对程序的执行没有影响,/**/但对代码的可读性和维护性至关重要,应该用来解释复杂的逻辑和算法数据类型概览复合数据类型复合数据类型是由基本数据类型或其他复合类型构造而成的类型,主要包括数组、字符串、指针、引用等数组用于存储同类型的多个元基本数据类型素;字符串是字符数组的特例;指针存储内存2提供了丰富的基本数据类型,包括整型地址;引用则是对象的别名这些类型为提C++C++(、、、)、浮点型供了强大的数据组织和访问能力int shortlong long long(、、)、字符型float doublelong double1(、)和布尔型()每种类char wchar_t bool用户自定义类型型都有特定的内存占用和取值范围,开发者需根据实际需求选择合适的数据类型,以确保程允许用户定义自己的数据类型,包括结构体C++序的正确性和效率3()、联合体()、枚举()struct unionenum和类()结构体和类用于组合不同类型class的数据;联合体允许在同一内存位置存储不同类型的数据;枚举定义命名的整型常量用户自定义类型是面向对象编程的基础C++整型数据有符号和无符号类型整型常量和变量int,short,long,longlong每种整型都有有符号和无整型常量是直接写在程序提供了几种整型数据C++符号两种变体有符号类中的整数值,如、123-456类型,以适应不同范围的型可以表示负数、零和正等可以使用后缀指定常整数值通常占用short2数,而无符号类型只能表量类型表示(如L long字节,范围约为到-32768示零和正数,但正数的范),表示100L LLlong long;通常占用字节,32767int4围更大例如,无符号(如),表示int100LL U范围约为到;-2^312^31-1()的范围是(如)整unsigned intunsigned100U在不同系统上可能是long4到使用型变量必须先声明后使用,02^32-1unsigned字节或字节;至8longlong关键字声明无符号类型,如整型变量int count=0少占用字节,可表示更大8如可以进行算术运算、比较unsigned int count=10范围的整数具体大小和在需要确保非负值的场合,运算等,是编程中最常用范围可能因编译器和平台应使用无符号类型的数据类型之一而异浮点型数据数据类型内存占用精度范围字节位有效数字约float46-7±
3.4E±38字节位有效数字约double815-16±
1.7E±308至少字节,通常或字节位有效数字因实现而异,更广long double8121619+浮点型数据用于表示实数,包括小数部分提供三种浮点类型、和,它们的区别在于精度和表示范围在大多数情况下,是C++float doublelong double double首选,因为它提供了良好的精度和范围平衡浮点数可以用科学计数法表示,例如表示浮点运算可能导致舍入误差,因此不应直接比较两个浮点数是否相等,而应检查它们的差是否小于
3.14159E
2314.159某个小阈值例如,而不是fabsa-b
0.000001a==b字符型数据1128字符类型码范围ASCII类型占用字节内存,可以存储一个字符还标准码表包含个字符,扩展码表包含char1C++ASCII128ASCII提供(宽字符)、和用于支个字符每个字符对应一个的整数值wchar_t char16_t char32_t2560-255持不同的字符编码标准,如Unicode4常用转义序列常用转义字符包括(换行)、(制表符)、\n\t\\(单引号)、(双引号)和(反斜杠)\\\\\\字符型数据在中用于表示单个字符字符常量用单引号括起来,如、、等在内部,字符实际上是C++A3$以其码值存储的,例如的码是这意味着字符类型可以参与整数运算,如的结果是,对ASCII AASCII65A+166应字符B处理多字节字符和国际字符集(如中文、日文等)需要使用宽字符类型或专门的字符编码库这些高级特C++性使能够支持全球化应用程序开发,处理不同语言和文化的文本内容C++布尔型数据和true false类型只有两个可能的值和,分别2bool true false表示逻辑真和逻辑假类型bool是的内置类型,用于表示逻辑值它占1bool C++用至少字节的内存,尽管理论上只需要位11逻辑运算类型主要用于逻辑运算,如与、或和bool||3非操作!布尔型变量在中广泛用于控制流语句的条件判断例如,在语句、循环和循环中,条件表达式的结果被转换为类型以决定执行路径C++if whilefor bool任何非零值(包括负数)在转换为类型时都被视为,而零被视为bool true false布尔类型也可以与其他类型进行转换当值转换为整数或浮点数时,转换为,转换为反之,当数值转换为时,转换为,bool true1false0bool0false其它所有值转换为标准库中的很多函数和容器也使用类型作为返回值或参数,表示操作的成功失败或者某种状态的存在不存在true C++bool//变量声明与定义变量命名规则变量名必须以字母或下划线开头,后跟字母、数字或下划线变量名区分大小写,C++不能使用关键字良好的命名习惯应该使变量名能清晰表达其用途,例如使用(如)或(如)风格,保持一致性变量camelCase studentAgesnake_case student_age名长度应适中,既不过短导致含义不明,也不过长导致代码冗长初始化方式提供多种变量初始化方式复制初始化()、直接初始化()C++int a=10;int a10;和统一初始化()统一初始化是引入的,能防止窄化转换,如int a{10};C++11int会导致编译错误未初始化的局部变量含有垃圾值,而全局变量默认初始化为a{
3.14}零良好的编程习惯是始终显式初始化变量变量作用域变量的作用域决定了它在程序中的可见性和生命周期局部变量在定义它的块(通常是一对花括号)内可见,块结束时销毁全局变量在整个文件中可见,程序结束时销毁还支持命名空间作用域、类作用域和语句作用域(如循环的初始化变量)C++for内层作用域中的变量可以遮蔽外层同名变量常量常量是程序执行过程中值不会改变的量提供了多种定义常量的方法,每种方法都有其特点和适用场景关键字定义的常量具有类型检查和作用域控C++const制,如它可以用于任何类型,包括用户自定义类型,并且可以作为函数参数或返回类型const doublePI=
3.14159265358979;预处理器指令定义的宏常量在编译前被文本替换,如它没有类型检查,作用域从定义处延伸到文件末尾或指令处枚举常#define#define MAX_SIZE100#undef量通过关键字定义,如,每个枚举常量都是一个整数值使用适当的常量可以提高程序的可读性、可维护性和安全性enum enum Color{RED,GREEN,BLUE};运算符概述算术运算符1包括加、减、乘、除和取模等,用于数学计算+-*/%关系运算符2包括等于、不等于、大于、小于、大于等于、小于等于等,用于比较操作,返回布尔值==!===逻辑运算符3包括逻辑与、逻辑或和逻辑非,用于组合条件表达式||!位运算符包括位与、位或、位异或、位取反、左移和右移,用于位级操4|^~作运算符按功能可分为上述四类主要类型,此外还有赋值运算符、、等、条件运算符、成员访问运算符、、索引运算符、函数调用运算符、逗号运算符C++=+=-=:.-[]、运算符等运算符有不同的优先级和结合性,决定了复杂表达式的计算顺序,sizeof运算符的使用应遵循类型兼容性规则,不同类型的操作数可能导致自动类型转换还支持运算符重载,允许自定义类型的对象使用标准运算符,增强了语言的表达能力C++正确理解和使用运算符是编写高效、无错误代码的基础算术运算符详解基本算术运算自增自减运算符优先级和结合性123提供了五种基本算术运算符加、自增和自减运算符可以放在变量在算术表达式中,乘、除和取模的优先C+++++--减、乘、除和取模整数除法前(前缀形式)或后(后缀形式)前级高于加减自增和自减的优先级高于-*/%会截断小数部分,如的结果是,而缀形式首先增加减少变量值,然后返回所有二元算术运算符当优先级相同时,5/22/不是取模运算只适用于整数,新值;后缀形式返回原值,然后增加减按结合性决定计算顺序大多数二元运
2.5a%b/的结果是除以的余数当操作数为负少变量例如,如果,则的结果算符是左结合的,如等价于;a bx=5++x a-b+c a-b+c数时,取模结果的符号与实现有关,但是,也使变为,但表达式值为而一元运算符如自增自减是右结合的6x++x65通常与第一个操作数的符号相同这些运算符常用于循环控制和迭代器操使用括号可以明确指定计算顺序,提高作代码可读性关系运算符比较操作相等性判断提供了六种关系运算符用于比较操作相等运算符和不等运算符可用于C++==!=等于、不等于、大于、小于、基本类型和复杂对象对于基本类型,==!=大于等于和小于等于这些运算它们直接比较值是否相同;对于指针,==符可以比较数值类型、字符类型甚至某比较的是地址值;对于对象,行为取决些对象比较操作通常用在条件语句和于是否重载了这些运算符相等性测试循环语句中,如或是许多算法的基础,如在数组中查找元ifab whilecount=应注意避免浮点数的直接相等比较,素、验证计算结果等需注意初学者常10因为舍入误差可能导致意外结果犯的错误将赋值运算符误写为相等=运算符==运算结果类型所有关系运算符的结果类型都是,即表示条件成立,表示条件不成立这使bool true false得关系表达式可以直接用在逻辑表达式和控制语句中关系运算的优先级低于算术运算,但高于赋值运算,因此等价于多个关系运算符不应连用,如,ab+c ab+c abc因为这会被解释为,通常不是预期行为abc逻辑运算符与、或、非运算短路求值复合条件提供三种基本逻辑运逻辑与和逻辑或运算符使复合条件表达式将多个简C++算符逻辑与、逻辑用短路求值策略,即只计单条件通过逻辑运算符组或和逻辑非逻辑与算确定结果所需的操作数合,用于表达复杂的判断||!要求两个操作数都为对于,如果第一个操作逻辑逻辑运算符的优先true才返回;逻辑或只要数为,则整个表达式级是最高,其次是,true false!有一个操作数为就返必定为,不再计算第最低例如,等truefalse||a||bc回;逻辑非对单个操二个操作数;对于,如果价于为了提true||a||bc作数取反,变,第一个操作数为,则高可读性和避免错误,推truefalse true变这些运算符整个表达式必定为,荐使用括号明确表达计算falsetruetrue主要用于组合条件表达式,也不再计算第二个操作数顺序,如复a||bc如表这种行为可以提高效率,合条件在数据验证、搜索ifage=18hasID示如果年龄大于等于且也常用于避免潜在的运行条件构建等场景中非常实18有时错误,如用ID ifptr!=nullptr ptr-value0位运算符按位与、或、异或移位运算位运算应用按位与对两个操作数的对应位执行左移运算符将所有位向左移动指定位运算在系统级编程、图形处理、加密逻辑与操作,只有当两位都为时结果的位数,右侧用填充右移运算符算法和资源受限环境中广泛应用常见10才为按位或对对应位执行逻辑或将所有位向右移动指定的位数,左侧填应用包括使用位掩码高效存储多个布1|操作,只要有一位为结果就为按位充位取决于操作数类型无符号类型用尔值(标志位),每个位表示一个状态;11异或对对应位执行异或操作,当两位填充,有符号类型通常进行符号扩展实现快速算术运算,如乘除的幂;在^02不同时结果为,相同时为这些操作(复制最高位)对于正数,左移一位不使用临时变量的情况下交换两个值10符常用于位掩码操作,如设置、清除或相当于乘以,右移一位相当于除以();检查整数的22a^=b;b^=a;a^=b检查特定位奇偶性(表示偶数)n1==0例如,,例如,,0xF00x0F=0x000xF0|0x0F4=0xF00xF04=,位运算通常比等效的算术运算更高效,0x0F=0xFF0xF0^0x0F=0xFF0x0F但可读性较差,应添加适当注释赋值运算符简单赋值1简单赋值运算符将右侧表达式的值赋给左侧的变量左侧必须是一个可修改的=左值(如变量),不能是常量或表达式赋值是一个表达式,其值是赋给左操作复合赋值数的值,这允许连续赋值和在其他表达式中使用赋值例如,的值是,可2a=55以写成将三个变量同时置零a=b=c=0复合赋值运算符将运算和赋值结合在一起,包括、、、、、、、+=-=*=/=%==|=、和例如,等价于,但只计算一次,更高效且代码更简^===a+=b a=a+b a洁复合赋值经常用于累加器(如)、计数器(如或sum+=value count++count连续赋值3)和位操作(如设置标志位)+=1flags|=OPTION_ENABLED连续赋值使用赋值表达式的值特性,将同一值赋给多个变量,如赋a=b=c=0值按从右到左的顺序执行首先,然后(即),最后(即c=0b=c b=0a=b a=)连续赋值可以简化代码,但过度使用可能降低可读性应注意类型转换问0题,如会导致(截断),然后doubled;int i;d=i=
3.14i=3d=3条件运算符三目运算符条件运算符也称为三目运算符,是中唯一的三元运算符其语法为:C++condition,含义是如果为,则计算并返回;否则计算并返回expr1:expr2condition trueexpr1这是语句的简洁替代形式,特别适合简单条件选择例如,expr2if-else max=a等价于,但更紧凑ba:b ifab max=a;else max=b嵌套使用条件运算符可以嵌套使用,实现多重条件选择例如,result=abaca:c:计算三个数中的最大值然而,过度嵌套会导致代码难以阅读和维护bcb:c当嵌套超过两层时,通常应考虑使用语句或语句代替,或将复杂表达式if-else switch分解为多个简单表达式,提高可读性与的比较if-else条件运算符与语句的主要区别是条件运算符是表达式,可以嵌入到更大的表if-else达式中或作为函数参数;而是语句,不能用在需要表达式的地方条件运算符if-else通常生成更紧凑的代码,适合简单条件选择;结构更清晰,适合复杂逻辑和多if-else行代码块选择哪种形式主要取决于代码的复杂性和可读性需求控制流程语句-if语句语法if语句的基本语法是,其中是一个表达式,转换为if ifconditionstatement;condition bool类型后决定是否执行如果为,则执行;如果为,statement condition true statementfalse则跳过如果要执行多条语句,必须使用花括号形成一个复合语句(代码块)statement例如ifscore=60{passed=true;successCount++;}结构if-else结构提供了两条不同的执行路径if-else ifconditionstatement1;else statement2;当为时执行,为时执行这样可以处理二选condition truestatement1false statement2一的情况,如热不热结构确保两iftemperature30cout;else cout;if-else个分支中只有一个被执行,适合互斥条件的处理嵌套语句if语句可以嵌套,即在或分支中再包含语句,用于处理多层条件判断例if ifelse if如未成年成年ifage18{cout;}else ifage60{cout;}else{cout老年嵌套通常用于实现多重条件选择,但过深的嵌套会降低代码可读性,;}if此时应考虑使用语句或重构代码结构switch控制流程语句-switch1N0语句语法和的作用switch case default break语句用于多分支选择,语法为每个标签后面必须跟一个常量表达式,多个可以共语句用于跳出,防止执行下一个如果省略switch switchexpressioncase case break switch case用同一段代码标签是可选的,当不匹配,程序会继续执行下一个的代码,这称为贯穿或{case constant1:statements1;break;case constant2:default expressionbreak case任何值时执行部分通常放在最后,但实落空()有时这是有意为之,通常应加注释statements2;break;...default:statementsDefault;}case defaultdefaultfall-through必须是整型或枚举类型(后也支持字符串字际上可以放在任何位置说明,但更多情况下是expression C++11bug面量),与每个后的常量值比较case语句与一系列语句相比,通常更高效(特别是分支较多时),因为编译器可以生成跳转表而不是多次条件测试此外,结构更清晰地表达了基于单个值的多重选择逻switch if-else ifswitch辑在使用语句时,应注意以下几点标签必须是常量表达式,不能是变量;多个不能使用相同的值;如果需要为多个值执行相同代码,可以将放在一起;如果没有匹配的switchcase casecase且没有,则不执行任何操作;每个部分通常应以结束,除非有特殊需求casedefaultcasebreak控制流程循环-while循环控制变量循环控制变量通常在循环前初始化,在循环体内2部更新例如循环语法intcount=0;whilecount10while操作{/**/count++;}循环的语法是while whilecondition1先评估,如果为,则statement;condition true执行,然后返回再次检查,statement condition无限循环如此循环,直到为condition false当始终为时,形成无限循环可以conditiontrue使用创建无限循环,通常需要在循环whiletrue3体内使用条件判断和语句来退出break循环适用于事先不知道确切迭代次数的情况,特别是当循环继续执行取决于循环体内的操作结果时例如,读取文件直到文件末尾,或者处理while用户输入直到满足特定条件循环的关键是确保循环体内有更新条件变量的语句,否则可能导致无限循环while在实际应用中,循环常用于实现数据验证、重试机制、事件等待等功能例如,验证用户输入输入无效,请重while while!isValidinput{cout试或者实现轮询使用循环时,应特别注意边界条件和退出条件,确保循环能在预期条件;cininput;}while!dataReady{sleep100;}while下正确终止控制流程循环-do-while循环语法do-while循环的语法是它首先执行,然后do-while dostatement;whilecondition;statement检查如果为,则重复这个过程;如果为,则结束循环condition conditiontruefalse与循环不同,循环保证至少执行一次循环体,因为条件检查发生在循环while do-while体执行之后这使得特别适合需要至少执行一次操作的场景do-while与循环的区别while循环与循环的主要区别在于条件检查的时机是先判断后执行,do-while while while如果初始条件为,循环体可能一次也不执行;是先执行后判断,即使false do-while初始条件为,循环体也会执行一次此外,语句的末尾必须有分号,而false do-while循环则不需要这个额外的分号while适用场景循环特别适合以下场景用户输入验证,要求用户至少输入一次数据,然后do-while验证,不合格则重新输入;菜单驱动的程序,至少显示一次菜单并处理选择;游戏循环,至少执行一次游戏逻辑;需要在检查退出条件之前初始化某些变量的情况在这些场景中,比更自然,减少了重复代码do-whilewhile控制流程循环-for循环语法循环初始化、条件和更新嵌套循环for for循环的标准语法是初始化部分可以声明和初始化变量,这些变量的作循环可以嵌套,即在一个循环体内包含另一for forinitialization;condition;for for初始化部分()用域限于循环;条件部分必须是一个布尔表达个循环这在处理多维数据结构(如矩阵)时update statement;initialization forfor在循环开始前执行一次;条件部分()在式,决定循环是否继续;更新部分通常用于递增或特别有用例如condition forint i=0;irows;i++{forint每次迭代前检查,如果为则结束循环;更新部递减计数器,但也可以是任何表达式循环的嵌套循环的false forj=0;jcols;j++{matrix[i][j]=0;}}分()在每次迭代后执行这三部分通常用三个部分可以包含多个表达式,使用逗号运算符分时间复杂度是各层循环复杂度的乘积,如两层次update n于控制循环计数器,如所隔,如引入的迭代的循环复杂度为,应注意性能影响forint i=0;i10;i++forint i=0,j=10;ij;i++,j--C++11On²有部分都是可选的,等价于,创建范围循环()简化了集for;;whiletrue forforauto item:collection无限循环合遍历跳转语句语句语句break continue语句用于立即终止最内层的循环语句跳过循环当前迭代的剩余部break continue(、、)或语句,分,直接进入下一次迭代在循环中,for while do-while switchfor并将控制转移到终止结构后的下一条语跳到更新表达式;在和循whiledo-while句在嵌套循环中,只能退出包含环中,跳到条件测试通常用于break continue它的最内层循环常用于在特定条在特定条件下跳过某些值的处理,如忽break件下提前结束循环,如找到搜索目标后略负数forint i=0;isize;i++停止搜索forint i=0;isize;i++{ifarray[i]0continue;sum+=array[i];}只影响最内层循环{ifarray[i]==target{found=true;continuebreak;}}语句(不推荐使用)goto语句提供无条件跳转到程序中标有特定标签的位置语法为,而标签的定goto gotolabel;义为虽然在某些低级系统编程场景中有用,如错误处理和资源清理,但在现label:goto代中通常不推荐使用,因为它可能导致意大利面条式代码,使程序流程难以理解和C++维护异常处理、函数和结构化控制语句通常是更好的替代方案函数基础函数调用1通过函数名和参数列表调用函数函数定义与声明2指定函数的行为和接口返回值和参数3数据传递的基础机制函数是中最基本的代码组织单位,用于封装可重用的代码块一个典型的函数定义包括返回类型、函数名、参数列表和函数体例如C++函数声明(原型)仅包含函数签名,不包含函数体,通常放在头文件中int addint a,int b{return a+b;}int addint a,int b;函数参数是向函数传递数据的方式,可以是值传递、引用传递或指针传递返回值是函数向调用者返回数据的方式,通过语句指定return如果函数不返回值,返回类型为支持默认参数值(在声明时指定)和函数重载(多个同名但参数不同的函数)函数的使用提高void C++了代码的模块化和可维护性,是良好编程实践的核心函数参数传递值传递1值传递是最简单的参数传递方式,函数接收实参的副本例如void incrementint x调用不会改变变量的值,因为函数操作的是的副本值传递适{x++;}incrementa aa合小型数据(如基本类型),传递大对象会带来性能开销值传递的优点是安全(函数不会修改原始数据)和概念简单,缺点是可能需要复制大量数据引用传递2引用传递使函数参数成为实参的别名例如调用void incrementint x{x++;}会使的值增加,因为函数直接操作,而非副本引用传递避免了复制大incrementa a1a对象的开销,允许函数修改原始数据为防止修改,可使用常量引用void,这结合了引用的效率和值传递的安全性displayconst string s指针传递3指针传递传递实参的内存地址例如调用void incrementint*x{*x++;}会增加的值指针可能为,函数应检查incrementa anullptr voidprocessData*p处理指针传递类似引用传递,允许修改原始数据,但语法较复杂(需解{ifp{/**/}}引用),且存在空指针风险现代通常优先使用引用而非指针传参C++函数重载重载的概念重载规则重载示例函数重载是的一个特性,允许在同一函数重载要求函数具有不同的参数列表函数重载的典型示例是创建能处理不同数C++作用域中定义多个同名但参数不同的函数(不同的参数类型、不同的参数数量或两据类型的通用功能,如编译器根据函数调用时提供的参数类型和者兼有)仅仅返回类型不同不足以构成int addinta,int b{return a+b;}数量来决定调用哪个函数版本这种机制重载,因为无法仅根据返回类型来区C++double adddoublea,double b{return a+使开发者可以为执行相似任务但处理不同分函数调用函数的限定符也可以用constb;}数据类型或参数组合的函数使用相同的名于区分重载版本,例如,类的成员函数可string addstringa,string b{return a+b;}称,提高代码的一致性和可读性以有和非版本const const这些函数虽然都执行加法操作,但对不编译器在解析重载函数调用时,会寻找最同类型的数据使用不同的处理逻辑调用函数重载是静态(编译时)多态的一种形佳匹配,考虑精确匹配、提升转换、标准将执行整数加法,执行add1,2add
1.5,
2.3式,与动态(运行时)多态(通过虚函数转换和用户定义转换等因素如果存在多浮点加法,执行字符串addhello,world实现)不同,重载在编译时解析个同等匹配的候选函数,调用将被视为有连接,编译器会自动选择正确的版本歧义,导致编译错误内联函数关键字内联函数的优缺点使用场景inline关键字用于请求编译器优点内联函数可以减少函内联函数最适合以下场景inline将函数调用替换为函数体内数调用开销(保存恢复寄存简短的函数(通常少于行/10的代码,而不是生成函数调器、传参、跳转等),提高代码);频繁调用的函数,用指令语法是执行效率,尤其对频繁调用如访问器修改器inline/的小函数效果明显内联保();性能关return_type getter/setter留了函数的所有优点(封装、键路径上的函数;模板函数function_nameparameters函数体只是对类型检查等),同时提供了实现(通常本质上是内联{/**/}inline编译器的建议,而非命令,宏的性能优势缺点内联的)内联不适合复杂函数、编译器可能忽略这一请求,可能增加代码体积,因为函递归函数或包含循环的大函特别是对于复杂或递归函数数代码在每个调用点都会复数在现代中,优化编C++类定义内部定义的成员函数制,可能影响指令缓存命中译器往往能自动做出比程序默认被视为内联候选,不需率过度使用内联可能导致员更好的内联决策,因此显式使用关键字代码膨胀,实际降低性能关键字更多地成为一个inlineinline提示而非必要指令数组基础一维数组声明和初始化数组元素访问12数组是存储相同类型元素的连续内存块数组元素通过索引访问,语法是一维数组的声明语法是,如表示第type array_name[index]numbers
[0],如数一个元素中,数组索引从开始,有array_name[size];int numbers
[5];C++0组大小必须是常量表达式,之前不效范围是到访问无效索引是未定C++110size-1能是变量可以在声明时初始化义行为,可能导致程序崩溃或数据损坏int如果初始化列不执行数组边界检查,开发者必须确numbers
[5]={1,2,3,4,5};C++表元素少于数组大小,剩余元素将初始化保索引有效循环常用于数组遍历for为使用初始化且不指定大小时,数组0{}forint i=0;i5;i++{coutnumbers[i];}大小由初始化列表元素数量确定引入的范围循环简化了遍历int C++11for numbers[]={1,2,3,4,5}forint x:numbers{coutx;}数组作为函数参数3数组传递给函数时,实际传递的是指向数组第一个元素的指针,而非整个数组副本因此,函数内对数组的修改会影响原始数组函数参数中的数组声明可以省略大小或使用星号void或由于函数不知道数组大小,通常需要额外参数传递processint arr[]void processint*arr大小这种机制使数组处理高效,但增加了修改原始数据的风void processintarr[],int size险多维数组多维数组在中用于表示表格或网格结构的数据二维数组是最常见的形式,声明语法为,如声明一个行列的整数矩C++type array_name[rows][columns];int matrix
[3]
[4];34阵可以在声明时初始化也可以省略第一维度的大小,此时行数由初始化列表推断int matrix
[3]
[2]={{1,2},{3,4},{5,6}};int matrix[]
[2]={{1,2},{3,4},{5,6}};多维数组在内存中是线性存储的,按行优先顺序()排列访问元素使用多个方括号表示第行第列的元素遍历多维数组通常使用嵌套循环row-major ordermatrix
[1]
[0]21当多维数组作为函数参数传递时,除第一维外,其他维度的大小必须指定forint i=0;i3;i++{forint j=0;j4;j++{coutmatrix[i][j];}}void processintarr[]
[4],int支持使用范围循环遍历多维数组,但需要嵌套使用rows;C++11for字符串风格字符串1C风格字符串是以空字符结尾的字符数组定义方式(编译器自动添加C\0char str[]=Hello;空字符)或(需手动添加空字符)风格字符串使用char str[]={H,e,l,l,o,\0};C cstring头文件中的函数处理,如求长度、复制、连接和比较这些函数strlenstrcpystrcatstrcmp依赖于空终止符来确定字符串结束,如果缺失可能导致缓冲区溢出和安全漏洞类简介2string标准库提供类(头文件),是处理字符串的现代方法相比风格字符串,C++string stringC对象自动管理内存,动态调整大小,提供丰富功能和安全性基本操作包括声明和初string始化()、连接(或)、访问字符(或,后者有边界检strings=Hello;s1+s2s1+=s2s[i]s.ati查)、获取长度(或)以及子串提取()s.length s.size s.substr字符串操作函数3类提供多种操作函数和查找子串;替换内容;和插入string findrfind replaceinsert erase和删除内容;比较字符串;获取风格字符串指针(与函数接口兼容);compare c_str CC检查是否为空;清空内容等引入了数值转换函数如(字符串到整数)empty clearC++11stoi和(数值到字符串)标准算法如和也可应用于,提供强to_string std::sort std::transform string大的文本处理能力指针基础指针的概念指针是存储内存地址的变量在中,指针使开发者能够直接操作内存,为数据结构和动态内C++存分配提供基础每个指针都有特定的类型,指示它所指向对象的类型,这使编译器能够正确解释所指向的内存内容例如,是指向整数的指针,可以存储整数变量的地址;是指向int*char*字符的指针,常用于处理字符串指针声明和初始化指针声明语法为或,如星号表明变量是type*pointer_name;type*pointer_name;int*ptr;*指针,而类型说明它指向的数据类型指针可以初始化为另一个变量的地址1int x=10;(是取地址运算符);()或(旧标准)表示不指向任何int*ptr=x;2nullptr C++11NULL对象;动态分配的内存地址未初始化的指针含有int*ptr=nullptr;3int*ptr=new int;垃圾值,使用它可能导致程序崩溃指针运算指针主要支持以下运算解引用访问指针所指向的值,如;地址运算1**ptr=20;2获取变量的内存地址,如;指针算术加减整数(指针移动的单位是其ptr=x;3类型的大小,如移动字节);指针比较检查两个指针是否指向同一位ptr+1sizeofint4置或在内存中的相对位置指针算术常用于数组操作,如通过访==,!=,,=,=*ptr+i问数组元素,等同于ptr[i]指针与数组数组名与指针指针数组数组指针在大多数上下文中,数组名会自动转换为指向指针数组是元素为指针的数组,声明语法为数组指针是指向整个数组的指针,声明语法为数组第一个元素的指针例如,如果定义了,如每个元,如括号int type*array_name[size];int*ptrs
[3];type*pointer_name[size];int*p
[5];,则本身的值(不是)是,素都是一个指针,可以指向同类型的对象指确保先与结合,表明是指针,而不是指针数arr
[5]arr arrarr
[0]p*p即指向第一个元素的指针这就是为什么函数针数组常用于管理动态分配的对象集合或创建组数组指针指向的是整个数组,而非第一个参数中的数组声明如实际等不规则多维数组(每行长度可不同)例如,元素对数组指针解引用会得到一个数组,如void funcintarr[]同于这种自动转换是数创建了访问所指数组的第一个元素数组指针void funcint*arr C++char*names[]={Alice,Bob,Charlie};*p
[0]组处理机制的基础,但也意味着通过函数参数一个存储字符串(字符指针)的数组,适用于主要用于处理多维数组,特别是作为函数参数,传递数组时会丢失大小信息处理文本列表或命令行参数如处理二void processint*matrix
[10],int rows维数组动态内存分配和运算符new delete使用和运算符进行动态内存分配和释放用于分配内存并返回指向该内存的C++new deletenew指针,如分配的内存位于堆(自由存储区)上,程序结束前不int*p=new int;*p=10;new会自动释放使用完内存后,应使用释放不释放动态分配的内存会导致内存delete deletep;泄漏失败时(例如内存不足)会抛出异常,可以使用避免异常new std::bad_alloc newnothrow并返回nullptr动态数组使用分配动态数组,这创建了个整数的连续内存块可以像普通数new[]int*arr=new int
[5];5组一样访问元素释放动态数组必须使用运算符,这确保所有arr
[0]=1;delete[]delete[]arr;数组元素的析构函数被调用(对于非类型很重要)使用但以(非数组形式)POD new[]delete释放是未定义行为引入了和智能指针,它们提供了更安全、更方便的动态内C++11std::vector存管理方式内存泄漏问题内存泄漏是指程序分配了内存但未能释放,导致可用内存减少常见原因包括忘记使用;在前丢失指针引用(如通过赋新值);异常导致语句被跳过;循delete/delete[]delete delete环或递归中的持续分配防止内存泄漏的方法包括使用原则(资源获取即初始化);采RAII用智能指针如和;遵循资源管理类模式;使用内存泄漏检测工具std::unique_ptr std::shared_ptr现代鼓励减少直接使用,转而使用容器和智能指针C++new/delete引用引用的概念引用指针常量引用vs引用是现有变量的别名,提供了另一种访引用和指针的主要区别引用必须初始常量引用声明为1const type问同一内存位置的方式声明语法为化,指针可以声明后再初始化;引用一,如2reference_name=variable;const int,如旦初始化不能改变其引用的对象,指针可它创建了一个无法通过引用修改type reference_name=variable;intx=crx=x;引用必须在创建时初始化,以重新赋值指向其他对象;不存在空引被引用对象的引用常量引用有两个主要10;int rx=x;3之后不能更改为其他变量的引用对引用用,而指针可以为;引用使用普用途函数参数允许函数高效访问对nullptr41的所有操作都直接影响被引用的变量,如通变量语法访问(直接表示的值),指象(避免复制)但防止修改,如rx xvoid会将设为针需要解引用(表示的值);引用;绑定临时对象rx=20;x20*px x5displayconst strings2不占用额外的可观察内存(虽然实现上可常量引用可以绑定到右值(临时对象),引用在底层实现上通常是编译器管理的常能使用指针)而非常量引用不行,如const intr=5+3;量指针,但对程序员隐藏了指针操作,提是合法的供了更简洁、更安全的语法引用通常用于函数参数(避免复制)和函数返回值,指针则更适合表示可选值(可常量引用是中最常用的参数传递机制C++为)和动态内存管理之一,特别适合大型对象,结合了值传递nullptr的安全性和引用传递的效率结构体结构体定义结构体成员访问结构体数组和指针结构体是用户自定义的复合数访问结构体成员的主要方式有结构体数组存储多个相同类型据类型,将不同数据类型的项两种点运算符用于直的结构体,
1.Person people
[100];(成员)组合在一个名称下接访问结构体变量的成员,如可以通过访问特people[i].name定义语法是定元素的成员结构体指针指struct TagPerson p;p.name=Alice;p.age,如;箭头运算符用于向结构体变量{member-list};struct=30;2-Person*p_ptr=通过指针访问结构体成员,如,使用或Person{string name;int age;p;p_ptr-name结构体定义了访问成员结构float height;};Person*pp=p;pp-name=*p_ptr.name一个新类型,可以创建该类型(等同于体可以嵌套(包含其他结构体Bob;*pp.name=的变量中,结)结构体成员在内存中作为成员)或递归(包含指向Person p;C++Bob;构体除了数据成员外,还可以按声明顺序排列,但可能因对自身类型的指针,用于链表等包含成员函数、构造函数、析齐要求而存在间隙,数据结构)结构体常用于表构函数等,在这方面与类相似,可能大于各成员大示复杂数据记录、数据传输、sizeofstruct主要区别是结构体默认成员为小之和内存映射和低级系统编程,在,而类为面向对象编程前广泛用于数据public private组织枚举类型枚举定义枚举常量枚举是用户定义的数据类型,用于创建一组枚举常量是枚举类型中定义的命名整数值命名的整型常量传统枚举使用关键字传统枚举中,常量在定义它们的作用域内可enum定义,这直接访问枚举类常量必须enumColor{RED,GREEN,BLUE};Color c=RED;定义了一个新类型和三个常量、通过枚举类型限定Color REDMood m=Mood::HAPPY;、默认情况下,第一个枚举常枚举常量不能被修改(它们是常量),但枚GREEN BLUE量值为,后续常量值递增可以显式指定举变量可以重新赋值枚举常量可用在任何01值需要整数的地方enum Status{PENDING=1,APPROVED=2,switch color{case RED:引入了强类型枚举(枚传统枚举存在类型安全问题,REJECTED=4};C++11/*...*/break;}举类)如允许隐式转换为整型,而枚举enum classMood{HAPPY,SAD,int i=RED;,提供更好的类型安全性和作用域类则禁止这种隐式转换,需显式转换ANGRY};inti=控制static_castMood::HAPPY;枚举的应用枚举的主要应用包括表示有限集合的选择,如颜色、状态、选项等;提高代码可读性,使12用有意义的名称代替魔术数字;在语句中使用,编译器能检查是否处理了所有可能的枚3switch举值;定义与位掩码结合的标志4enum Flag{READ=1,WRITE=2,EXECUTE=4};int permissions;作为类函数的公共接口的一部分,提供清晰的参数选项枚举比单纯的常量=READ|WRITE;5/定义更集中、更明确地表达了相关常量的集合关系类和对象基础对象创建和使用1对象是类的实例,包含数据并支持操作类的成员声明2类声明描述数据成员和成员函数封装的核心原则3类将数据和功能组合,控制访问类是面向对象编程的基本构建块,定义了一种新的数据类型,包含数据成员(属性)和成员函数(方法)类的定义使用关键字C++class class私有成员公共成员类定义了一个蓝图,而对象是根据这个蓝图创建的实例,每个对象都有自己的数据成员副本,ClassName{private:/**/public:/**/};但共享相同的成员函数代码创建对象的方式包括栈上创建(如)、使用动态内存(如)、作为其他对象的成员或数组元素访ClassName obj;ClassName*ptr=new ClassName;问对象成员使用点运算符()或箭头运算符()类的一个关键特性是封装,通过访问控制(、、)obj.member ptr-member privateprotected public保护内部实现细节不被外部直接访问,提供了数据隐藏和接口抽象,增强了代码的安全性和可维护性类的成员函数成员函数定义内联成员函数指针this成员函数是类定义中声明的函数,用于操作类的数据成员内联成员函数请求编译器在调用点展开函数代码,而不是是一个隐式指针,指向调用成员函数的对象它是每this它们可以在类定义内部实现(隐式内联)或在类外部实现生成函数调用在类定义内实现的成员函数隐式地成为内个非静态成员函数的隐藏参数,允许成员函数访问调用对类内实现联候选也可以使用关键字显式声明象的成员例如,内部实现中实际上是class Circle{public:double area{return inlineinline double radius this-radius类外实内联适合的简写可以显式使用,特别是当参数名与成员名冲
3.14159*radius*radius;}private:double radius;};Circle::area{return
3.14159*radius*radius;}this现需要使用作用域解析运算符简短、频繁调用的函数,但复杂函数的内联可能导致代码突时::class Circle{public:void setRadiusdouble radius{this-radius=膨胀内联只是对编译器的建议,编译器可能忽略此请求,也用于链式调用double area;private:doubleradius;};double Circle::area radius;}this CirclesetRadiusdoubler成员函数可以访问类的特别是对于复杂函数或递归函数内联成员函数在头文件,允许{return
3.14159*radius*radius;}{radius=r;return*this;}所有成员(包括私有成员),不管它们在类中的声明位置中定义,而非内联通常在源文件中定义这样的调用序列object.setRadius
10.setColorred this在静态成员函数中不可用,因为静态函数不与特定对象关联构造函数和析构函数析构函数析构函数是另一种特殊成员函数,在对象销毁时自动调用,用于清理资源(如释放动态分配的内存、关闭文件等)它与类同名,前缀为波浪号,无参数和返回类型~~Person清理代码如果类管理资源,遵循原则至关重要{/**/}RAII资源在构造函数中获取,在析构函数中释放,确保无论对象构造函数2如何销毁(正常作用域结束、异常、显式删除)都会进行适构造函数是特殊的成员函数,在对象创建时自动调用,用当清理于初始化对象的状态它与类同名且无返回类型classPerson{public:Personstring n,inta{name=n;age=a;}默认构造函数1构造函数可以重载,提供不private:string name;int age;};默认构造函数是不带参数的构造函数(或所有参数都有默认同的初始化方式最佳实践是使用成员初始化列表值)如果未定义任何构造函数,编译器会提供一个隐式默,它比在函数体内Personstring n,inta:namen,agea{}认构造函数,它不执行任何初始化一旦定义了任何构造函赋值更高效,对于常量和引用成员是必需的3数,隐式默认构造函数就不再生成可以显式请求默认实现默认构造函数在以下情况下自动调用Person=default;创建无初始值的对象()、数组(Person p;Person)或容器元素如果类有成员缺少默认构造函数people
[10];或有引用常量成员,则必须提供默认构造函数的显式实现/访问控制1public,private,protected提供三种访问修饰符控制类成员的可见性可被任何代码访问,定义类的接口;C++1public2只能被类的成员函数和友元访问,保护实现细节;类似,但允许派private3protected private生类访问,用于继承默认情况下,的成员是的,而的成员是的这是两class privatestruct public者的主要区别一个类可以有多个访问段,如class Example{private:intx;public:void setXintval;protected:int getData;};封装的概念2封装是面向对象编程的核心原则,将数据与操作该数据的方法绑定在一起,并限制对内部数据的直接访问封装通过访问控制实现,通常将数据成员设为,只能通过成员函数(接private public口)操作这种设计提供了多种优势隐藏实现细节,允许实现变更而不影响用户代码;防止数据被无意中修改;提供验证和约束机制;支持面向接口编程,降低代码耦合度;允许类演化而保持向后兼容性友元函数3友元函数是一种特殊函数,虽然不是类的成员,但被授予访问类的和成员的权限privateprotected在类定义中使用关键字声明friend classBox{private:double width;friend voidprintWidthBox友元函数的实现不使用作用域解析运算符友元关系不是对称的(是的友元不意味着box;};A B是的友元)、不是可传递的(是的友元,是的友元,不意味着是的友元),也不能被B AA BB CA C继承友元在需要访问多个类的私有成员或提供特殊外部接口(如运算符重载)时很有用,但过度使用会破坏封装,应谨慎使用静态成员静态数据成员静态成员函数类外初始化静态成员静态数据成员是属于类而非对象的变量,静态成员函数也属于类而非对象,使用静态数据成员必须在类外部定义(除了常无论创建多少个对象,静态成员只有一个关键字声明量整型和枚举静态成员可以在类内初始static staticvoid reset副本使用关键字在类内声明静态函数的特点不能访问化)定义语法包括类型、类名、作用域static class{count=0;}非静态成员(因为没有指针);不能解析运算符和成员名类型类名成员名Counter{public:static intcount;/*...*/};this::=静态成员必须在类外定义(通常在源文件声明为、或;可以访问初始值例如const volatilevirtual;int Counter::count=0;中)静态数据成静态数据成员和其他静态函数;可以在没这个定义通常放在源文件()而不是int Counter::count=0;.cpp员可以是或,与普通成员一样有对象的情况下通过类名调用头文件中,以避免多重定义错误public private受访问控制规则限制Counter::reset引入了内联静态数据成员,允许在类C++17静态成员常用于跟踪对象计数(如上静态函数常用于操作类的静态数据;提内完全定义class Counter{public:inline例)、共享常量、实现单例模式等全局但供不需要对象状态的功能;实现工具函数,简化了静态成员的static intcount=0;};受限于类作用域的数据,避免使用全局变或工厂方法(如标准库中的);使用,无需类外定义内联静态成员特别make_shared量封装类相关功能而不需要创建对象适合于头文件中的模板类和简单常量值运算符重载基础运算符重载是的一项强大特性,允许自定义类类型的对象使用标准运算符(如、、、等)进行操作通过定义特殊名称的函数(如C+++-*/operator followedby thesymbol),开发者可以指定运算符用于类对象时的行为运算符重载提高了代码的直观性和可读性,使自定义类型能够像内置类型一样使用,例如复数加法operator+Complex a,比更自然b,c;c=a+b;c=a.addb;运算符重载有两种实现方式成员函数和全局函数成员函数形式实现,左操作数是调用对象全局函数形式ReturnType operator symbol Parameters{/**/}*this实现,需要作为类的友元才能访问私有成员不是所有运算符都可重载,如(成员访问)、(作用域解析)、(条friend ReturnTypeoperatorsymbolParameters{/**/}.:::件)、等重载时应保持运算符的直觉语义,例如应表示某种加法含义,而不是完全无关的操作,以避免代码混淆sizeof+继承基础基类和派生类继承是面向对象编程的核心机制之一,允许创建从现有类(基类父类)派生的新类(派生类子类),继//承其特性并添加新特性派生类继承基类的成员(数据和函数),可以直接使用它们声明语法class新成员,其中可以是、或DerivedClass:[access-specifier]BaseClass{/**/};access-specifier public protected,决定基类成员在派生类中的访问级别例如,private classRectangle:public Shape{/*...*/}Rectangle类继承类的所有公共和受保护成员Shape继承方式提供三种继承方式,影响基类成员在派生类中的访问级别公有继承()基类的C++1public public成员在派生类中仍为,成员仍为表示是一个关系,派生对象可用于需要publicprotected protected基类对象的地方;保护继承()基类的和成员在派生类中变为2protected publicprotectedprotected派生类之外的代码不能通过继承关系使用基类接口;私有继承()所有基类成员在派生类3private中变为通常表示通过一个关系,实现细节而非接口继承默认情况下,使用私有继承,privateclass使用公有继承struct构造函数和析构函数的调用顺序对象创建和销毁时的调用顺序非常重要构造时,先调用基类构造函数,再调用派生类构造函1数如果有多个基类,按声明顺序构造;派生类构造函数必须通过初始化列表调用基类构造函2数,否则使用基类默认构造函数;析构时顺序相反先调用派生类析构函数,再调用基类析构3函数;虚拟析构函数是确保正确析构的关键,特别是通过基类指针删除派生类对象时正确管4理资源需要理解这些调用顺序,特别是在多层继承和资源管理类中多态性引入虚函数纯虚函数12虚函数是面向对象编程中实现多态性的关纯虚函数是没有实现的虚函数,在声明中键机制,允许派生类重写(覆盖)基类的使用包含至=0virtual void draw=0;函数实现在基类中使用关键字声少一个纯虚函数的类称为抽象类,不能直virtual明当通过基类指针接实例化,只能作为基类使用派生类必virtual voiddraw;或引用调用虚函数时,将执行对象的实际须实现所有继承的纯虚函数,否则也是抽类型对应的函数版本,而不是指针引用象类纯虚函数定义了接口,强制派生类/类型的版本这种行为称为动态绑定或后提供实现,但基类可以提供默认实现供派期绑定,在运行时而非编译时决定调用哪生类调用默认行void Shape::draw{/*个函数版本派生类可以使用关为override*/}键字明确表示重写voiddrawoverride;抽象类3抽象类是包含至少一个纯虚函数的类,它定义了派生类必须实现的接口,但自身不能创建对象抽象类通常用作类层次结构的基础,如可能是、等具体类的抽象基Shape CircleRectangle类尽管不能创建抽象类的实例,但可以创建抽象类的指针和引用,用于引用派生类对象这种能力是实现多态行为的基础,允许通过通用接口处理不同类型的Shape*s=new Circle;对象异常处理语句throw用于抛出异常,可以是任何类型的值,表示发2throw生了错误或异常情况块try-catch1块包含可能抛出异常的代码,块处理这些异try catch常,提供错误恢复和资源清理机制异常类特定于应用程序的异常类继承自,提供std::exception3关于错误的详细信息异常处理是处理程序错误的机制,允许在错误发生时将控制权转移到专门的错误处理代码异常处理的基本语法包括三部分块包含可能引发错误的代C++try码;语句在检测到错误时抛出异常;块捕获并处理异常例如正常处理throw catchtry{ifvalue0throw std::invalid_argumentNegative value;/**/}错误处理catchconst std::invalid_argument e{/**/}标准库提供了异常类层次结构,根类是,派生类包括(程序逻辑错误)和(运行时错误)等开发者可以通C++std::exception std::logic_error std::runtime_error过继承这些类创建自定义异常类,提供更多错误信息使用异常处理的优势包括将错误检测与处理分离;统一错误处理机制;支持资源获取即初始化()RAII模式,即使在出现异常时也能确保资源正确释放文件操作基础文件流类文件的读写文件操作模式标准库通过头文件提供了文件输入输读取文件的基本步骤创建对象,打开文打开文件时可以指定多种模式,控制如何处理文件C++fstream ifstream出功能主要类包括(文件输入流)用件,检查是否成功打开,使用或等函数(读取),(写入),(追ifstreamgetline ios::in ios::out ios::app于读取文件,(文件输出流)用于写入文读取数据,完成后关闭文件(或让对象超出作用域加),(打开后立即定位到文件末尾),ofstream ios::ate件,以及(文件流)同时支持读写这些自动关闭)例如(如果文件存在则截断),fstream ifstreamfiledata.txt;iffile ios::trunc ios::binary类都继承自基本的类,因此支持熟悉的流处理行(二进制模式)这些模式可以组合使用,如iostream{string line;whilegetlinefile,line{/**/}}运算符(和)和操作文件流对象管理文件资写入文件类似创建对象,打开文件,使根据ofstream ofstreamfiledata.bin,ios::out|ios::binary;源,在析构时自动关闭文件,体现了的原用运算符写入数据文件操作可能失败(如文件需要选择适当模式非常重要,如使用确保C++RAIIios::app则不存在或权限不足),应始终检查操作是否成功不覆盖现有文件,或使用处理非文本文ios::binary件还提供了和函C++seekg/seekp tellg/tellp数,用于在文件中移动位置和获取当前位置课程总结知识点回顾在本课程中,我们系统地学习了编程语言的基础知识,包括语言特性、数据类型、C++控制结构、函数、数组、指针、引用、类和对象、继承与多态等核心概念我们从简单的程序开始,逐步深入到面向对象编程的高级特性这些基础知识构成Hello World了编程的坚实基础,为进一步学习和应用打下了基础C++C++进阶学习建议完成本课程后,建议继续学习以下进阶内容标准模板库(),包括容器、算法1STL和迭代器;现代特性(),如智能指针、表达式、移动语2C++C++11/14/17/20lambda义等;设计模式和软件工程原则;多线程和并发编程;在特定领域的应用,345C++如游戏开发、系统编程或嵌入式系统通过项目实践和阅读优质代码来巩固所学知识也是非常重要的QA感谢参与本课程的学习!关于课程内容或编程的任何问题,都可以通过以下方式C++获得解答课后答疑时间;在线论坛和讨论区;预约一对一辅导;电子邮件1234联系教师我们鼓励同学们积极提问和讨论,相互学习学习是一个持续的过程,C++需要不断实践和探索,希望这门课程能为您的编程之旅提供良好的起点。
个人认证
优秀文档
获得点赞 0