c++17/20/23
文章平均质量分 79
c++20高级编程学习笔记
Stack Overflow?Tan90
Linux系统开发者,计科专业,曾任职于某道Linux系统开发高级讲师、某上市公司系统开发
展开
-
c++中使用互斥量
当 std::lock 成功的获取一个互斥量上的锁,并且当其尝试从另一个互斥量上再获取锁时,就会有异常抛出,第一个锁也会随着异常的产生而自动释放,所以 std::lock 要么将两个锁都锁住,要不一个都不锁。不过,事情没那么简单,比如,当有多个互斥量保护同一个类的独立实例时,一个操作对同一个类的两个不同实例进行数据的交换操作,为了保证数据交换操作的正确性,就要避免数据被并发修改,并确保每个实例上的互斥量都能锁住自己要保护的区域。的好处在于,可以将所有 std::lock 替换掉,从而减少潜在错误的发生。原创 2023-12-18 14:21:51 · 871 阅读 · 0 评论 -
c++转移线程所有权
假设要写一个在后台启动线程的函数, 并想通过新线程返回的所有权去调用这个函数, 而不是等待线程结束再去调用;或者创建一个线程, 并在函数中转移所有权, 都必须要等待线程结束。c++标准库中含有不少资源占有类型,如std::ifstream、std::unique_ptr类、std::thread等都是可以移动但是不可复制的。因此对于一个具体的执行线程,其归属权可以在几个std::thread实例间转移。thread支持移动操作的意义是,函数可以便捷的向外部转移线程的归属权。原创 2023-12-14 15:55:48 · 395 阅读 · 0 评论 -
c++向线程函数传递参数及编译错误排查
虽然上述代码可以正常编译运行,但是还有需要我们关注的,func函数第二个参数是一个string类型,但是,字符串是以const char* 的方式传递的,进入新线程的上下文环境后,才转换成string的。原因是,thread的构造函数并不知情func函数的参数,所以是直接复制我们提供的参数s,然而线程库内部代码会把参数的副本当成。类别(只能移动,不可复制),并以右值的形式传递。这样就会有歧义,第17行,编译器会认为这是一个声明。为了避免这样不必要的麻烦,我们采用同一初始化方式。编译的时候会发现报错了,原创 2023-12-14 12:11:11 · 501 阅读 · 0 评论 -
c++中explicit关键字用法
(1) 指定构造函数或转换函数 (C++11 起)或推导指引 (C++17 起)为显式,即它不能用于隐式转换和复制初始化。(2) explicit 说明符可以与常量表达式一同使用。当且仅当该常量表达式求值为 true 时函数为显式。explicit 说明符只可出现于在类定义之内的构造函数或转换函数 (C++11 起)的。可以看到,调用show函数的时候,自动将参数整型1转换成了A类型。当表达式中为ture表示禁止使用隐式转换,false表示允许使用。c++20中还可以使用表达式来控制是否使用隐式转换。原创 2023-11-28 15:57:01 · 434 阅读 · 0 评论 -
C++多线程编程(包含c++20内容)
本文详细介绍c++多线程编程内容(涵盖c++20),内容很全,很详细,全文17000余字。你确定不看看嘛?原创 2023-07-28 13:10:44 · 957 阅读 · 0 评论 -
Linux系统ubuntu22.04安装最新版的gcc13.1.0编译器,支持c++20、23
Linux系统ubuntu22.04安装最新版的gcc13.1.0编译器,支持c++20、23,本文全程上机实操,包含解决若干个问题,如下载包失败,执行代码/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.31' not found等原创 2023-07-14 18:52:19 · 13404 阅读 · 30 评论 -
变长参数列表
c/c++中提供了语法和一些实现宏,用于编写具有可变数量的函数。这些函数通常看起来像printf()。尽管并非经常需要,但偶尔需要这个特性。例如,假设想编写一个快速调试的函数,如果设置了调试标记,这个函数向stderr输出字符串,但如果没有设置调试标记,就什么都不做。与printf()一样,这个函数应该能接收任意数目和任意类型的参数并输出字符串。首先,注意debugOut()函数的原型包含一个具有类型和名称的参数str,之后是省略号(…),这代表任意数目和类型的参数。如果要访问这些参数,必须使用。原创 2023-06-11 18:07:19 · 94 阅读 · 0 评论 -
c++20模块导入module
本文主要讲述c++20新增模块内容的详细使用方式。包括编译注意事项、建议点赞收藏原创 2023-06-11 14:22:47 · 1109 阅读 · 0 评论 -
c++类型转换
本文涵盖所有c++类型转换函数包含c++20最新的内容原创 2023-06-08 22:06:21 · 391 阅读 · 0 评论 -
optional
它还消除了将函数编写为返回代表成功或失败的布尔值的需求,同时将函数的实际结果存储在作为输出参数传递给函数的实参中。保留特定类型的值,或者不包含任何值。c++17引入,如果编译报错,需要加上。如果函数可能返回也可能不返回某些内容,则通常也将。用作函数的返回类型。如果想要允许值是可以选择的,则可以将。是无效的,但是,可以将指针保存在。同时不能将引用保存在。是一个类模板,因此必须在。中指定所需要的类型。注意:如果对于一个空的。原创 2023-06-08 16:47:47 · 47 阅读 · 0 评论 -
c++运算符重载
c++运算符重载讲解,非常的详细、非常的nice,建议收藏原创 2023-05-27 22:41:21 · 654 阅读 · 0 评论 -
c++数值转换
本文涵盖c++字符串到数值之间的转换函数,从高级数值转换到低级数值转换应有尽有。有你所有想了解的。注意本文内含有c++23的内容。原创 2023-05-25 19:52:45 · 851 阅读 · 0 评论 -
C++不同的数据成员类型
本文内容涵盖c++不同的数据成员,包含静态数据成员、const static数据成员、引用数据成员,内容非常详细,建议点赞收藏原创 2023-05-21 13:14:49 · 607 阅读 · 0 评论 -
c++中的方法
本文涉及到c++方法中的static方法、const方法、方法重载、内联方法、默认参数的知识点。非常的全面,非常的残暴,建议点赞收藏。原创 2023-05-21 09:13:49 · 575 阅读 · 0 评论 -
c++对象中动态内存分配
本文涉及到c++对象的内存分配,及处理对象的赋值与复制,包含移动语义,全文7600余字,非常详尽,建议仔细阅读,点赞收藏方便再次学习!原创 2023-05-18 22:14:53 · 733 阅读 · 0 评论 -
c++的构造函数种类大全
从语法上讲,构造函数是与类同名的函数。功能是用于初始化数据成员。构造函数没有返回类型,参数可以有,也可以没有,没有参数的构造函数称为,也称为无参构造函数。有些情况下,必须提供默认的构造函数,否则就会编译报错。原创 2023-04-06 00:01:36 · 1576 阅读 · 0 评论 -
字符串格式化c++20 std::format()
第一个参数是待格式化的字符串,后续参数是用于填充待格式化字符串中占位符的值。到目前为止,使用format()时的占位符一般都是一对花括号:{}。在这些花括号内可以是格式为[index] [:specifier]的字符串。可以省略所有占位符中的index,也可以为所有占位符指定从零开始的索引,以指明应用于此占位符的第二个和后续参数。如果省略index,则format()的第二个和后续的参数传递的值,将按给定的顺序用于所有的占位符。specifier是一种格式说明符,用于更改值在输出中格式化的方式。原创 2023-03-26 22:05:03 · 3664 阅读 · 0 评论 -
string类和string_view类
std::string是一个类,实际上是basic_string模板类的一个实例,这个类支持中提供的许多功能,还能自动管理内存分配。string类在std名称空间的头文件中定义。尽管string是一个类,但是可以当做一个内置类型来使用,把string想象为简单的类型更容易发挥string的作用,通过运算符重载的神奇作用。c++的string使用起来比C字符串更加容易。比如,给string重载+运算符,以表示“字符串串联;重载+=,表示追加一个字符串。原创 2023-03-22 20:56:23 · 1005 阅读 · 0 评论 -
字符串字面量
在上面代码中“hello"是一个字符串常量,因为这个字符串以值的方式给出,而不是一个变量。它存储在内存中的只读部分。通过这种方式,编译器可重用相同字符串字面量的引用。从而优化内存的使用。即使一个程序中使用几百次”hello“字符串字面量,编译器也旨在内存中创建一个hello实例,这种技术叫做字面量池。字符串字面量可以赋值给变量,但是因为字符串字面量位于内存的只读部分,且使用了字面量池,所以这样做会产生风险。原创 2023-03-19 20:13:56 · 312 阅读 · 0 评论