博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
精通C++是一个艰巨的任务。
阅读量:4282 次
发布时间:2019-05-27

本文共 1845 字,大约阅读时间需要 6 分钟。

为什么C++比别的语言难学这么多?其实这基本上是因为C++他爹Bjarne Stroustrup说过的一句话“我特别讨厌语言的设计者把自己的喜好强加给用户”(看向go)。结果C++为了不限制你的想法,于是也就变成了现在这个样子——包含若干范式,大概有
  • 面向对象(灵活应用virtual继承+shared_ptr可以达到java/C#的效果)
  • 模板(这里分两类,分别为type rich programming和meta programming,区别很大)
  • 函数式编程(如今有了lambda,配合<algorithm>文件,简直无敌了)
  • 过程式
但是难能可贵的是,这几种东西在C++混在一起用也是多么的自然。不过,这需要你花时间去掌控他。
那到底有没有必要真的学到这个地步呢,我觉得跟你的领域是有关系的。譬如说我,基本上算是人格分裂的,因为:
  • 当我搞语言设计和编译器的时候,我总是会倾向于创造各种小DSL来给自己用,用的都是模板(想想boost的spirit大概就明白我的意思了,虽然我不用它),尽量让跟我有同样背景的人一眼能看懂我代码的意思。
  • 当我做我那个GUI库()的时候,纯粹是用OO和IoC那一套。
  • 当我写3D渲染程序的时候,我会变成一个为了性能不惜牺牲可读性的人。
当我是不同的我的时候,我当然只会用C++的一部分来完成我当前的这个任务。这好像是多重标准,但是实际上是由于项目本身的性质而定的。
到了这个时候你会觉得,C++真是一门好语言。当你需要为了你的项目放弃不同的部分的时候,C++都能帮你做到。当你需要不同的抽象层次需要不同的性能要求的是,C++还是能够帮你做到。如果你用别的语言,你最终会发现那个语言只能做某几类的项目。这是因为,
C++能够自由的让你放弃某些部分,而别的语言会阻止你放弃某些部分
为了达到这个层次,你必须进入一个无限接近于精通C++的状态里,这个时候你才能收放自如,不被C++社区的各种不同的价值观所捆绑。倘若你的项目非常大,不同的部分有不同的特征的时候(什么,一个没有遍布全世界的一两千人写了20年的程序能叫程序吗?),就更加需要你有这种本事了。

说到这里,大家大概都明白精通C++大概是个什么感觉了吧——大丈夫能屈能伸

C++是一个典型的多范式语言,不过他概括的还不够全面。C++是四类范式的组合体:过程式/结构化面向对象代表Lambda的模板(元编程)以及作为一个Markov Machine也具有图灵完备性的宏。此外还有一个我不知道怎么归类的type rich programming。

在这四类范式之外,还有各种各样的奇技淫巧。这里我说的奇技淫巧,并不是指Boost.MPL或者Loki那样的,那些其实都是C++基本范式中的衍生做法,都是最规矩的。
这里的奇技淫巧,给大家举两个例子。比如在C++03时候,还没有explicit type cast operator,那要安全的提供operator bool,还要利用member function pointer的特殊转化规则;又比如BOOST.AUTO在VS2008上利用了一个Bug完成的实现。奇技淫巧的问题在C++11消除了一部分,但是又增加了一些,比如说左值/右值引用的折叠,就是不是一个逻辑上自然的、而是设计后的产物。
此外还有一些坑。比如说重载-多态-名称掩藏、虚继承、指针的转来转去导致的问题什么的。
这些都还是最最基本的常识性问题。要是应用到生产中,就会变得更复杂。什么时候用继承,什么时候用模板,什么时候用多态,什么时候用宏。好在有一些前辈已经给我们淌了路,比如说Shutter,比如说Meyes。熟读 6E(Effective C++,More Effective C++,Exceptional C++,More Exceptional C++,Exceptional C++ Style,以及Effective STL),这大概是进阶的唯一阶梯。
再往上你学C++就没啥用了。多学一学其他语言,例如Haskell,ML,Javascript,C#,自己做一做编译器,了解一些语言设计上的常识,读一些形式化系统的论文,都会帮助你对C++这么一个复杂而丑陋的语言产生更多的同情。
当你开始觉得:C++的设计者真可怜;埋怨英文标点实在太少并开始同情BS;决定自己卷起袖子撸一个的时候,大概你就算是精通C++了。
当然撸的好,就是Rust;撸的不开心,那就是Go了。

转载地址:http://ptfgi.baihongyu.com/

你可能感兴趣的文章
Android4.x 如何处理Power按键
查看>>
创建一个简单的device_create_file文件节点
查看>>
android linux 休眠 深度睡眠 查看 方法 调试
查看>>
ubuntu mount cifs
查看>>
一个简单的framebuffer的显示使用例子
查看>>
inux下串口编程简单实例
查看>>
SELinux app权限配置
查看>>
Linux下的串口编程
查看>>
pthread_create Linux函数 线程创建
查看>>
linux创建线程之pthread_create
查看>>
怎样添加earlysuspend到一个普通驱动中
查看>>
怎样通过framebuffer来传递关屏信息
查看>>
BootLoader启动过程分析
查看>>
Linux获取/dev/input目录下的event对应的设备
查看>>
android性能测试工具dumpsys命令的用法
查看>>
Android性能测试常用命令
查看>>
性能测试常用的linux命令
查看>>
Linux性能测试 命令大全
查看>>
iOS中使用blend改变图片颜色
查看>>
iphone开发中的一些小技巧
查看>>