【 以下文字转载自 Programming 讨论区 】
发信人: hyperLee (老李), 信区: Programming
标 题: 说起来C++还是太bare metal了, 教科书上又没有21条军规这类强制约定
发信站: 水木社区 (Tue May 12 05:01:30 2020), 站内
include, vtable, 指针, 不是直接操作文本, 就是直接操作内存,再不然也是函数指针, 说起来都是比较"高级"的东西, 似乎小白们不应该去了解, 然而书上随便展开一下, 就涉及了, 所以小白们都觉得很危险.
好多著名老坑, 新手不踩完一遍, 涨不了记性.老手有时候一时迷糊也会踩一下.
比如c时代, 用memset初始化结构体是标准操作, 但是c++ 的class 可能有虚指针, memset就是灾难性的. 还有变着花样的new和delete, 也很容易让人犯错误.
这些东西, 在后c++时代, 都是可以轻松避免的.
如果pimpl+smart ptr和c++ class同时教, 那堆上对象就是可以随意传来传去, 而且不需要手动释放. 无论什么语言做到自动内存管理, 都得是这个范式. 只不过那些语言不说会牺牲效率, 而C++会明说, 就搞得好像C++为了实现一些安全做法代价很高似的.
还有异步, 现在有标准线程库了, 编写起来也方便了, 不用去撸pthread或者win32thread了. 以前各种线程库满天飞, 选择困难造成了新手的畏惧.
但是锋利的刀毕竟比钝刀好使, 如果有21条军规之类的规定进入教科书, 还有一些基本范式也进入教科书, 那就写起来又安全又好了.
优良的c++代码, 又安全写起来又舒服的多得是, qt和osg/vtk都提供了非常好的例子.
但是有多少c++'er会首先接触他们呢? 就好比linux经过几十年的发展, 早就不是最初手动编译内核那种使用模式了, 但是那些过时的文档依然在顽强的干扰新用户. C++也一样.
c++ class的灵活与强大, 是大型软件工程能成功的强有力保证.有时候你不用class, 代码会变得极其难看.
比如一种基础运算产生了10个结果, 你用function, 只能用10个指针或者引用把数据传出去, 然而我只想用其中一个呢? 况且你还得每次写上10个变量用于返回值. 如下
int a1=0, a2=0, .... a10 =0;
int retv = some_function(input_1, input2, ... inputn, &a1, &a2, ...&a10);
这时候吧这个函数封装成对象, 就简单多了
struct SomeFunction
{
SomeFunction(input_1, input2, ... inputn, &a1, &a2, ...&a10)
{
do_it_now();
}
int get_a1() { retrun a1;}
int a1=0, a2=0, .... a10 =0;
}
要取数只需要 SomeFunction(Input).get_a1() 就行了, 比函数形式简单多了.
这些方法,在好多工程中用的飞起来, 丝毫没有违和感. 我在想, 如果不用class, 这些代码会变得多难看.
现在c++有很多特性, 最初我觉得似乎没必要, 或者特性不完美, 然而用的多了, 工程大了, 你发现没有那种特性是多余的.
--
FROM 120.244.224.*