还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
的初步知识C++是一门面向对象的高效编程语言,它完全兼容语言,同时扩展了面向对C++C象的特性,使得程序设计更加灵活和强大作为一种被广泛采用的语言,C++在系统软件开发、游戏引擎构建、嵌入式系统和高性能计算等领域有着不可替代的地位本课程将带领大家系统地学习的基础知识,从语法结构到面向对象的思C++想,从内存管理到标准库的使用,让你全面掌握这门强大的编程语言课程概述基本语法和数据类型C++掌握的基础语法规则,理解各种数据类型的特点和使用场景C++控制结构和循环学习条件判断和循环结构,实现程序的逻辑控制函数和模块化编程理解函数的定义和调用,掌握模块化编程的思想面向对象编程基础学习类和对象的概念,理解封装、继承和多态除此之外,我们还将深入探讨指针和内存管理的知识,并通过实践案例将理论知识应用到实际编程中,培养解决问题的能力语言简介C++1年1979丹麦计算机科学家开始设计和开发的前身Bjarne StroustrupC++C withClasses2年1983正式命名为,表示它是语言的增强版本C++C3年1998标准发布,确立了的基本特性和标准库C++98C++4年2011-
2020、、和标准陆续发布,带来了现代的诸多C++11C++14C++17C++20C++新特性语言的设计初衷是在保持语言高效性的同时,增加对面向对象编程的支持它既具C++C有高级语言的抽象能力,又保留了对底层内存的精确控制,使其成为系统开发和性能关键型应用的首选语言的特点C++跨平台性高效性能丰富的库支持编写一次,编译后可在不直接编译为机器码,运行标准模板库提供了大STL同操作系统上运行,支持效率高,适合开发对性能量可复用的数据结构和算、、要求苛刻的应用程序法,第三方库生态系统也Windows Linux等多种平台非常繁荣MacOS底层操作能力允许直接操作内存和硬件资源,适合系统编程和驱动开发同时支持面向过程和面向对象的编程范式,这种灵活性使得开发者可以根据具体问C++题选择最合适的编程方式,在保持代码结构清晰的同时,不牺牲程序的执行效率开发环境搭建Visual Studio微软推出的功能强大的,对平台支持极佳,内置了丰富的调试工具和插件系统IDE WindowsCode::Blocks开源跨平台,轻量级且配置简单,适合初学者和教学使用IDECLion公司开发的现代,提供智能代码补全和重构功能,跨平台支持良好JetBrains C++IDE选择合适的开发环境后,需要了解C++程序的基本编译和运行过程编写源代码.cpp文件→编译为目标文件.obj或.o→链接生成可执行文件.exe或二进制文件→运行程序良好的开发环境能显著提高编程效率和学习体验程序Hello World创建源文件新建一个扩展名为的文件,如.cpp hello.cpp编写代码输入基本的程序结构,包含必要的头文件、主函数和输出语句C++编译和运行使用编译器将源代码转换为可执行程序,然后运行查看结果#includeusing namespacestd;int main{coutHello,World!endl;return0;}这个简单的程序展示了的基本结构首先包含头文件以使用标准输入输出流,然后定C++iostream义函数作为程序入口点,使用输出字符串,最后返回表示程序正常结main coutHello,World!0束基本语法C++标识符命名规则注释方式由字母、数字和下划线组成单行注释这是单行注释••//必须以字母或下划线开头多行注释这是多行注释••/**/区分大小写注释不影响程序执行••不能使用关键字作为标识符•中的语句必须以分号结束,这是语法的重要特点之一程序的执行顺序一般是自上而下的,除非有特殊的控制语句改变执C++;C++行流程有许多保留关键字,如、、等,它们有特定的含义,不能用作变量名C++int ifwhile良好的代码风格和注释习惯对于提高代码可读性和可维护性至关重要,特别是在团队协作环境中基本数据类型数据类型关键字内存大小值范围整型通常字节int4-2,147,483,648~2,147,483,647短整型通常字节short2-32,768~32,767长整型通常字节与相同或更大long4int单精度浮点型字节约,精度float4±
3.4E±38约位6~7双精度浮点型字节约,精度double8±
1.7E±308约位15~16字符型字节或char1-128~1270~255布尔型字节或bool1true false的基本数据类型可以通过关键字修饰成无符号类型,将负数范围转换为正数,例如C++unsigned的范围是在实际编程中,选择合适的数据类型可以优化内存使用并提unsigned int0~4,294,967,295高程序性能变量声明与初始化变量声明语法变量初始化方法数据类型变量名直接初始化;:int a=5;例如构造初始化:int age;float price;:int b5;统一初始化C++11:int c{5};常量声明使用关键字const:const doublePI=
3.14159;编译时常量:constexpr intMAX=100;良好的变量命名规范能显著提高代码可读性通常使用驼峰命名法或下划线命名法,变量名应当反映其用途和含camelCase snake_case义在中,变量必须先声明后使用,未初始化的变量可能包含不确定的C++值,因此建议在声明变量的同时进行初始化基本输入输出标准输入流使用对象从控制台读取用户输入cin例如将用户输入的值存入变量:cinx;x标准输出流使用对象向控制台输出信息cout例如结果是:cout:result;格式化输出使用头文件中的操纵符控制输出格式iomanip例如:coutfixedsetprecision
23.14159;输入验证检查输入是否合法,处理可能的错误状态例如:ifcin.fail{cin.clear;cin.ignore;}中的输入输出操作是基于流的概念,库提供了这些功能输入运算符和输出C++stream iostream运算符可以连续使用,形成链式操作读取输入时会跳过空白字符,这在处理多个输入值时很有cin用运算符关系运算符算术运算符等于•:==加法•:+不等于•:!=减法•:-大于•:乘法•:*小于•:除法•:/大于等于•:=取模余数•:%小于等于•:=逻辑运算符赋值运算符与•:简单赋值•:=或•:||复合赋值•:+=,-=,*=,/=,%=非•:!自增和自减运算符有前缀和后缀两种形式,它们的行为略有不同前缀形式先增加变量值再返回,后缀形式先返回变量值++--++i i++再增加运算符是程序中最基本的操作工具,掌握它们的用法和优先级对编写正确的表达式至关重要C++表达式和运算符优先级最高优先级等[]-.::一元运算符!~++--+-*type sizeof乘除运算*/%加减运算+-关系运算====!=当表达式中包含多个运算符时,优先级规则决定了运算的顺序括号可以改变默认的优先级,使括号内的表达式优先计算在复杂表达式中,适当使用括号不仅可以确保计算顺序正确,还能提高代码的可读性常见的运算错误包括整数除法截断结果为而非和忽略运算优先级导致的逻辑错误理解运算符优先级和结合性是避免这些问题的关键5/
222.5类型转换隐式类型转换显式类型转换(风格)C编译器自动执行的类型转换,例如将使用类型表达式的形式强制进行类型转int赋值给时,会自动将整数转换为换,例如将整数转换为浮点double double55浮点数数
5.0风格的类型转换C++提供了更安全、更可控的类型转换机制,包括、、和static_cast dynamic_cast const_castreinterpret_cast//隐式类型转换示例int i=5;double d=i;//整型隐式转换为浮点型//显式类型转换示例double pi=
3.14159;int intPi=static_castpi;//浮点型显式转换为整型,结果为3类型转换可能导致数据精度丢失或数据范围溢出等问题,因此在执行类型转换时需要谨慎风格C++的类型转换比风格的类型转换更加明确和安全,能在编译时捕获更多潜在错误C条件语句if-else简单if语句条件语句块if{}if-else语句2条件语句块语句块if{1}else{2}多重if-else语句3条件条件if1{...}else if2{...}else{...}//成绩评级示例int score=85;if score=90{cout优秀endl;}else ifscore=80{cout良好endl;}else ifscore=60{cout及格endl;}else{cout不及格endl;}条件语句是控制程序流程的基本方式,使程序能够根据不同条件执行不同的代码路径语句的条件表达式必须是布尔类型,或者能够隐式转换为布尔类型非零值被视为,零值被视为if truefalse条件语句switch语句语法语句特点switch switch表达式必须是整型或枚举类型•switch表达式{标签必须是常量表达式case常量1:•case用于跳出结构语句块1;•break switchbreak;处理所有未匹配的情况•defaultcase常量2:不同之间可以共用代码(不使用)•case break语句块2;break;...default:默认语句块;}语句适合处理多分支条件判断,特别是当判断条件是对同一个变量的不同值进行比较时与一系列的语句相比,语句通常更加清晰和高switch if-else switch效忘记使用语句会导致代码继续执行下一个,这有时是故意的技巧,但也常常是错误的来源break case语句的限制是标签必须是常量,不能是变量或范围条件,这时候语句会更灵活switch caseif-else三元条件运算符基本语法使用案例条件表达式表达式查找最大值1:2:max=aba:b;如果条件为真,整个表达式的值为表达式的值;否则为条件赋值成年未成年1:status=age=18:;表达式的值2与对比if-else三元运算符更简洁,适合简单条件判断更易读,适合复杂条件和多行代码块if-else//使用三元运算符的绝对值函数int abs_value=x0-x:x;//等价的if-else语句int abs_value;if x0{abs_value=-x;}else{abs_value=x;}三元条件运算符是中唯一的三目运算符,它提供了一种简洁的方式来编写条件表达式虽然嵌套使用三元运算符是可能C++的,但过度嵌套会导致代码难以理解,应当避免在选择使用三元运算符还是语句时,代码的可读性应当是首要考虑因if-else素循环结构循环while条件评估执行循环体检查循环条件是否为真如果条件为真,执行循环内的代码块循环结束返回评估当条件为假时,退出循环并继续执行后续代码执行完成后,重新检查循环条件//求1到10的和int sum=0;int i=1;while i=10{sum+=i;i++;}cout和为:sumendl;循环结构循环do-while循环语法适用场景do-while需要至少执行一次循环体的情况•do{用户输入验证//循环体•}while条件;•菜单驱动的程序读取数据直到特定条件满足•与循环的关键区别是,循环会先执行一次循环体,然后再检查条件while do-while//简单的菜单系统int choice;do{cout
1.查看数据endl;cout
2.添加记录endl;cout
3.删除记录endl;cout
0.退出endl;cout请选择:;cinchoice;//处理用户选择}while choice!=0;循环是一种后测试循环,它保证循环体至少执行一次,这与循环不同这种特性使得循环特别适合那些需要在判断条件前先执行某些操作的场景,例如读取用户输入并验证其有do-while whiledo-while效性循环结构循环for循环的基本语法如下forfor初始化;条件;递增/递减{//循环体}循环将循环的三个关键部分(初始化、条件检查和迭代)紧凑地放在一起,使得循环结构一目了然初始化部分只在循环开始前执行一次,条件在每次循环迭代前检查,递增递减部for/分在每次循环体执行后执行循环中声明的变量作用域仅限于循环内部,这有助于避免变量名冲突嵌套循环常用于处理多维数组或需要考虑多个变量组合的情况,但需要注意嵌套层次过多会增加代码复杂for for度循环控制语句语句语句语句break continuegoto立即终止当前循环或语句,程序继跳过当前迭代的剩余部分,直接进入下一无条件跳转到程序中带标签的语句处虽switch续执行循环或后的下一条语句常次循环迭代用于跳过特定条件下的处理然支持语句,但它通常被认为会switch C++goto用于提前退出循环,如当找到特定值或发步骤,而不终止整个循环导致代码难以理解和维护,现代编程几乎生错误时不使用循环控制语句改变了程序的正常执行流程,使开发者能够更灵活地控制循环的行为和是最常用的循环控制语句,它break continue们分别用于终止循环和跳过当前迭代合理使用这些语句可以简化代码逻辑,但过度使用可能使代码难以理解数组基础数组声明数据类型数组名元素数量[];例如声明一个包含个整数的数组:int numbers
[5];//5数组初始化完全初始化int numbers
[5]={10,20,30,40,50};//部分初始化,剩余元素为int partial
[5]={1,2,3};//0自动确定大小int auto_size[]={1,2,3,4,5};//元素访问使用索引访问数组元素,索引从开始0例如设置第一个元素的值:numbers
[0]=100;//数组遍历使用循环访问数组中的所有元素例如:forint i=0;i5;i++{coutnumbers[i];}数组在内存中是连续存储的,这意味着数组元素在物理内存上是相邻的,这使得数组访问非常高效然而,中C++的数组没有边界检查,访问越界可能导致未定义行为小心谨慎地管理数组索引,确保它们始终在有效范围内,这一点非常重要多维数组声明二维数组行列的二维数组int matrix
[3]
[4];//34初始化二维数组int matrix
[2]
[3]={{1,2,3},{4,5,6}};访问元素访问第行第列的元素int value=matrix
[1]
[2];//23内存布局行优先存储,连续的行元素在内存中相邻遍历二维数组使用嵌套循环,外层循环遍历行,内层循环遍历列//二维数组遍历示例int matrix
[3]
[4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};for inti=0;i3;i++{for intj=0;j4;j++{coutmatrix[i][j]\t;}coutendl;}多维数组在处理表格数据、矩阵计算和图像处理等应用中非常有用支持任意维度的数组,但实际中二维和三维数组最为C++常见理解多维数组的内存布局对于高效编程至关重要,特别是在性能敏感的应用中字符串处理风格字符串类C C++string本质上是以空字符结尾的字符数组,使用标准库提供的字符串类,包含在头文件\0C++string数组表示操作需要借助库中提供了丰富的成员函数,如char cstringstring.h length,中的函数,如等等,使字符串操作更加安全和便strlen,strcpy,strcat substr,find捷字符串转换风格字符串和类之间可以相互转换对象可以用方法获取风格字符串,而风格字符串可C stringstring c_str CC以直接赋值给对象string//C风格字符串示例char greeting
[6]={H,e,l,l,o,\0};char simple[]=World;//自动添加\0//C++string类示例#includestring message=Hello,C++!;string name;cout请输入您的名字:;getlinecin,name;//读取一整行,包括空格在现代编程中,推荐使用类而非风格字符串,因为类更安全(自动管理内存)、更灵活(可变长度)C++string Cstring且功能更丰富类支持常见的字符串操作,如连接、比较、查找和替换,并与的输入输出流无缝集成string C++函数基础函数定义函数声明返回类型函数名参数列表返回类型函数名参数列表{;函数体声明告诉编译器函数的存在,但不包含实现细节//返回值如果有的话return;//}函数调用函数名实际参数;或者对于有返回值的函数变量函数名实际参数=;//函数声明int addint a,int b;//主函数int main{int result=add5,3;cout5+3=resultendl;return0;}//函数定义int addint a,int b{return a+b;}函数是程序的基本构建块,它将一段执行特定任务的代码封装起来,使其可以被重复使用函数的主要优点包括代码复用、模块化设计和抽象化,这些C++都有助于创建更易于维护和理解的程序函数可以接受参数(输入)并返回值(输出),也可以没有参数或没有返回值函数参数值传递复制参数值,函数内修改不影响原始变量引用传递传递原始变量的引用,函数内修改会影响原始变量常量引用传递只读引用,既高效又安全//值传递示例void incrementByValueint x{x++;//只影响局部副本}//引用传递示例void incrementByReferenceint x{x++;//修改原始变量}//常量引用示例void printValueconstint x{coutxendl;//只读访问//x++;//错误!不能修改常量引用}参数传递方式的选择对函数的行为和性能有重要影响值传递适合小型数据类型(如基本类型),因为它们复制的开销小,且可以保护原始数据不被修改引用传递适合大型数据类型(如结构体、类对象),因为它避免了不必要的复制,提高了效率常量引用结合了两者的优点,既避免了复制,又保护了原始数据函数高级特性默认参数函数重载void printstringmessage,//同名不同参bool newline=true{int maxinta,int b{coutmessage;return aba:b;if newlinecoutendl;}}double maxdoublea,double b{//调用return aba:b;printHello;//使用默认参数}printWorld,false;//覆盖默认参数//调用max5,7;//调用int版本max
3.2,
2.5;//调用double版本内联函数是一种优化技术,用关键字声明的函数在调用点展开,避免了函数调用的开销适合短小且频繁调用的函数,但过度使用可能导致代码膨胀inline//函数模板示例templateT maximumTa,T b{return aba:b;}//调用maximum10,20;//显式指定类型maximum
3.4,
2.5;//显式指定类型maximum10,20;//类型自动推导函数模板允许创建通用函数,可以处理不同类型的数据,减少代码重复模板参数类型在编译时确定,因此不会有运行时开销变量的作用域和生命周期12局部变量全局变量在函数或代码块内声明,仅在该作用域内可见,离开作用域后被销毁在所有函数外声明,整个程序中可见,程序结束时销毁34静态变量自动变量使用关键字声明,保持其值直到程序结束默认的局部变量类型,作用域结束时自动销毁,关键字在中有新含义static autoC++11//静态局部变量示例void counter{static intcount=0;//初始化仅执行一次count++;cout函数被调用count次endl;}int main{counter;//输出:函数被调用1次counter;//输出:函数被调用2次counter;//输出:函数被调用3次return0;}理解变量的作用域和生命周期对于正确管理程序资源和避免错误至关重要过多的全局变量会使程序难以维护,因为它们可能在程序的任何地方被修改静态局部变量提供了一种在函数调用之间保持状态的方法,而不必使用全局变量指针基础指针声明数据类型指针名*;例如声明一个指向整数的指针:int*ptr;//指针初始化int value=5;指针指向的地址int*ptr=value;//value指针解引用通过指针访问它所指向的值修改的值为:*ptr=10;//value10空指针中的空指针int*ptr=nullptr;//C++11在使用指针前应检查它是否为空指针是中最强大也最容易出错的特性之一它们存储内存地址,使得程序可以直接操作内存,这C++对于动态内存分配、数据结构实现和底层系统编程至关重要但不正确使用指针可能导致内存泄漏、段错误和悬空指针等问题引入了关键字作为空指针常量,替代了传统的宏,提高了类型安全性和代码可读C++11nullptr NULL性指针和数组动态内存分配分配内存使用内存使用new运算符从堆上分配内存通过指针访问和操作分配的内存4安全管理释放内存处理空指针、避免内存泄漏和双重释放使用delete运算符释放不再需要的内存//动态分配单个对象int*p=new int;*p=10;cout*pendl;delete p;//释放内存//动态分配数组int*arr=new int
[5];for inti=0;i5;i++{arr[i]=i*10;}delete[]arr;//释放数组内存//使用智能指针C++11#includestd::unique_ptr smart_pnew int20;//自动管理内存,无需手动delete引用特性引用指针定义变量的别名存储内存地址的变量声明语法类型引用名=变量;类型*指针名;初始化声明时必须初始化可以在声明后初始化重新赋值不能重新绑定到其他变量可以指向不同的内存位置空值不存在空引用可以是nullptr使用直接使用,如同原变量需要解引用,如*ptr//引用作为函数参数void swapByReferenceinta,int b{int temp=a;a=b;b=temp;}//引用作为函数返回值int getElementint*array,int index{return array[index];}int main{intx=5,y=10;swapByReferencex,y;//x=10,y=5int numbers
[5]={1,2,3,4,5};getElementnumbers,2=30;//numbers
[2]=30return0;}引用提供了一种更安全、更直观的方式来实现指针的功能它们在函数参数传递、操作符重载和类成员函数中特别有用引用一旦初始化后不能改变其引用的对象,这提供了额外的安全性,但也限制了灵活性理解引用与指针的区别和适用场景对于编写高效且安全的代码至关重要C++结构体结构体定义结构体变量声明成员访问结构体名结构体名变量名直接访问变量名成员名struct{;:.成员类型成员名例如通过指针指针变量成员名11;:Student s1;:-成员类型成员名也可以在定义时同时声明变量22;:更多成员//...struct Student{...}s1,s2;};//结构体定义struct Student{string name;int id;float gpa;};//结构体使用int main{//声明并初始化Student s1={张三,20220001,
3.8};//访问成员cout姓名:s
1.nameendl;//通过指针访问Student*ptr=s1;ptr-gpa=
3.9;//结构体数组Student class_list
[3]={{张三,20220001,
3.9},{李四,20220002,
3.7},{王五,20220003,
3.5}};return0;}枚举类型传统枚举()作用域枚举()C++98C++11enum Color{enum classTrafficLight{RED,//值为0RED,GREEN,//值为1YELLOW,BLUE//值为2GREEN};};//使用//使用Color c=RED;TrafficLight light=TrafficLight::RED;if c==RED{cout颜色是红色endl;//必须使用作用域运算符}if light==TrafficLight::RED{cout停车endl;//可以与整数比较}if c==0{cout颜色是红色endl;//不能隐式转换为整数}//if light==0{}//错误枚举类型为程序提供了一种定义命名常量集合的方式,使代码更具可读性和类型安全性传统枚举类型存在一些问题,如枚举常量泄露到外部作用域和可以与整数隐式转换,这可能导致意外行为引入的作用域枚举()解决了这些问题,它提供了更强的类型安全性,不会有名称冲突,并且不会隐式转换为整数在现代中,推荐使用作用域枚举枚举类型特别适用于表示一C++11enum classC++组相关的常量值,如状态、选项、类型等类和对象基础类定义声明类的结构、属性和行为对象创建实例化类,分配内存并初始化成员访问通过对象使用类的属性和方法对象销毁对象超出作用域时释放资源//类定义class Rectangle{private:double width;double height;public://构造函数Rectangledouble w,double h:widthw,heighth{}//成员函数double getArea{return width*height;}double getPerimeter{return2*width+height;}};//创建并使用对象int main{Rectangle rect
5.0,
3.0;//创建对象cout面积:rect.getAreaendl;cout周长:rect.getPerimeterendl;return0;}访问控制private protected只能被该类的成员函数访问可被该类的成员函数访问子类不能直接访问可被子类的成员函数访问外部代码不能直接访问外部代码不能直接访问publicfriend可被该类的成员函数访问可以声明特定的函数或类为友元可被子类的成员函数访问友元可以访问类的私有成员可被任何外部代码访问class BankAccount{private:double balance;//私有成员,保护数据protected:string accountType;//子类可访问public:BankAccountdouble initialBalance:balanceinitialBalance{}void depositdoubleamount{if amount0{balance+=amount;}}bool withdrawdoubleamount{if amount0balance=amount{balance-=amount;return true;}return false;}double getBalanceconst{return balance;}};构造函数和析构函数1默认构造函数无参数的构造函数,如果没有定义任何构造函数,编译器会自动生成2带参构造函数接受参数的构造函数,用于初始化对象3拷贝构造函数以同类型对象作为参数,用于创建对象的副本4析构函数在对象销毁时自动调用,用于释放资源class Person{private:string*name;int age;public://默认构造函数Person:namenew string匿名,age0{cout默认构造函数被调用endl;}//带参构造函数Personconst stringn,inta:namenew stringn,agea{cout带参构造函数被调用endl;}//拷贝构造函数Personconst Personother:namenew string*other.name,ageother.age{cout拷贝构造函数被调用endl;}//析构函数~Person{cout析构函数被调用endl;delete name;//释放动态分配的内存}};类的特殊成员函数拷贝构造函数拷贝赋值运算符创建对象的副本将一个对象的值赋给另一个已存在的对象classNameconst className other classNameoperator=const classNameother移动构造函数C++11移动赋值运算符C++11通过窃取资源创建对象将一个对象的资源转移给另一个对象classNameclassName othernoexcept classNameoperator=classNameothernoexceptclass StringWrapper{private:string*data;public://构造函数StringWrapperconst strings:datanew strings{}//拷贝构造函数StringWrapperconst StringWrapper other:datanew string*other.data{}//拷贝赋值运算符StringWrapper operator=const StringWrapperother{if this!=other{delete data;data=new string*other.data;}return*this;}//移动构造函数StringWrapperStringWrapper othernoexcept:dataother.data{other.data=nullptr;//防止other析构时释放资源}//移动赋值运算符StringWrapper operator=StringWrapperothernoexcept{if this!=other{delete data;data=other.data;other.data=nullptr;}return*this;}//析构函数~StringWrapper{delete data;}};对象数组和对象指针对象数组是包含多个相同类型对象的数组,在创建时会调用每个元素的构造函数//对象数组Student students
[3]={Student张三,101,Student李四,102,Student王五,103};//访问对象数组元素coutstudents
[1].getNameendl;对象指针是指向对象的指针,可以用于动态创建对象和实现多态//创建单个对象的指针Student*ptrStudent=new Student赵六,104;//使用箭头运算符访问成员coutptrStudent-getNameendl;//释放动态分配的对象delete ptrStudent;//this指针示例class Counter{private:int value;public:Counter increment{value++;return*this;//返回对象自身的引用}};//允许链式调用Counter c;c.increment.increment.increment;继承基础基类/父类定义共同特性和行为派生类/子类继承基类的特性,添加或修改功能继承方式public,protected,private//基类class Shape{protected:string color;public:Shapeconst stringc:colorc{}virtual void draw const{cout绘制一个color的形状endl;}virtual double area const{return
0.0;}};//派生类class Circle:public Shape{private:double radius;public:Circleconst stringc,double r:Shapec,radiusr{}voiddrawconst override{cout绘制一个color的圆,半径为radiusendl;}double areaconst override{return
3.14159*radius*radius;}};多态性多态的概念允许不同类的对象对同一消息作出不同的响应实现一个接口,多种实现的设计原则虚函数使用关键字声明的函数,可以在派生类中被覆盖virtual基类指针或引用调用虚函数时,会动态绑定到对象的实际类型纯虚函数和抽象类语法返回类型函数名参数:virtual=0;包含纯虚函数的类是抽象类,不能实例化对象运行时多态与编译时多态运行时多态通过虚函数和动态绑定实现编译时多态通过函数重载和模板实现//抽象基类class Animal{public:virtual void makeSound const=0;//纯虚函数virtual~Animal{}//虚析构函数};//具体派生类class Dog:public Animal{public:void makeSoundconst override{cout汪汪!endl;}};class Cat:public Animal{public:voidmakeSoundconst override{cout喵喵!endl;}};//多态使用void animalSoundconstAnimal animal{animal.makeSound;//动态绑定}int main{Dog d;Cat c;animalSoundd;//输出:汪汪!animalSoundc;//输出:喵喵!return0;}异常处理try-catch机制块包含可能抛出异常的代码,块捕获并处理异常可以有多个块,捕获不同类型的异常未捕获的异常会沿调用栈向上传播,最终如果没有处理,程序会终止try catchcatchthrow语句使用关键字抛出异常,可以抛出任何类型的对象,包括内置类型、标准异常类或自定义异常类抛出异常后,程序控制权会立即转移到匹配的块throw catch标准异常类标准库提供了一组异常类,从基类派生,如、等这些异常类提供了方法来获取异常描述信息C++std::exception std::runtime_error std::logic_error what#includedouble dividedoublea,double b{if b==0{throw std::runtime_error除数不能为零;}return a/b;}int main{try{double result=divide10,0;cout结果:resultendl;}catch conststd::exception e{cout捕获到异常:e.whatendl;}catch...{cout捕获到未知异常endl;}return0;}文件输入输出文件流类文件输入流ifstream:文件输出流ofstream:文件输入输出流fstream:文件打开stream.openfilename,mode或在构造函数中:ifstream infilename文件读写使用和运算符或使用等方法get,getline,write文件关闭stream.close离开作用域时自动关闭#include#includeint main{//写入文件ofstream outFiledata.txt;if outFile.is_open{outFile姓名:张三endl;outFile年龄:25endl;outFile职业:软件工程师endl;outFile.close;}else{cout无法打开文件进行写入endl;}//读取文件ifstream inFiledata.txt;if inFile.is_open{string line;while getlineinFile,line{coutlineendl;}inFile.close;}else{cout无法打开文件进行读取endl;}return0;}命名空间命名空间的概念命名空间是一种将全局作用域划分为不同部分的机制,用于解决名称冲突问题,特别是在大型项目或库中定义命名空间使用关键字定义,可以包含变量、函数、类等多种类型的定义,同一命名空间可以跨多个文件namespace使用命名空间通过作用域运算符访问命名空间中的成员,或使用声明和指令简化访问::using命名空间的嵌套命名空间可以嵌套定义,创建更细粒度的组织结构,反映更复杂的模块关系//定义命名空间namespace Mathematics{const doublePI=
3.14159;double squaredoublex{return x*x;}namespace Geometry{double circleAreadoubleradius{return PI*squareradius;}}}//使用命名空间int main{//完全限定名称double area1=Mathematics::Geometry::circleArea
5.0;//using声明using Mathematics::PI;doublearea2=PI*
25.0;//using指令using namespaceMathematics;double sq=square
4.0;return0;}标准模板库简介STL容器算法存储数据的集合,如等操作容器中数据的函数,如等vector,list,map sort,find,transform函数对象迭代器可以像函数一样调用的对象,用于定制算法行为连接容器和算法的桥梁,允许遍历容器元素#include#include#include#includeusing namespacestd;int main{//创建vector容器并添加元素vector names;names.push_back张三;names.push_back李四;names.push_back王五;names.push_back赵六;//使用迭代器遍历cout名字列表:endl;for vector::iterator it=names.begin;it!=names.end;++it{cout*itendl;}//使用算法sortnames.begin,names.end;cout排序后:endl;for constauto name:names{//使用范围for循环C++11coutnameendl;}//查找元素auto it=findnames.begin,names.end,王五;if it!=names.end{cout找到了:*itendl;}return0;}常用数据结构//向量示例vector v={1,2,3,4,5};v.push_back6;//添加元素cout第三个元素:v
[2]endl;//随机访问//链表示例list l={10,20,30};l.push_front5;//在前面添加元素l.push_back40;//在后面添加元素//映射关联数组示例map scores;scores[张三]=95;scores[李四]=88;cout张三的分数:scores[张三]endl;//栈示例stack s;s.push10;//入栈s.push20;cout栈顶元素:s.topendl;//访问栈顶s.pop;//出栈算法基础新特性简介C++11auto关键字自动类型推导,简化变量声明例如的类型自动推导为:auto i=10;//i intlambda表达式创建匿名函数对象,简化代码例如:auto add=[]inta,int b{return a+b;};范围for循环简化容器遍历例如:for autoitem:container{...}智能指针自动管理内存,防止内存泄漏例如:std::unique_ptr,std::shared_ptr//auto关键字示例auto number=42;//intauto pi=
3.14159;//doubleauto name=张三;//const char*auto scores=vector{90,85,95};//vector//lambda表达式示例vector numbers={1,2,3,4,5};auto square=[]intx{return x*x;};transformnumbers.begin,numbers.end,numbers.begin,square;//范围for循环示例for constauto num:numbers{coutnum;//输出:1491625}是语言的一次重大更新,引入了许多现代特性,使代码更简洁、更安全、更高效取代了宏,提供了更好的类型安全性;移动语义和右值引用提高了性C++11C++nullptr NULL能;标准库也得到了扩展,增加了线程支持、正则表达式和随机数生成等功能这些特性共同构成了现代的基础,使保持了竞争力并适应了现代软件开发的需求C++C++代码风格和最佳实践命名约定代码组织类名首字母大写的驼峰命名法相关功能放在同一个文件中•:PascalCase•变量和函数首字母小写的驼峰命名法或下划限制文件和函数的长度•:camelCase•线命名法snake_case保持适当的缩进和空白•常量全大写加下划线•:UPPER_SNAKE_CASE一致的花括号风格•成员变量前缀或后缀,如或•:m__m_count count_将接口声明和实现分开•注释应当解释为什么这样做,而不仅仅是做了什么,后者通常应该通过代码本身表达清楚重要的是写出自文档化的代码,即代码自身就能清晰地表达意图,减少对注释的依赖调试技巧包括使用断点、观察变量、单步执行、条件断点等学会使用调试器而不仅仅依赖打印语句可以极大提高问题定位和解决的效率遵循原则和原则有助于写出高质量、可维护的代码最重要的是保持一致性,无论采用SOLID DRYDontRepeat Yourself什么风格,在整个项目中都应保持一致实际项目示例简单控制台应用学生信息管理系统贪吃蛇游戏通过命令行界面演示基本的功能,如输入输使用面向对象设计实现学生数据的添加、查询、实现经典的贪吃蛇游戏,需要处理图形显示、用C++出、条件语句、循环和函数适合初学者练习基修改和删除功能涉及类设计、文件、容户输入、游戏逻辑和碰撞检测通过这个项目可I/O STL础概念,可以实现计算器、文本处理或简单游器使用,是练习综合应用知识的好项目以学习游戏循环、时间控制和简单物理模拟C++戏文本编辑器是另一个值得尝试的项目,它涉及文本处理、文件操作、界面设计和快捷键响应等多个方面这类项目不仅能帮助巩固知识,还能培养软C++件架构设计能力实践项目是掌握编程语言最有效的方式,通过解决实际问题,可以深入理解语言特性和编程技巧建议从简单项目开始,逐步挑战更复杂的任务,在实践中不断积累经验并完善自己的编程能力学习资源与后续发展推荐书籍在线资源《》全面介绍语言的经典著全面的语言和标准库C++Primer C++cppreference.com C++作,适合初学者和有经验的程序员参考《》和《提供教程、参考和论坛Effective C++More Effectivecplusplus.com》的系列著作,讲解C++Scott MeyersC++、和提供各种级别的Coursera edXUdemy最佳实践课程C++《标准库》深入探讨标准库的设计和C++C++上的开源项目学习实际工程中的GitHub C++使用应用进阶学习方向图形编程使用或OpenGL DirectX游戏开发学习或Unreal EngineUnity系统编程操作系统、编译器设计高性能计算并行编程、CUDA在各行业有广泛的应用前景,包括游戏开发、金融系统、嵌入式系统、高性能计算和科学模拟等随着人工智C++能和物联网的发展,的底层控制能力和高性能特性使其在这些新兴领域也有重要地位C++学习编程是一个持续的过程,建议通过实践项目巩固所学知识,参与开源社区获取反馈和经验,阅读优秀代码提高编程素养保持对新技术的好奇心和学习热情,不断更新知识体系,才能在快速发展的技术领域保持竞争力。
个人认证
优秀文档
获得点赞 0