首页

C++ final指示符带来的性能提升  

final指示符简介 C++中的final指示符可以将一个类或者虚函数标记为不可继承或重写。让我们先看看如下的代码: 如果我们尝试创建一个新类并继承自[derived],则我们会得到一个编译错误,如下图所示: final指示符向类的客户明确传递了这样的信息:这个类不应该用来被继承,并且使用编译器来保证这一点。同时,使用这个标识符可以使用去虚拟化(Devirtualization)来优化代码的性...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:03月05日 |
  • 浏览:69 |
  • 评论已关闭 条评论

C++ 20中的条件式显式构造函数  

一句话开头 explicit(bool)是C++ 20中的一个特性,这个特性用于检查通用类型的实现并且可以减少编译时间。 细说explicit(bool) 在C++中,通过将对象封装成其他类型的技法十分常见,例如std::pair和std::optional就是两个十分典型的例子。并且,在C++标准库,Boost或者你自己的代码库中,我们还可以看到许多类似的使用。遵循”Principl...

QuickInfo在VS2019中的改进:颜色和在线搜索  

2项新改进 Visual Studio系列中的QuickInfo提示,对于开发人员来说,是一项非常方便的特性。简单来说,QuickInfo可以在你编写代码的时候,实时显示当前编写代码的辅助信息,例如函数原型,数据类型等。 在Visual Studio 2019 (v16.1) 预览版3中,这项功能有了新的改进:添加了颜色及在线搜索功能。今天就来简单介绍一下这两个改进。 自定义QuickInfo提示...

小技巧:使用对象机制实现组件初始化及销毁  

问题 最近在对一份代码进行重构的时候,发现在特殊情况下,组件的销毁接口会因为程序的异常而得不到调用,这个虽然不是什么大问题(整个程序都出现异常了,进程退出是即将发生的事情),但是对于有点完美主义的我来说,这个的的确确的,降低了程序的异常安全性。 解决方法 我们先来看下面一张图,它描述了程序改造之前的交互场景: 在上图中,我们在CWinApp对象的InitInstance中调用了组件的Init接口...
  • 阅读全文 |
  • 分类:小技巧 |
  • 发表于:06月08日 |
  • 浏览:1511 |
  • 评论已关闭 条评论

实战经验:通过类成员函数指针实现类方法调用

在开发中,有时候可能需要使用到类成员指针来调用类的方法。例如,可能会有一个函数调用表格,根据不同的情况调用表格中不同的类成员函数。今天使用一个简单的例子来讲述如何使用类成员函数指针。 类成员函数指针定义 因为函数是一个类的成员,所以它的指针定义有别于全局函数,格式如下: typedef 返回值(类名::*函数指针类型名称)(参数列表); 需要注意的地方 1) 使用typedef创建一个用户自定义类...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:04月06日 |
  • 浏览:1251 |
  • 评论已关闭 条评论

深度理解:struct和class的区别  

C中struct和class的区别 1) 在C语言中,无class关键字,因此,如下的代码片段是无法通过编译的。 2) C语言中的struct不能定义函数,仅能定义数据成员。所以,我们通常使用struct来构建数据结构。 在如下的代码片段中,我们定义了两个数据成员,但是如果在这个结构体中尝试定义一个Play方法,则会编译失败。 C++中struct和class的区别 1) struct默认的...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:01月20日 |
  • 浏览:2867 |
  • 评论已关闭 条评论

深度理解:main函数的返回值  

最近碰到这样的一个问题:main函数的返回值的作用。 main函数的前世今生 每一个C程序都会有一个main函数作为入口点,这里所谓的入口点,也即程序一开始就会尝试找到main函数的位置,并从main函数的第一行代码开始执行。 那么,第一个问题:入口点之前是什么?main函数执行完之后,又是什么?这有点像:宇宙大爆炸之前的那一刻是什么状态? 我们来创建一个最简单的C程序,来看看入口点之前是什么? ...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:01月02日 |
  • 浏览:2307 |
  • 评论已关闭 条评论

实战经验:__super关键字的使用  

我不知道你们有没有看过MFC的继承类图? 在C++程序中,我们通常会设计一系列的对象层次结构来建模真实的物理世界。 学院派的观点认为:通过类继承,我们可以使用基类描绘对象的一般特性和行为,通过子类来建模对象的特殊行为。通过在基类中定义虚方法,由子类重写(override)此虚方法,实现了继承链上的运行时多态。 但是在实际工程开发中,我们却免不了重载(overload)基类的某些方法,我们希望在子...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:12月02日 |
  • 浏览:739 |
  • 评论已关闭 条评论

实战经验:获取中文的拼音表示

碰到这样的需求,给定一个中文字符,如”中”,获取其拼音表示,如:zhong。 思路 在Unicode开发环境下,每一个字符,不论它是中文字符,还是ASCII字符,都是用两个字节表示。例如: TCHAR ch1 = _T(‘A’); 这里的ch1的大小是两个字节,ch1的值为0x0041。 TCHAR ch2 = _T(‘中’)...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:09月30日 |
  • 浏览:929 |
  • 评论已关闭 条评论

深度理解:赋值与比较的性能分析  

有时候,事情的结果会违反我们的经验常识。 例如,我们设置一个对象的成员值,有两种方式:一种是直接赋值,一种是先比较值是否相等,仅在不相等的情况下,才执行赋值。 日常经验会让我们觉得:第二种可能比较高效,因为在赋值之前先做了一个判断,省去了每次都赋值的成本。真的是这样吗? 我们来做一个实验,验证一下我们的想法。 #include "stdafx.h" class CA ...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:08月04日 |
  • 浏览:1898 |
  • 评论已关闭 条评论