Blog von Felix

Work hard and keep simple.

漫谈C++——override和final让你的虚函数更安全

C++学习笔记

今天我想谈谈override和final,这一对在C++11中不太引人注意的特性,相比于C++11其他特性而言也更简单。这两个特性都能让我们的程序在继承类和覆写虚函数时更安全,更清晰。 覆写(override)虚函数 你有没有像我一样遇到过这种情况:在子类中,本来你想覆写虚函数,结果虚函数却没有被正确地调用呢?或者更惨的是,你有时不得不去修改父类虚函数的声明。在所有的子类中查找重载的函数...

漫谈C++——从编译期常量到constexpr(三)

C++学习笔记

使用constexpr进行编译期运算 在上面两篇文章我分别介绍了什么是编译期常量以及C++03标准中的编译期运算。这篇文章我将围绕在constexpr这个关键字展开。 C++03中编译期运算的限制 我在上篇文章中所举的例子,要么非常简单,要么就是和模板元编程有关。非模板元编程的方法往往是一行就结束了,难以实现复杂的运算。此外我们还不能复用代码,无论在哪里我们都要再复制粘贴一遍,不符合我们设...

漫谈C++——从编译期常量到constexpr(二)

C++学习笔记

C++11标准前的编译期运算 在第一篇文章中,我把主要精力放在了什么是编译期常量,以及编译期常量有什么作用上。在这一篇文章中,我将更详细地介绍编译期常量是如何产生的。之所以要把编译期常量了解的这么透彻,是因为他是编译期运算的基础。在这篇文章中还会讲解我们在C++11 标准前都可以用做哪些编译期运算(compile-time calculations),通过了解这些比较原始的方法,我们能够更...

漫谈C++——从编译期常量到constexpr(一)

C++学习笔记

从编译期常量谈起 C++20都支持虚函数的constexpr了,我打算用三篇读文章讲清楚编译期常量和constexpr这个东西和编译期常量的关系,即为什么需要他来辅助解决这个问题。最后帮助读者在实际编码过程中能够有意识地去运用他们,这才是终极目标。这篇文章中会讲到隐藏在日常编程中的各种编译期常量,以及他们存在的意义。 什么是编译期常量 想要用编译期常量就要首先知道它们是什么,一般出现在...

漫谈C++——C++17新特性之std::optional

C++学习笔记

C++17新特性之std::optional C++ 17 在 STL 中加入了许多新的”vocabulary types”,这些类型时用在不同组件的接口处的。MSCV也在Visual Studio2017中添加了对诸如std::optional, std::any和std::variant的支持。在这篇文章中,我们就来看一下std::optional解决了哪些问题,以及如何正确使用它。 ...

漫谈C++——用了这么久,你真的懂nullptr吗

C++学习笔记

用了这么久,你真的懂nullptr吗? 你是否在混着用NULL和nullptr? 你是否分不清这二者到底有什么区别? 滥用NULL到底会带来什么不可思议的错误? 今天,我们就来讨论讨论nullptr这个空指针的救世主。在C++11之前,几乎所有人写代码时对NULL又爱又恨,爱是因为他确实能够起到空指针的作用,恨是刚躲过了这个坑,又遇见了那个妖,魑魅魍魉怎么它就这么多。还好,C++11给我...

漫谈C++——起底万能指针void*

C++学习笔记

起底万能指针void* 从一个惨案说起 在一个项目中,我们开发的同学需要调用算法同学提供的一个接口,这个函数除了所有必要的参数之外,最后还有一个“多余的“参数void*类型,即一个可以指向任何类型的指针。这个参数之所以存在,是因为这个接口是一个算法过程的入口,在算法的最后会自动调用一个回调函数callBack,回调函数是我们自己定义的,可以用来回收所传进去的void*参数所开辟的内存,整...

漫谈C++——右值引用与移动语义

C++学习笔记

右值引用与移动语义 引子——左值持久、右值短暂 在C++11以前,所有引用都是左值引用(lvalue reference)——对左值的引用。lvalue这个词来自于C语言,指的是可以放在赋值表达式左边的对象,这些对象都是在对上或栈上分配的命名对象,他们有明确的内存地址。相对应的右值rvalue,如文字常量和临时变量,指的是可以出现在赋值表达式右侧的对象。左值引用只能绑定在左值上,右值就会...

漫谈C++——强枚举到底有多强

C++学习笔记

强枚举到底有多“强” 传统枚举类型以及其特性在开发上的弊端已逐渐显露,C++11标准对原有枚举类型进行了加强和补充,从而衍生出了”强枚举”。本文不仅旨在讲清楚强枚举是如何在弱枚举上进行改进,更希望阐明弱枚举的种种不足是如何对开发造成不利影响的;以及同时C++11”新标准”(早已不新)是如何对98的枚举进行补充的。 枚举无处不在 在工程代码当中,只要和数据打交道,基本上就离不开枚举类型—...

算法笔记——单调栈

Leetcode刷题总结 五

单调栈 单调栈 单调栈本身是栈,其存放的数据是有序的,是处理无序数据的一种工具,单调栈也分为单调递增栈和单调递减栈。所谓的增减都是指在栈中存放的元素的大小。对一个无序数据列构造一个若干个有序数据段,则需要使用单调栈。其伪代码如下: stack<int> st; for (遍历这个数组) { if (栈空 || 栈顶元素大于等于当前比较元素) { ...