Yihua's Blog

Work hard and keep simple.

漫谈C++——const真理大讨论之 const的线程安全

C++学习笔记

const真理大讨论之 const的线程安全 有时我们会听到const就一定线程安全这样的说法,但是事实可能没那么简单。 线程安全的const 有时候人们好像认为只要加一个const就能自动地给一个变量附上一个“线程安全”的属性,因而在多线程环境中就可以随意地访问。 一般而言,不可变 的数据可以在不考虑线程安全的情况下被访问。这是因为数据如果不可变,那么我们就不会去写它,无论什么时候...

漫谈C++——const真理大讨论之 mutable

C++学习笔记

const真理大讨论之mutable 接着上篇文章说,当我们还在语义const和语法const的实现效果不一致中苦苦挣扎的时候,我们实际需要特殊声明变量在封装内部为一种“可变的”状态,但对外提供表现出来的应该是const属性。mutable是在C++中被讨论相对较少的一个关键字。但是它却十分有用,而且在你想写出const正确的代码时几乎不可避免。 我们的核心观点在于,在外部表现为cons...

漫谈C++——const真理大讨论之 语法和语义const

C++学习笔记

const真理大讨论之“语法和语义const” 在接下来我准备花三篇文章的篇幅讨论我们的老朋友const。我曾经在一篇文章里提到了有关指针和引用的顶/底层const,但是在这三篇文章中我想跳出const的语法,讨论一下在使用const时需要特别注意的其他事项,包括const正确性、mutable以及在使用const时的线程安全。这大概构成了这三篇文章的主题,我愿统一称他们为”const的真...

漫谈C++——谈谈在函数中使用auto

C++学习笔记

谈谈在函数中使用auto 前边我写了一篇文章关于如何在变量中使用auto,今天我们来看看在函数中使用auto时的场景,以及需要注意的细节。 基本上,在函数中使用auto的情形大致可分为两类,在C++11中,auto被引入放到函数声明中返回类型的位置,用间接的方式来定义函数的返回类型,如下: //等价于 std::string someFunc(int i, double j); aut...

漫谈C++——工厂模式中的通行证策略

C++学习笔记

比友元更安全——工厂模式中的通行证策略 这次是个小短文,我们从友元谈起。 从友元谈起 在C++中,友元friend可谓是为数不多的比继承还要更强的耦合关系。耦合带来便利,但同时也不可避免得迫使我们在访问控制和安全上做出一些让步。这些问题甚至成为了工厂模式中普遍的缺陷,不信?你看! class Secret { friend class SecretFactory; private: ...

漫谈C++——动态与静态

C++学习笔记

C++中的动与静 问:C++面向对象的三大特性是什么?答曰:封装、继承和多态! 问:如何理解多态?答曰:静态多态指依靠函数重载和泛型编程的编译期多态,动态多态和虚函数有关。 问:讲讲动态多态? 类型、绑定 在讲虚函数之前,首先我们来谈谈类对象指针的类型和成员函数的绑定问题。 一个变量的类型在编译期就可以确定,一般都是对象的声明类型,此时称变量的类型为静态类型。相应的,在运行期被决...

Visual Slam笔记——李群和李代数

Visual SLAM笔记

李群和李代数 问题的引入 当我们估计出相机姿态$[R, t]$了以后,估计的结果和实际的相机姿态肯定会有一些不一致性,因而我们需要对估计出来的结果进行优化。优化方法一般都采用迭代优化的方法,每次迭代都更新一个位姿的增量$\Delta$,使得目标函数最小。这个$\Delta$就是通过误差函数对$\mathbf{T}$或者$\mathbf{R}$求微分得到的,也就是说我们需要对变换矩阵$\m...

漫谈C++——谈谈在变量中使用auto

C++学习笔记

谈谈在变量中使用auto 用作变量类型推演的关键字auto可能是C++11最著名的特性了,所以这篇文章我长话短说,简单写一下我认为比较重要的使用法则。 怎么用 auto 这一节我会写得尽可能短,因为我默认大家都已经用过auto了。如果有谁没用过的话,有大量的书和文章来替我讲这方面的知识。 我们都是用auto这个关键字来代替一个具体变量的类型定义,让编译器自己去寻找和从它的初始化过程中...

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

C++学习笔记

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

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

C++学习笔记

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