一、引言
最近也正在第二次刷《C++ Primer 5th》这本书,为什么要第二次刷呢?是因为自己仍然写不出自己满意的 C++11 风格的代码。
那么这个有点“玄乎其玄”的 C++11 风格到底是什么呢?
这是一个很大的话题,这里不予而且我也没有能力去阐述,我只能以我自己看到的一点点小细节来揣测大神们在设计 C++11 的一点点想法。
二、C++11 为什么要设计一个 std::array?
我们打开 C++在线手册,可以看到里面的标准库里,有一个非常奇怪的容器:std::array
。
也许我们用惯了 std::vector
,亦或者std::string
,对于std::array
实在是陌生得紧。来,让我们看看在线手册说了什么:
std::array是固定元素个数的容器。
此容器的语义与相应C数组的语义相同。容器array<T,N>
的大小等于相应C数组T[N]的大小,且性能也与C数组相同。但是它提供了C++标准容器的相应特性,如可以查询容器大小,支持复制,支持随机迭代器等等。
也就是说,std::array
是一个语义和性能上都与 C 中的数组一样的容器。
那么,C++11 为什么要单独设计一个 std::array?
这个问题也许很难有个答案,但是我这里想做出一些自己的理解:
首先,我认为此举是为了倡导脱离 C 风格的编程习惯
为什么这么说?C++ 的编程风格有多少种无法计算,但是最主流的有四种(说法来源于《C++ Primer 5th》前言):- C 风格的 C++
- 面向对象的 C++
- 面向泛型的 C++
- 基于组件的 C++
也就是说,C++ 的编程风格实在太多太多。而正是这一点饱受诟病。C++11 在试图做什么呢?它首先想要倡导一个良性的编程风格,至少,对于我这种由 C 入门的人,思维还是 C 的面向过程的思维的人,如何让我们这些人从容而且正确的使用 C++11 ?
也就是说,C++ 的去 C 化。
当我们敲出了如下的代码时:
int a[10];
我们思考的是什么?是简简单单的一个指向了 10 个 int 类型的存储空间的数组指针 a ,其实就是这样的思维,导致我们仍然无法脱离 C 的影响。我们还在考虑底层的事情,而当我们写出了如下的代码的时候:
std::array<int, 10> a;
我们或许思考的是,我们使用了一个数组容器,它的存储类型是 int,它有 10 个元素,仅此而已。这是一种思维上的转变,也是一种进步,或者说,是 C++11 的设计者想要看到的。
其次,在线参考手册里也说了,提供了 C++ 标准容器的相应特性
也就是说,既然是容器,就会有对于容器的一些操作,就可以封装一些方法。这也是非常容易理解的 stl 的一些理念。
在学习 stl ,我们在思考什么?我们看数据都是容器,操作数据都是迭代器或者算法,这就是一种进步,就是一种设计上的先导成熟。
三、让我们一起写最美丽的 C++11 风格代码吧
代码风格是一种非常主观的东西,但是也非常重要。
我希望我能写出来一手漂亮的 C++11 风格的代码。
To be Stronger!