首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【笔记】《C++Primer》—— 第19章:特殊工具与技术

这一章介绍了平时可能不太会用到的C++特性,内容比较杂。其中有类似枚举,联合,局部类这样之前就用过的特性,也有类成员指针,局部类这样新了解的特性。...枚举类型很常见了,国内的C++或者C教材一般在比较前面就会讲到这个东西,这本书将其安排到了后面。...,自然也就不能有虚函数,但是其他的包括构造和析构函数都可以有 union只允许一个成员有值的特性让其存储空间仅仅是可以容纳其最大成员的大小 union常常用来表示一组互斥值,我们可以用花括号内的一个值来初始化一个...bitCount就是其包含的二进制位数 连续定义的位域会被编译器压缩在一个整数的相邻位中,但是如何压缩是机器相关的 位域通常是使用位运算符来操作的 程序中可能有一些变量并不由程序自身控制,例如与时钟相关的变量...链接指示的函数可能不支持一些特性,例如C函数无法重载和传递对象 我们也可以对一个有C++定义的函数标记链接指示,这样会使得这个函数可以被目标语言调用

85340
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C语言】枚举类型(enum)

    枚举的含义 在开始正式学习枚举类型之前,我们得先了解一下何为“枚举”? 所谓枚举顾名思义就是一一列举。把所有可能的值都一一列举出来。...说得抽象一点的话,就是在一个有限的集合中,将这个集合里面的值都一一列举出来,而这个集合就属于枚举类型。 2....枚举类型的声明 在讲完枚举的含义之后,我们就来认识一下,在C语言中是如何声明一个枚举类型的。...enum Color { RED=2, GREEN=4, BLUE=8 }; 可能有的读者对上面的一句话:枚举常量默认是从0开始的,依次递增1,这句话可能有点疑惑。...那我们是否可以拿整数给枚举变量赋值呢?在C语言中时允许的,但在C++中时不行的,C++对于类型的检查是比较严格的。

    36610

    Rust 生态观察 | 9 月热点思考

    例如,一个函数可能会消耗一个线性类型的值并产生一个新的线性类型的值,这可以用来表示某种副作用。...在 Rust 中,每个值都有一个称为其“所有者”的变量。一次只能有一个所有者,这确保了在任何给定时刻,只有一个变量可以对值进行修改。当所有者超出作用域时,值将被丢弃。...活跃借贷: 当我们在代码中创建一个引用(例如&x),我们实际上是在创建一个借贷(Loan)。这个借贷在某些代码段中是活跃的,这意味着我们不能修改被借用的值。...数据存储在一个紧凑的、连续的内存区域中,而标记则存储在另一个区域中。 如何工作: 对于每个枚举值,其实际数据存储在一个紧凑的数组或向量中,而标记则存储在另一个数组中。...那么回到枚举中,采用 SOA 转换的思想,将枚举判别式和变体值分别存储在两个独立的分配中。为了真正消除值中的碎片化,我们可以为每个变体创建一个Vec。

    61030

    c++11新特性,所有知识点都在这了!

    返回值优化:当函数需要返回一个对象实例时候,就会创建一个临时对象并通过复制构造函数将目标对象复制到临时对象,这里有复制构造函数和析构函数会被多余的调用到,有代价,而通过返回值优化,C++标准允许省略调用这些复制构造函数...,可以看: C++线程池的实现之格式修订版 C++定时器的实现之格式修订版 智能指针 很多人谈到c++,说它特别难,可能有一部分就是因为c++的内存管理吧,不像java那样有虚拟机动态的管理内存,在程序运行过程中可能就会出现内存泄漏...delete c++中,如果开发人员没有定义特殊成员函数,那么编译器在需要特殊成员函数时候会隐式自动生成一个默认的特殊成员函数,例如拷贝构造函数或者拷贝赋值操作符,如下代码: struct A {...constexpr和const的区别: 两者都代表可读,const只表示read only的语义,只保证了运行时不可以被修改,但它修饰的仍然有可能是个动态变量,而constexpr修饰的才是真正的常量,...thread周期,每一个线程都拥有并只拥有一个该变量的独立实例,一般用于需要保证线程安全的函数中。

    20.8K24

    用 C++构建自己的 GPT 文档工具

    枚举完所有批注后,我们的工具就会提取它们以及与之相关的文本段,并将它们存储在 sqlite3 数据库中。在此基础上,它将围绕如何改进或修复文本的特定部分来为 ChatGPT 准备有针对性的问题。...例如,高温值可用于生成与 prompt 更不同的文本,而低温值可用于生成与 prompt 更相似的文本。在目标为生成与给定输入相似但具有一定程度的变化或“创造性”文本的情况下,这可能很有用。...重点关注应用程序区别于竞争对手的最突出功能,并使其对用户友好。” 补充说明: 在本节中,你将有机会提供补充上下文或指定所需的输出格式。...当没有指定任何内容时,换行符就是默认值,这意味着模型在输出第一个换行符后就停止生成更多的输出。...枚举批注 接下来,我们可以枚举文档中的所有批注,并打印每个批注的“已处理”(“Resolved”)状态。 在开始之前,我们不仅要枚举批注,还要枚举与之相关的文本。原因在于批注的最初目的。

    43720

    【笔记】《深入理解C++11》(下)

    C++11的时候: 函数体只能有单一的return语句(或者额外的不影响数据的编译期语句) 函数必须返回值, 因为一定要从常量表达式中获得常量 函数使用前(编译期)一定要有定义 返回语句中不能有非常量的函数或数据...为了保证线程中的程序运行既能发挥优化的高效率又能拥有正确的顺序, C++11对底层硬件抽象出了一系列枚举值, 这些枚举值称为C++的内存模型 C++11中, 原子类型变量本身已经满足多线程的同步特性,...在内存模型之前, 我们无法控制原子操作前后的代码执行的顺序, 因此有可能代码中本来写了y在x前进行修改, 但是实际运行的时候y在x之后才发生修改....如果此时有线程B在修改x的同时读取了y, 那么就会得到不合理的y值(原本期待y在修改x的时候已经改变) 对此C++的内存模型提供了六种枚举值, 核心就是让对性能有极限要求的程序员可以按照自己的想法控制原子操作前后其它有关内存读写的代码...(因为只有有关内存读写的代码可能引起同步问题)应该以怎样的顺序运行, 这些枚举值作为目标原子操作函数(如store(), load())的第二个参数被传入, 通常表现为在原子操作函数周边设置的"内存栅栏

    1.1K31

    C++打怪 之 编程风格指南 V1.0

    序 C++用法很多,包容性也比较强。一个C++的工程可能包含了各种各样没见过的用法。...使函数尽量简短, 以便于他人阅读和修改代码. 在处理代码时, 你可能会发现复杂的长函数....定义 在 C 语言中, 如果函数需要修改变量的值, 参数必须为指针, 如 int foo(int *pval). 在 C++ 中, 函数还可以声明为引用参数: int foo(int &val)....在已有的代码中有大量的函数声明, 你不可能把它们都用新的语法重写一遍. 因此实际的做法只能是使用旧的语法或者新旧混用. 在这种情况下, 只使用一种版本是相对来说更规整的形式....4 格式 每个人都可能有自己的代码风格和格式, 但如果一个项目中的所有人都遵循同一风格的话, 这个项目就能更顺利地进行.

    1.3K50

    自定义类型:联合体和枚举类型(联合体与结构体的区别)

    联合体的大小是其最大的成员的大小。在任何时候,联合体只保存其最大的成员的值。 访问方式: 结构体(struct):可以同时访问其所有的成员。...联合体(union):通常用于节省内存,在多个不同类型的数据中只使用其中的一个。例如,一个程序可能需要处理来自不同数据源的数据,这些数据可能有不同的类型和大小,但在任何时候只处理其中的一种。...{}中的内容是枚举类型的可能取值,也叫 枚举常量 。​ 这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。...枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用 三、枚举的使用 enum Color//颜色 { RED=1, GREEN=2, BLUE=4 }; enum Color...在C语言中是可以的,但是在C++是不行的,C++的类型检查比较严格。 今天就先到这了!!!

    14210

    Java单例模式的不同写法(懒汉式、饿汉式、双检锁、静态内部类、枚举)

    它其实是一个用来创建线程安全的单例的老方法,当单例实例第一次被创建时它试图用单个锁进行性能优化, 但是由于太过于复杂在JDK1.4中它是失败的,我个人也不喜欢它。...C/C++代码被编译成汇编语言–>和硬件电路交互, 现实中,为了获取更好的性能JVM可能会对指令进行重排序,多线程下可能会出现一些意想不到的问题。...简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值。...下面我们来看看单例是如何被保证的: 首先,在枚举中我们明确了构造方法限制为私有,在我们访问枚举实例时会执行构造方法。...单例模式有很多种的写法,我总结一下: (1)饿汉式:线程安全 (2)懒汉式:非线程安全 (3)双检锁:线程安全 (4)静态内部类:线程安全 (5)枚举:线程安全 如何选择 如果我们在程序启动后

    2.4K40

    四、从C语言到C++(四)

    在C中,我们使用*符号来声明指针,并在函数调用中传递变量的地址(使用&操作符获取)。 在C++中,引用在声明时必须被初始化,并且之后不能被重新绑定到另一个对象。...在C++中,如果每个参数在函数里面,不需要修改,那么就加上 const,如果需要传递右值,那么必须使用 const 才能接收 类型 左值引用(Lvalue Reference): 左值引用是最常见的引用类型...常引用在函数参数中特别有用,因为你可以传递一个对象的引用给函数,同时确保函数不会修改这个对象。...函数 return 0; } 在这个例子中,printValue函数接受一个const int&类型的参数,这意味着它不能通过value参数来修改传入的x的值。...: 在 C++ 中,无论是传统的枚举还是强类型枚举,枚举值都在枚举类型的作用域内。

    7810

    3小时Java入门

    ,程序结构 一个.java程序文件中必须有且只有一个public类,该类必须有一个声明为main函数作为程序入口。...并且这个main函数需要声明为 public static void 类型,即静态的,公开的,返回值为空的函数类型。 并且这个java程序的文件名必须和这个public类名保持一致。 ?...没有在构造方法中初始化属性时,引用类型的字段默认是null,int类型默认值是0,布尔类型默认值是false。 我们可以为一个类定义多个构造方法,使用时可以根据参数类型和数量自动进行匹配。...Scala在Java基础上做了重大的改进,使其兼备静态语言和脚本语言的特色。 下面列举一些比较显著的差异。...5,C++ 中可以在类的外部可以定义函数,而Java不允许在类和接口外面直接定义方法。

    2.7K30

    Effective Modern C++翻译(1):序言

    +14,如果我只是简单的提到C++,那么它是属于所有语言版本的,因此,我可能会说C++是十分重视效率的(这里指的是所有的C++版本),C++98缺少对并发性的支持(指的仅仅是C++98),C++11支持了...在概念上(尽管并不总是在实践中)右值相对应于从函数返回的匿名的临时变量,而左值相对应于你可以引用的对象,既可以通过指针,也可以通过引用。...class Widget { public: Widget(Widget&& 这里,在widgt的移动构造函数中取得rhs参数的地址是完全合法的,所以rhs是一个左值,尽管它的类型是一个右值的引用...在一个函数调用中,调用端的表达式是这个函数的实参(argument),这些参数被用来实例化函数的形参(parameters),在第一个例子中,实参是wid,在第二个例子中,实参是std::move(wid...),在这两个例子中, 形参都是w,形参和实参的区别是很重要的,因为形参是左值,但是实参和实例化这些实参的却可能是左值或是右值,这个和完美转发(perfect forwarding)的过程相关,完美转发是指将参数传递给函数中调用的第二个函数

    1.2K90

    初始C语言——梦启程的地方

    的大小是1个字节,这是很精准的(相较于上面的数据类型),在后面进行指针操作时,char*能做到只移动一个字节,手术刀般访问内存。  ...#define定义的标识符常量,这个是一个宏定义,作用于整个工程,还可以解决C4996问题 4.枚举常量,这个常量前期比较少见,关键字是enum,但他本质上是常量,枚举的意思就是一个一个数出来,...注释 注释的存在就是屏蔽代码或解释代码,当我们需要在同一个文件中写入第二个主函数时就可以把前面的注释掉,或者把其他无用的代码注释掉;当我们在写一些比较难理解的代码时也可以加上注释,通过文字提示帮助我们理解代码...while 循环  函数 C语言中函数在维基百科中的定义是子程序,具有相对独立性。...函数是我们用来实现功能的工具,具体使用函数步骤可以分为:设计函数、编写函数、封装函数、使用函数、实现需求 下面我将展示一个简单的add函数,实现两数相加的功能 函数的特点是简化代码,代码复用

    12910

    【笔记】《C++Primer》—— 第四部分:高级主题(完)

    和getline最大的区别是get会将分隔符保留为流的下一个字符,getline则读取并抛弃分隔符 18 用于大型程序的工具 异常处理的流程是:在C++中我们throw了一个表达式后会rised...catch的模块内,这个catch可能在同个函数中也可能是在外层调用链的嵌套中 因此要注意出现异常的时候函数可能会提早退出,而且一旦开始异常处理,这段调用链中创建的局部对象会被销毁,因此throw有点类似于...using声明的是一个名称,是不能有参数的,所以using会给函数重载带来很多麻烦 多重继承通常概念上就是某个类有多个平级或者难以定级的属性,多重继承也只能继承已经定义过的类,不能是final的,而且一个基类在列表中只能出现一次...局部类是定义在函数内部的类,局部类的定义只在定义它的作用域中可见 局部类的特点是其所有成员都必须在类内完成定义 同样局部类和函数之间没有权限特权 局部类内的嵌套类本质也属于一个局部类,所以嵌套类自身的成员必须定义在嵌套类内部...const很相似,只起到修饰作用,与const并不冲突 C++使用链接指示来指出那些非C++的函数 链接指示也就是在函数的声明前写 extern "Lang",其中Lang是目标语言的代号,例如C语言是

    91310

    抽丝剥茧C语言(初阶 上)

    我们来分析这个程序 所有C语言程序都是从 main 这个函数进入,然后从上往下依次执行,一个工程只能有一个 main 函数。...这里显示 main 函数已经有主体,说明我上面的表达不是忽悠家人们! 那么一个工程是什么呢?...在 Visual C++ 6.0下,这叫做一个“工程”,而在 Visual Studio(就是我们的VS编译器)下,这又叫做一个“项目”,它们只是单词“Project”的不同翻译而已,实际上是一个概念。...结果如下 这里可以得出一个结论, a 这个变量的生命周期只在 main 函数内有效,main 函数内也被称为作用域。 而全局变量生命周期是整个程序,这里就不演示了。...无法被改变的值。 比如,一只猫不可能变成一只狗对吧?10这个数字能变成11吗?

    30000

    【C++】深入理解类与对象:面向对象编程的核心

    2.类的引入 C语言结构体中只能定义变量,在C++中,结构体不加可以定义变量,也可以定义函数。...同时我们也发现,我们再也不用像C语言那样在传个结构体类型到函数中了,直接就可以使用结构体中的变量。 不过在C++中,我们更倾向于用class来定义类。...为此我们可以只存储成员变量,在把成员函数放在公共的代码区。...在我的这篇文章有关于内存对齐的较详细的讲解:深度刨析自定义类型(结构体、枚举、联合) 8. this指针 在 C++ 中,this 指针是一个隐含的指针,它指向当前对象的地址。...通过实例化,读者应了解到类如何描述对象,以及类的空间大小和内存对齐规则。最后我们深入探讨了this指针的特性及其在成员函数中的应用,结合练习题帮助读者巩固理解。后续我会补上类和对象的其他特点。

    13610

    《Effective Modren C++》 进阶学习(上)

    而在实际编码中,如何将个人的标准愈发完善,愈发得到同事的认可,一定需要不断积累。如何积累,一定是从细微处着手,观摩优秀的代码,学习现有的框架,汲取前人留下的智慧。  ...6. auto推导若非己愿,使用显式类型初始化惯用法 auto在推导时,可能返回的是引用类型,可能导致引用的对象被修改。因此在使用时,需要格外注意,可以通过显式初始化来规避此类问题。...异常安全性:在C++中,异常安全性是一个重要的概念,指的是程序在遇到异常时能够正确地处理资源的释放和状态的恢复。...让const成员函数线程安全 const成员函数意味着只读,因此这种函数在使用时会被默认为线程安全。但在实际编码中,实现的const成员函数可能存在线程不安全的情况。...其内部实现尽量不要有修改共享资源的操作(即尽量不要有修改公共变量的操作,否则用锁保护),且内部尽量少的调用其他的函数,因为被调用的函数也可能存在线程不安全的风险。 17.

    20320

    C++编程基础与高级编程

    标识符[=整型常数] } 枚举变量; 当您使用多个文件且只在其中一个文件中定义变量时(定义变量的文件在程序连接时是可用的),变量声明就显得非常有用。...在原始的调用中是不会被修改,在通过引用调用中会被修改。...静态变量只初始化一次,直到程序结束。 它保留可在多个函数之间调用的值。静态变量由编译器提供的一个默认值:0。 extern变量对所有程序都可见。 如果两个或多个文件共享相同的变量或函数,则使用它。...在C++中,如果派生类定义了与其基类中定义的函数相同,则称函数重写。 C++虚函数是基类中的一个成员函数,您可以在派生类中重新定义它。 它声明使用virtual关键字。...C++抽象类是隐藏内部细节和仅显示功能的过程:抽象类和接口 在C++中将其函数中的至少一个声明为纯虚函数,使其变得抽象。通过在声明中放置“=0”来指定纯虚函数,它的实现必须由派生类提供。

    1.9K30

    Python之枚举法详解

    (i) range()参数 要想遍历一串连续的数字,可以使用 for 变量 in range(): 的方式,在range()的括号中设置遍历的起始值和结束值。...hi, python hi, C++ 字符串索引 字符串中的每一个字符都有一个索引值。...使用字符串[索引] 可以得到字符串中的字符: 使用 列表[索引] 可以得到列表中的元素。 字符串和列表的不同: 列表可以通过 列表[索引]=值的方式修改列表元素。...字符串中的字符不能被修改,使用字符串[索引]=值时程序会报错。 组合问题 要把两个列表中的元素两两进行组合,可以使用for循环嵌套。...在使用枚举之前,需要先确定好枚举的范围。 调料组合 【思考】假设烤鸡的美味程度是所有配料的克数之和,那么要做出指定美味度的烤鸡,该如何组合调料呢?

    1.9K20
    领券