- 博客(147)
- 资源 (2)
- 收藏
- 关注
原创 C++11: 声明和定义
声明与定义是 C/C++ 语言中不可分割的两个概念。声明告诉编译器某个实体的存在,而定义则提供该实体的具体实现。声明主要用于编译阶段,而定义在链接阶段起作用。作用域决定了声明的可见性,C++11 进一步引入了 using、constexpr 等新特性,增强了声明与定义的灵活性与可读性。在大型项目中,合理地分离声明与定义、避免循环依赖是高效管理代码的关键。
2024-09-18 22:07:35 845
原创 架构模式:MVC
MVC 首次将心智模型与数字模型建立联系,同时将代码逻辑进行分层,将「渲染」「控制 / 分发」与数据存储进行有机分隔。此后,在涉及界面展示的编程领域,人们大概率会想到 MVC 的分隔方式并依此实现。因此,MVC 存在各种变种和通信方式,如 Backbone JS 中 View 和 Model 之间可以相互更改;Cocoa MVC 中 View 和 Controller 之间、Controller 和 Model 之间相互更改。
2024-09-09 00:36:57 1154
原创 系统架构:分而治之
“分而治之”是一种在系统架构设计中行之有效的策略。通过将复杂系统分解为多个较小、可管理的部分,架构师和开发者能够降低系统复杂性、提高灵活性和可扩展性、增强系统的可维护性,并促进团队之间的协作。在现代软件开发中,无论是模块化设计、分层化架构,还是微服务架构,都已在实践中证明了分而治之的巨大价值。
2024-08-20 22:49:20 1016
原创 C++消息总线Mozart:timer类实现
timer是Mozart的应用接口,作用是测试相关函数的执行耗时。一般我们只需要关注timer::measure接口即可。
2023-09-05 22:21:14 333
原创 C++17:decltype类型推导
在编程过程中,有时我们需要根据表达式的类型来声明变量,尤其是在涉及模板编程,本文从泛型编程中经常会遇到2个常见问题入手,循序渐进的分析了从C++11开始引入的关键字decltype,除此之外还介绍了decltype(auto)推导过程。
2023-06-17 23:03:45 645
原创 系统架构:经典三层架构
经典三层架构是分层架构中最原始最典型的分层模式,其他分层架构都是其变种或扩展,例如阿里的四层架构模式和DDD领域驱动模型。阿里的 四层架构模型在三层基础上增加了 Manager 层,从而形成变种四层模型;DDD架构则在顶层用户界面层与业务逻辑层之间引入应用层,从而形成变种DDD领域驱动模型;掌握经典三层模式是理解其他分层模型的基础。本文从三层架构的理念,架构体系,优缺点等三个角度对经典三层架构进行了深入分析。
2023-03-16 23:04:59 12392 2
原创 C++11:右值引用与万能引用
引用由C++98标准引入,由于引用只能绑定左值;所以Morden C++(C++11及以后标准)引入右值引用解决绑定右值的问题,右值引用可以说是对传统引用的扩充。经Morden C++扩充后,传统C++的引用,在Morden C++中变成左值引用;Morden C++引入右值引用,从而引出移动语义;右值引用只能引用右值不能引用左值,左值引用只能绑定左值,const左值引用可以引用右值。万能引用时,引用折叠时只要有左值引用出现,折叠后的类型就是左值引用,否则为右值引用。
2023-03-15 07:33:53 609
原创 C语言:原型模式
原型模式的目标在于通过拷贝原型对象快速创建新的对象,原型对象的类型就是新创建对象的类型。一般应用于创建成本较高且复杂繁琐的场景。
2023-03-07 23:42:28 251 1
原创 C语言:建造者模式
构建者模式是一种常见的创建型设计模式,此模式基于分而治之的理念将产品的构建算法和产品的组件和组装分离,从而实质彼此的独立变化。所以相同的构建算法可以根据不同的部件及组装创建出不同的产品,不同的创建算法亦可以复用相同的组件及组装从而创建不同的产品。
2023-02-08 07:30:35 507
原创 系统架构:分层架构
软件在从0到1阶段,软件分层不是此阶段需要重点考虑的范畴,在从1到100..0阶段,由于软件耦合严重,软件分层将会提到日程。软件分层就是基于分而治之思想下发展而来的,将复杂系统拆分成功具有单一职责层次的方法论。本文为大家介绍了什么是分层?为何要分层?如何对软件进行分层?软件分层有什么指导原则呢?希望大家基于分层范式,可以做到修改模块内的代码,而不影响其他模块,这是软件分层给我们带来的优势。也是高内聚低耦合的特性。
2023-01-17 17:38:56 4105
原创 C++20:换了“心“的auto关键字
C++98中auto无任何实质功能,但是从C++11开始auto变成具备实质功能的关键字, 这就是所谓的auto换“心”, C++11标准委员会赋予了auto两个能力:第一,变量定义可根据初始化表达式自动类型推导;第二,声明函数返回值的占位符,允许函数后置返回类型。C++14对auto函数占位符进行了简化,允许lambda形参声明使用auto;C++17将auto引入到非类型模板的声明和结构化绑定; C++20允许函数形参声明使用auto。本博客为大家详细介绍auto的演进过程以及auto的类型推导规则。
2022-12-06 23:06:41 1685 2
原创 C++11:为何引入noexcept替代throw
做为C++11新引入的关键字,noexcept既是说明符,也是运算符。作为说明符,它的作用是指定函数是否抛出异常;作为运算符,它的作用是编译时检查,表达式不会抛出任何异常则返回 true,否则返回false。一般情况下函数不会抛出异常最好添加noexcept说明符,这样可以提升函数执行效率,而且优先使用noexcept替代throw。
2022-12-03 10:45:17 1117
原创 C++20:列表初始化,聚合初始化,强制省略拷贝优化,指定初始化......
变量的初始化是C++标准的一个重要组成部分,C++初始化按照是否存在拷贝,可将初始化划分为直接初始化和拷贝初始化;其他初始化均可以归类为此两大类。本文围绕此分类标准,分别介绍了:C++98标准的直接初始化,拷贝初始化,聚合初始化,圆括号初始化;C++11标准的列表初始化和initializer_list; C++17标准的强制省略拷贝优化,列表初始化类型推导,聚合初始化扩展(允许基类);C++20标准的聚合初始化的扩展,指定初始化器初始化。
2022-11-20 20:34:26 1166
原创 C++17:static_assert的原理
本文从static_assert和assert的定义切入,分别详细介绍static_assert引入的原因,如何使用static_assert,最后以static_assert实现作为本文的结束。希望本文的介绍可以加深你对静态断言static_assert的理解。
2022-11-15 22:08:30 6229 2
原创 C++20:constexpr、consteval和constinit
C++从C++11开始支持constexpr,直到C++20对constexpr的完整支持,constexpr标准化跨越了13年,由4个标准实现。C++20也是最接近最初语言设计模板的版本,但是constexpr的设计其实也不够严谨,所以 C++20 引入了 consteval;由于constexpr仅能实现编译时常量求值,为了解决编译时非常量求值问题,C++20又引入了constinit关键字。本文详细介绍constexpr/constinit/consteval支持历史和版本。
2022-11-12 13:36:07 2857
原创 C++11:为何引入final&override
final和override都是C++11新引入的关键字,由于两关键字都于继承控制相关,所以我们称final和override为继承控制关键字,需要说明的是final可作用于类,亦可作用于成员函数,override则只能作用于虚函数。本文从C++98&C++03标准中存在的问题入手,深入浅出的介绍了C++11引入final&override的原因及其所解决的问题。
2022-11-06 22:43:10 601 2
原创 C++11:nullptr_t与nullptr的原理
nullptr是一个有类型的右值常量,可很好的解决了整数0和空指针的问题。本文从C++11~C++20标准nullptr和nullptr_t规定和特性出发,介绍了一种可能的nullptr_t实现方式。同时建议大家在开发过程中优先使用nullptr替代NULL。
2022-09-26 22:00:34 2112
原创 C++11:函数对象、闭包和Lambda
本文从函数对象入手,循序渐进介绍了函数对象,闭包和Lambda函数等概念,并通过分析gcc产生的gimple代码,从两个角度介绍了Lambda函数的实现原理和mutable关键字的工作原理。希望对你有所帮助。
2022-09-19 21:49:01 1139 2
原创 C语言:单例模式(懒汉式)
介绍C语言单例的懒汉式实现方式,具体包括static方式和堆栈方式。两种实现相同的是两种方式都像懒汉一样,不到紧要关头绝不创建对象,不同的是两者存放数据的位置不同。
2022-09-12 22:46:32 519
原创 C语言:单例模式(饿汉式)
单例模式的本意是确保在整个运行时间和运行空间内某种数据类型只有一个唯一的实例,并且提供一个全局的访问接口。我们可从实例创建和访问两个角度,更深入的理解单例模式:(1)数据类型有且仅可创建一个实例,编程人员不能像普通的数据类型一样,随意定义此类型的实例。它是一个阉割的数据类型,限制类型实例的定义和创建。(2)此访问接口是全局唯一实例的访问接口,而非普通意义上的数据访问接口。实现......
2022-06-03 15:24:57 1745
原创 C++11:可调用对象
可以调用对象是C++11引入的新概念,指代此对象可以像函数调用方式的触发调用的对象。在C++98标准中,可以被通过函数方式调用的对象有3个,他们分别是普通函数,函数指针,仿函数。C++11中增加了bind生成对象,lamdba表达式和function对象。所以C++11可调用对象总计6种:他们分别是普通函数,函数指针,(仿函数)函数对象,bind生成对象,lamdba表达式和function对象。
2022-05-04 10:39:20 2268 7
原创 C语言:多态
多态指同一个接口的多种实现方式,是面向对象的核心。一般实现多态需满足:必须要有继承,必须要有重写 ,必须要父类引用/指针指向子类对象,三个必要条件。本文将从多态的三个必要条件入手,借鉴Javascript原型链设计并实现了一种C语言的多态实现范式。
2022-04-23 18:38:24 3872
原创 实用经验 101 提高(改善)代码可读性的措施
良好的注释、规范的变量命名,可显著的提高程序的可读性。可读性好的代码更容易被理解和维护;可读性好的代码,可显著降低程序的开发成本。这种成功包括程序员的沟通和代码的维护。
2021-12-06 20:46:54 505
原创 实用经验 100 改善C++程序运行效率的措施
深刻理解影响C++性能的各种因素。在编程时小心这些因素给你带来的负面影响;谨慎的使用C++的继承、多态等高级特性。他们在给带来便利的同时,也会你带来性能的缺失。
2021-12-06 20:33:24 1621
原创 实用经验 98 避免使用“聪明的技巧”
“聪明的技巧”对“技巧”要求太高。一般程序员无法理解。也影响了代码的可读性和可维护性。所以,请最好避免使用这种“聪明的技巧”。
2021-11-22 21:18:10 273
原创 实用经验 97 C++为何引入命名空间?
我们都知道在一个作用域中定义的每个标志符在该作用域中应该是唯一的,独一无二的。但对于庞大,复杂的系统应用程序而言,这个要求有时候很难达满足。对于庞大的应用程序,有些标识符几乎无可避免的发生冲突,这种标志符冲突问题被称之为“命名空间污染问题”。使用命名空间,你可以定义你自己的命名空间,这样可避免程序开发中发生的名字冲突。解决命名空间污染问题。
2021-11-22 21:08:51 905
原创 实用经验 96 可执行文件*.exe(*.dll)剖析
可执行文件,指一种内容可被电脑解释为程序的电脑文件。通常可执行文件内,含有以二进制编码的微处理器指令,也因此可执行文件有时称为二进制档。这些二进制微处理器指令的编码,于各种微处理器有所不同,故此可执行文件多数要分开不同的微处理版本。每个C++可执行程序都包含文件头,代码段,数据段。他们是怎么存储的这是你需要掌握的。了解可执行文件布局,掌握程序中各部分分别存储在什么位置。可以指导我们编写出更优秀的代码。
2021-11-20 17:06:25 2275 3
原创 实用经验 95 检测和定位内存泄露的技巧
项目中由于各方面因素,总是有人抱怨存在内存泄漏,系统长时间运行之后,可用内存越来越少,甚至导致了某些服务失败。内存泄漏是最难捉摸也最难检测到的错误之一。 要养成良好习惯,保证malloc/new和free/delete匹配。时刻小心内存泄漏,你可以借用专业的检查工具检测并定位内存泄露。这样可显著提供你的程序开发效率
2021-11-20 16:47:35 369
原创 实用经验 94 虚函数的实现原理
C++中的虚函数作用主要是实现多态机制。关于多态,简而言之就是用基类指针指向其派生类的实例,然后通过基类指针调用实际派生类的成员函数。这种技术可让基类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。掌握C++的虚函数实现机制,有助于我们编写出安全易用的C++程序。同样我们也需要明白C++虚函数存在的安全性问题,避免使用这些不安全的机制。
2021-11-17 23:27:25 197
原创 实用经验 93 合理的使用断言(ASSERT)
使用断言在软件开发阶段及测试阶段,可帮助我们检查程序中的一些错误,并提供有用的信息。合理的使用断言,以提升程序开发和问题定位的效率。常用的断言有两种:一种是动态断言,即大家所熟知的C标准库的assert()宏,一种是C中的静态断言,即在编译期间检查。本使用经验主要介绍动态断言。
2021-11-14 12:07:34 876
原创 第13章 C++高级特性
本章将讨论C++的一些高级特性。他们在某些适当的场景下是有用的,但并不是所有的场景下都必须。没有掌握他们,你可以写出运行良好的程序,但是,如果你掌握并使用了他们,你所编写的代码会在扩展性,可维护性方面,可能更有优势。笔者将带领大家从最基础的断言开始,讨论C++程序实现的一些特征。也许你以前从未关注过这些东西,但没关系,我们从现在开始学习掌握。因为掌握他们是你迈向C++高级程序员的必经之路。如果你想成为C++高级开发人员,掌握他们是最基本的特质。
2021-11-14 11:55:39 902
原创 实用经验 92 区分函数模版与模版函数,类模版和模板类
模板就是实现代码重用机制的一种工具,它可实现类型参数化,即把类型定义为参数, 从而实现了代码的可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。在使用模板概念时,经常会遇到这4个概念:函数模板,模板函数,类模板,模板类。这4个概念非常类似,也经常被我们所误用,本使用经验将主要讲述他们的差异。
2021-11-11 23:33:06 1642
原创 实用经验 91 区分继承、模版还有组合
区分模板和继承,当对象的类型不影响类中函数的行为时,选择使用模板,当对象的类型影响类中函数的行为时,选择继承而不选择模板。区别继承和组合,如果对象关系是is kind of 关系时选择继承,如果是a part of关系时选择组合。
2021-10-21 23:25:08 223
原创 实用经验 90 将模版的声明和定义放到同一个文件
模板是多态的静态实现方式,模板可以最大限度降低同质冗余代码,增加代码的维护性。模板实现有三种方法,声明和实现在同一个头文件中;声明和实现分离,包含头文件;使用export实现分离。但是在这三种实现方式中,声明和实现在同一个头文件中,是最优实现方式。
2021-10-20 19:29:11 236
原创 第12章 模版和泛型
你设计的两个类,除了成员变量数据类型之外,其他所有操作和实现完全相同。这些问题都可通过模板和泛型解决。面向对象所依赖的多态是运行时的多态,而泛型模板所依赖的多态是编译时的多态或参数式多态。本章就来讨论模板和泛型,也许这些议题无法保证你成为模板编程的专家,但却有可能使你会成模板编程的高手。
2021-10-19 23:45:24 136
原创 实用经验 89 关于虚赋值的问题
将重载赋值运算符实现声明为virtual函数,称为虚赋值。赋值运算符声明为虚函数是合法的,但是虚赋值却不合理。尽量避免使用虚复制,而通过原型模式替代实现对象的复制拷贝。
2021-10-19 23:19:44 222
原创 实用经验 88 虚函数重载的陷阱
如果你的项目不支持C++1,不要试图尝试重载虚函数,你会为此付出代价的,如果你的项目支持C++11,那另当别论。
2021-10-19 23:06:31 366
原创 实用经验 87 切记继承过度滥用
在设计过程中,过广或过深的继承都不是良好设计。类型职责划分不清楚是造成这种继承主要原因。对继承滥用保持警惕,同时警惕常理逻辑在软件设计中的负面影响。对于“指数级”继承膨胀问题,我们应需寻找合适的解决方案,以防类似问题继续蔓延
2021-10-06 10:01:16 445
原创 实用经验 86 绝对不要重新定义继承而来的缺省参数
绝对不要重新定义继承而来的缺省参数,采用NVI方案:令基类的一个public non-virtual函数调用一个private virtual函数,后者可被派生类重新定义。可让non-virtual函数指定缺省参数,而private virtual函数负责真正实现工作。采用NVI这种方式,用户可采用静态的方式从基类类型的接口取得参数默认值,而派生类也可自由的变更函数的行为,而不用担心什么缺省初始化物了。
2021-10-01 08:42:22 159
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人