前作中,我们借助代理类对 Animal
及其子类的实例(事实上 Animal
是纯虚类,无法实例化)进行代理。
本文,我们将对代理类进行进一步分析,察觉一些细微的差别,而后引出智能指针。
现代编程语言,大都在标准库中包含了随机库。例如,C++ 在 C++11 标准中添加了 random
头文件,提供了现代的随机库;Python 则有 random。C++11 的随机库将生成随机数的过程在逻辑上切分成了两个步骤:随机数生成引擎和分布。在学习 C++11 的 random
库时,std::mt19937
这一随机数生成引擎的名字看起来十分奇怪,成功吸引了我的注意力。
查询后得知,std::mt19937
中的 MT 是 Mersenne Twister 的缩写,这是伪随机数生成算法的名字(梅森旋转算法);而 19937 则取自算法中用到的梅森素数 $2^{19937} - 1$。这里,梅森素数是算法生成伪随机数的循环长度(period),而旋转则说的是算法内部对定长二进制串循环位移的过程。
此篇讲解梅森旋转算法的一些原理,并介绍对其的一个「爆破」方法。
此篇讲一讲 C/C++ 中的 offsetof
。
众所周知,C++ 语言本身并不提供 I/O 功能。C++ 的 I/O 是通过标准库中输入输出流来实现的。标准库在 iostream
头文件当中,预定义了六个流对象,他们是:
istream
<- std::cin
/std::wcin
,对应标准输入的输入流;ostream
<- std::cout
/std::wcout
,对应标准输出的输出流;ostream
<- std::cerr
/std::wcerr
,对应标准错误的输出流。稍有经验的 C++ 程序员都应对这些流熟悉(至少对非宽字符版本的三个流对象熟悉),因此此篇不介绍它们的基本用法,而是讨论流的缓冲区。