C++基础知识
文章平均质量分 76
坎坎坷坷.
编程改变世界
展开
-
C++基础:折叠表达式(C++17)
C++17 引入了一种新的语法特性,叫做折叠表达式,它允许编译器在模板参数包展开时进行元编程操作。折叠表达式的引入极大地简化了元编程代码,使其变得更为直观和简介。原创 2024-09-07 15:04:17 · 507 阅读 · 0 评论 -
C/C++基础:宏
(a > b)?return 0;(a > b)?return 0;(a > b)?(a > b)?a : b }?(a > b)?a : b }但是如果这个宏的替换列表很长呢?// 这是正确的实现// 这是正确的实现 # define max(a , b) {原创 2024-07-25 00:19:11 · 838 阅读 · 0 评论 -
C++基础 auto 和 decltype的区别
这意味着你不需要显式写出变量的类型,编译器会根据你赋予的初始值来确定类型。这对于复杂类型、模板编程或是避免重复冗长的类型名称尤其有用,可以提高代码的可读性和编写效率。所以,decltype(x) 是变量名的规则,而 decltype((x)) 是表达式的规则,井水不犯河水,参数如果是变量名,就返回其声明的类型;除此之外,decltype还可以将表达式用()包裹,此时decltype的推导就不单单是表达式所属实体的类型,而是会继续通过表达式来推断出值类别来判断引用属性,原创 2024-06-04 20:43:56 · 327 阅读 · 0 评论 -
std::shared_ptr使用new和make_shared两种方法构造关于访问权限的区别
C++11给开发者提供了十分好用的智能指针 std::shared_ptr ,合理的使用智能指针可以一定程度的避免内存泄漏问题。int一般来说,这两个构造方法并无太大的区别,但我们更建议使用 make_shared 来创建智能指针,其在一些情况下效率更优。但今天开发时,遇到了无法使用 make_shared 而 new 操作正常的情况,本博客即记录该现象。原创 2024-03-10 13:57:23 · 641 阅读 · 1 评论 -
C++基础:异步操作(std::async, std::future, std::packaged_task, std::promise)
std::packaged_task是一个将任务和future绑定在一起的模板,是一种对任务的封装,可以通过方法std::get_future来获得绑定的函数的返回值类型的future。C++11之后提供了实用的thread库,但 thread 在 join 的时候并不能获取到任务结束的返回值,对于刚刚介绍的异步操作async,其返回值为一个std::future对象,而不是一个确定的值,当你需要使用这个值的时候,可以调用future的get方法,get会一直阻塞,直到future就绪,然后返回该值。原创 2024-03-01 13:43:51 · 380 阅读 · 0 评论 -
C++基础:右值引用,移动语义和完美转发
顾名思义,右值引用就是对右值引用的类型,通过右值引用,右值的生命周期会获得延长,只要右值引用的变量还活着,该右值临时量就会一直活下去。其最终会输出5,换言之,左值引用也是引用,如果打印i,ref1,ref2的地址,会发现三者地址也是一样的,对ref2的修改也会改变i本身的值。forward 完美转发实现了参数在传递过程中保持其值属性的功能,即若是左值,则传递之后仍然是左值,若是右值,则传递之后仍然是右值。在C++11以后,C++所有的值都必属于左值,将亡值,纯右值三者之一,其中,将亡值和纯右值都属于右值。原创 2024-02-25 19:23:31 · 389 阅读 · 1 评论 -
C++基础:智能指针
在创建智能指针时,可以给对象指定一个删除器,当智能指针的引用计数为零时,会自动调用该删除器来释放对象的内存,比如我们用std::shared_ptr来管理动态数组,std::shared_ptr的默认删除器不支持删除数组对象,我们就可以指定删除器。std::shared_ptr使用引用计数来保证浅拷贝的内存释放问题,每一个shared_ptr的拷贝都会指向同一块内存,只有当最后一个shared_ptr拷贝析构的时候,才会将其指向的内存释放。相对于原始指针来说,智能指针不需要手动释放内存,其内存会自动释放。原创 2024-02-24 11:10:09 · 964 阅读 · 0 评论 -
C++面向对象基础:设计模式(下)
代码解释:上述代码中,如果我们希望创建ExportXm, ExportJson或者ExportTxt类的对象并使用其Export方法,我们可以创建一个其对应的工厂类实例并用于初始化总工厂ExportData对象,然后就可以通过ExportData实例来使用你需要的类的方法。抽象工厂是工厂方法模式的一种变种,为了缩减工厂实现子类的数量,不必给每一个产品分配一个工厂类,可以将产品进行分组,每组中的不同产品由同一个工厂类的不同方法来创建。为每一个子类建立一个对应的工厂子类,这些工厂子类实现同一个抽象工厂接口。原创 2024-02-21 21:32:35 · 788 阅读 · 0 评论 -
C++面向对象基础:设计模式(中)-- 单例模式详解
当持有锁的线程执行到new操作时,若其仅仅执行到1->2但还并未调用构造函数,此时会出现这样的情况:_instance指针已经拿到了new的返回值,此时已经不是nullptr,但因为还没有调用构造函数此时的_instance还没有实际的数据,而处于其他地方的线程可能会在这个时候直接将_instance返回并使用,这会导致严重的线程安全问题,这绝不是我们希望发生的。这个设计模式的定义实在是简单明了,也是最常用的设计模式,用该设计模式可以定义一个类仅会有一个实例对象,并且可以全局访问。注意这里实现的几个细节。原创 2024-02-19 12:23:40 · 871 阅读 · 1 评论 -
C++面向对象基础:设计模式(上)
通过该设计模式,只要DataCenter类的CalcTemperature方法发生改变,我们都可以调用Nodify方法使得所有订阅了该类的终端发生变化,是否订阅也取决于客户,DataCenter不关心是否有类订阅了自身。如以上代码,使用模版方法模式,我们可以在保证Show方法总体结构不变的情况下,通过子类重写父类的protected方法,来改变Show的部分执行过程。设计模式可以认为是解决问题的固定套路,是满足设计原则的情况下,慢慢迭代出来的套路,学习设计模式,可以让我们深入理解面向对象的思想。原创 2024-02-15 15:29:16 · 1034 阅读 · 2 评论 -
C++基础-va_list的使用
va_list定义于头文件中,是用于处理C语言风格变参函数而使用的一种对象类型,va_list类型的变量是指向参数的指针,通过指针运算来调整访问的对象,其主要使用如下几种宏来进行操作.原创 2024-01-17 23:12:53 · 716 阅读 · 0 评论 -
C++基础--const限定符
值得注意的是,用const来修饰指针本身,和指向常量的指针是有着巨大区别的,指针被const修饰之后并不意味着该指针失去了修改其对象的值的能力(由所指对象的类型决定),而是指针本身的指向无法修改。注意,在默认的情况下,const对象被设定在仅在本文件内有效,const修饰的全局变量在其他的文件中也是不可见的,当在多个文件中使用同名的const变量时,其实是在不同的文件中定义了独立的变量。与其他用const修饰的成分一样,指向常量的指针无法修改其指向对象的值,同时,只有通过指向常量的指针,才能够来存储常量。原创 2023-07-18 19:04:44 · 77 阅读 · 2 评论