C++能力提升
文章平均质量分 87
此专栏旨在复习巩固C++相关知识,以C++ Primer Plus,C++从入门到精通为工具书,结合所学整理。
zhugenmi
励志做一个资深码农
展开
-
C++ lambda
先来看一个例子,假设有一个整数列表,我们希望统计一下其中有多少个整数可以被7整除。第一种方案,我们先采用普通函数的形式来实现。我们使用vector来存储数字,使用generate()来往vector中填充随机数。上面的代码即是往vector中填充随机数。为了计算有多少个数能被7整除,这里采用count_if()算法,count_if()算法和generate()函数差不都,同样前两个参数也是指定了一个区间,第三个参数则是一个bool 类型的函数对象。因此,我们可以通过以下函数来计算符合条件的元素。原创 2023-03-13 16:32:20 · 324 阅读 · 0 评论 -
【C++】友元、嵌套类、异常、RTTI、类型转换运算符
友元类、友元成员函数和嵌套类是在其他类中声明的类;新增的特性:异常、运行阶段类型识别(RTTI)和改进后的类型转换控制。C++异常处理提供了处理特殊情况的机制,如果不对其进行处理,将导致程序终止。RTTI是一种确定对象类型的机制。新的类型转换运算符提高了类型转换的安全性。可以将类作为友元,在这种情况下,友元类的所有方法都可以访问原始类的私有成员和保护成员。¬¬也可以只将特定的成员函数指定为另一个类的友元。当函数需要访问两个类的私有数据时,这就需要使用友元。例如,假定有一个Probe类和一个Analyzer类原创 2022-12-18 08:00:00 · 474 阅读 · 0 评论 -
【C++】代码重用(valarray、私有继承、多重继承、类模板、具体化、模板别名)
C++促进代码重用:公有继承;包含、组合或层次化(类成员本身是另一个类的对象)valarray类是由头文件支持的。这个类用于处理数值(或具有类似特性的类),它支持诸如将数组中所有元素的值相加以及在数组中找出最大和最小的值等操作。其构造函数的几个例子:在C++11中,也可使用初始化列表: //C++11该类的一些方法::访问各个元素:返回包含的元素数:返回所有元素的总和:返回最大的元素:返回最小的元素valarray被定义为一个模板类,一遍能够处理不同的数据类型;模板特性意味着声明对象时,必须指原创 2022-12-17 08:00:00 · 686 阅读 · 0 评论 -
【C++】类继承(基类、公有继承、静态联编、动态联编、访问控制)
类继承: 通过继承完成的工作:可在已有类的基础上添加功能;可以给类添加数据;可以修改类方法的行为。其中derived是派生类,base是基类,x和y是基类构造函数使用的变量。4. 基类指针可以在不进行显式类型转换的情况下指向派生类对象;基类引用可以在不进行显式类型转换的情况下引用派生类对象。通常,C++要求引用和指针类型与赋给的类型匹配,但这一规则对继承来说时例外。这种例外只是单向的,不可以将基类对象和地址赋给派生类引用和指针。将源代码中的函数调用解释为执行特定的函数代码块被称为函数名联编。在编译过程中原创 2022-12-16 08:00:00 · 450 阅读 · 0 评论 -
【C++】类和动态内存分配
必须定义复制构造函数的原因在于,一些类成员是使用new初始化的、指向数据的指针,而不是数据本身。警告:如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针,这被称为深度复制。c.赋值运算符 原型: 它接受并返回一个指向类对象的引用。对于由于默认赋值运算符不合适而导致的问题,解决办法时提供赋值运算符(进行深度复制)定义。其实现与复制构造函数类似,但也有一些差别。C++11提供了引入关键字,用于表示空指针。1.在使用new初始化对象的指针成员时要特别小心!检查自我原创 2022-12-13 12:40:43 · 598 阅读 · 0 评论 -
【C++】对象和类(构造函数、析构函数、作用域、运算符重载、友元、类型转换)
OOP特性:抽象、封装、数据隐藏、多态、继承和代码可重用性。C++中,用户定义类型指的是实现抽象接口的类设计。1. 指定基本类型完成的工作:决定数据对象需要的内存数量、决定如何解释内存中的位、决定可使用数据对象执行的操作或方法。类声明:以数据成员的方式描述数据部分,以成员函数(被称为方法)的方式描述公有接口。类方法定义:描述如何实现类成员函数类规范:通常,C++程序员将接口(类定义)放在头文件中,并将实现(类方法的代码)放在源代码文件中。使用类对象的程序都可以直接访问公有部分,但只能通过公有成员函数(或原创 2022-12-14 09:00:00 · 414 阅读 · 0 评论 -
【C++】内存空间模型与名称空间(存储持续性、作用域、链接性、变量存储方式)
头文件常包含的内容:函数原型、使用或定义的符号常量、结构声明、类声明、模板声明、内联声明。若头文件中文件名包含在尖括号中,则C++编译器将在存储标准头文件的主机系统的文件系统中查找;若文件包含在双引号中,则编译器将首先查找当前的工作目录或源代码目录。在同一个文件中只能将同一个头文件包含一次。避免方法:基于预处理器编译指令与(编译器将查看这之间的内容,让它忽略除第一次包含之外的所有内容)作用域和链接作用域描述了名称在文件(翻译单元)的多大范围可见。作用域为全局(文件作用域)的变量在定义位置到文件结尾之间都可原创 2022-12-15 09:00:00 · 230 阅读 · 0 评论 -
【C++】函数--C++的编程模块
C++禁止将const的地址赋给非const指针,当且仅当只有一层间接关系(如指针指向基本数据类型)时,才可将非const地址或指针赋给const指针。牢记,数组名被视为地址,即相应的形参是一个指针。原型中函数参数不能是数组。函数和结构与数组不同,结构将其数据组合成单个实体或数据对象(被视为一个整数)。使用结构编程时,最直接的方式是像处理基本类型那样来处理结构,将结构作为参数传递,并在需要时将结构用作返回值使用。另外,更多人选择传递结构的地址,然后使用指针来访问结构的内容。当cin被用于测试表达式原创 2022-12-09 09:00:00 · 375 阅读 · 0 评论 -
【C++】函数(引用变量、函数重载、函数模板、重载解析)、decltype、auto
编译器将使用相应的函数代码替换函数调用。内联函数的运行速度比常规函数稍快,但需要占用更多内存。方法:在函数声明(定义)前加上关键字通常省略原型,将整个定义(即函数头和所有函数代码)放在本应提供原型的地方。必须在声明引用时将其初始化引用更接近const指针:引用常被用作函数参数,使得函数中的变量名成为调用函数中的变量的别名,即按引用传递,它允许被调函数能够访问调用函数中的变量。只能通过原型或函数定义才能知道其是否是按引用传递的。若引用参数是const,则编译器将在以下情况生成临时变量:实参类型正确,但不是原创 2022-12-10 09:00:00 · 360 阅读 · 0 评论 -
【C++】分支语句与逻辑运算符
if测试条件将被强制转换为bool值:0被转换为false,非零转换为trueC++是自由格式语言,只要使用大括号将语句括起,对大括号的位置无限制。2. 结构小技巧:可将更直观的表达式反转为,以此来捕获将相等运算符误写为赋值运算符的错误。编写让编译器能够发现错误的代码,比找出导致更难理解的错误的原因要容易的多。eg: 赋值: 错误:正确:通用格式integar-expression必须是一个结果为整数值的表达式;每个标签都必须是整数常量表达式。当switch语句将int值和枚举量标签进行比较原创 2022-12-08 09:00:00 · 472 阅读 · 0 评论 -
【C++】循环(for/while/do-while)和关系表达式
循环步骤:设置初始值→执行测试(两个值比较),看循环是否应当继续进行→执行循环操作→更新用于测试的值。格式:C++常用方式:在for和括号之间加一个空格,而省略函数名与括号间的空格。使用来测试C-风格字符串是否相等(按排列顺序),该函数接受两个字符串地址作为参数(指针、字符串常量、字符数组名)循环只有测试条件和循环体for循环中只有两个分号是必须的,若省略了测试表达式,将认为条件为true;在for循环中可使用初始化语句声明一个局部变量,但在while循环中不能;循环体中包括语句时情况会不同。指定原创 2022-12-07 09:00:00 · 308 阅读 · 0 评论 -
【C++】复合类型(数组、字符串、结构体、共用体、枚举、指针)
下标:months[0]是数组months的第一个元素;表示计算整个数组中的字节数只有在定义数组时才能使用初始化;可通过下标分别给元素赋值。若只对数组一部分初始化,则编译器把其它元素设置为0。若初始化数组时[ ]内为0,则自动计算元素个数。可省略等号;可不在{ }内包含任何东西,即所有元素设置为0;列表初始化禁止缩窄转换。标准头文件cstring中库函数strlen()返回存储在数组中字符串的长度,只计算可见字符,不计算空字符;而sizeof指出整个数组长度。istream中的类(cin)提供了一些面向行的原创 2022-12-06 09:00:00 · 331 阅读 · 0 评论 -
【C++】数据类型|数据类型转换|数据表达处理
计算圆括号内数据类型或变量所占用内存大小(Byte)。对类型名(如int)使用sizeof运算符时,应将名称放在括号中,但对变量名(如n_short)使用该运算符时,括号是可选的。字符|含义-|-|-\t|水平制表符,跳到下一个tab位(空格个数=|n-8|%8, n为\t前字符占位)\r|输出回到本行行首,并覆盖之前的输出。“hello world!\rxxx” 结果为 ”xxxlo world!”\n|换行符\v|垂直制表符\f|换页一对单引号括起来的一个字符,如用一对双引号括起来的字符串,原创 2022-12-05 07:00:00 · 285 阅读 · 0 评论 -
C++函数模板特化,类模板特化
C++中模板分为函数模板和类模板所谓特化,就是将泛型的东西搞得具体化一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰(例如const或者摇身一变成为了指针之类的东东,甚至是经过别的模板类包装之后的模板类型)或完全被指定了下来。针对特化的对象不同,分为两类:函数模板的特化和类模板的特化1. 函数模板的特化当函数模板需要对某些类型进行特化处理,称为函数模板的特化。2. 类模板的特化当类模板内需要对某些类型进行特别处理时,使用类模板的特化。3.原创 2022-07-09 16:02:38 · 3019 阅读 · 3 评论 -
左值引用、右值引用和参数传递
导读:除指针类型外,C++还定义了引用类型。C++11的主要变化之一是新的引用类型的创建,叫右值引用(rvalue reference)。对以下代码:根据这些声明,arr、str、arr[x]、&x、y、z、ptr、(*ptr)[x]都是左值,x是一个不可修改的左值。一般来说,程序中的变量名就是一个左值;其中2、“foo”、x+y、str.substr(0,1)都是右值,因为它们都是字面值。C++语言的语法允许函数调用或运算(操作)符重载在返回值类型中指定为左值。左值引用的声明是通过在某个类型后放置一个符原创 2022-06-16 08:00:00 · 1013 阅读 · 0 评论