罗剑锋的 C++ 实战笔记
罗剑锋
前奇虎 360 技术专家,Nginx/OpenResty 开源项目贡献者
34779 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 32 讲
结束语 (1讲)
罗剑锋的 C++ 实战笔记
15
15
1.0x
00:00/00:00
登录|注册

01 | 重新认识C++:生命周期和编程范式

你好,我是 Chrono。
今天是专栏的第一节正式课。我想,既然你选择了这个专栏,你就应该已经对 C++ 有所了解了,而且有过一些开发经验,甚至还掌握了一两种其他的语言。
苏轼有诗云:“不识庐山真面目,只缘身在此山中。”学习 C++ 很容易被纷繁复杂的语法细节所吸引、迷惑,所以,我决定从“生命周期”和“编程范式”这两个不太常见的角度来“剖析”一下 C++,站在一个更高的层次上审视这门“历久弥新”的编程语言,帮你认清楚 C++ 最本质的东西。
这样,今后在写程序的时候,你也会有全局观或者说是大局观,更能从整体上把握程序架构,而不会迷失在那些琐碎的细枝末节里。
现在,我们先来了解下 C++ 的生命周期。

C++ 程序的生命周期

如果你学过一点软件工程的知识,就一定知道“瀑布模型”,它定义了软件或者是项目的生命周期——从需求分析开始,经过设计、开发、测试等阶段,直到最终交付给用户。
“瀑布模型”把软件的生命周期分成了多个阶段,每个阶段之间分工明确,相互独立,而且有严格的先后次序,是一个经典的开发模型。虽然它已经不再适合瞬息万变的互联网产业了,但仍然有许多值得借鉴和参考的地方。
那么,说了半天,“瀑布模型”跟 C++ 程序有什么关系呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《罗剑锋的 C++ 实战笔记》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(57)

  • 最新
  • 精选
  • 忆水寒
    1、编程范式其实用的最多的就是面向过程、面向对象、类模板和泛型编程。 2、C++的优点是运行效率高,毕竟比较靠近底层硬件了。C++的缺点就是面向对象的不彻底,多重继承确实比较混乱难理解。

    作者回复: 说的很好。 对于第二点,C++不是不彻底,而是不存粹,毕竟它是面向对象的探路先锋,走了一些弯路,给后来的java等语言蹚了道。 其实如果你愿意,完全可以在C++里按照Java的风格来写面向对象,这就是C++给予我们的自由。

    5
    37
  • Woturbo
    1. 生命周期是值得整个C++程序的开发运行过程,除编码外都是由编译器完成。像预编译、编译、链接的过程实际知道原理即可,达到出现问题的时候能够解决。 编程范式就是编程思想(方法路),c++复杂的根源,包含了五种。功能是足够强大,但如果不合理使用,一味的去“炫技”,会不利于开发。核心思路是以可读性和可维护性为第一原则。 2. C++静态编程语言,存在代码编译过程即把字符代码转化为机器码(二级制文件)。python是动态(脚本)语言,执行代码可以不经过编译,执行过程为解释执行,相比c++程序最终的二进制直接执行来说解释执行效率会低得多。但从编程范式的角度,python支持的主要的编程方式(过程、函数、‘面向对象’(鸭子对象))该有的都有,比c++更简单易用,官方库强大的特点(通用性强)。解析器可以理解一个中间层,它的存在可以提高python等动态语言的可移植性,而c++的可移植性相比之下是要弱一些,需要考虑abi和平台相关。另外c++的代码安全性高,反汇编难度很大。java我的理解是介于动态语言和静态语言之间,就不做过多比较。

    作者回复: 总结的很好。 在C++里,所谓的鸭子对象,其实就是泛型。

    2
    26
  • 八曲长弓
    以前看过罗老师的《BOOST程序库完全开发指南》有不少收获,极客上看见罗老师Cpp课程毫不犹豫就买了,希望跟罗老师学习更多。

    作者回复: 感谢老读者捧场,有Boost的问题也可以在这里随时问。

    18
  • 罗老师,面向对象和基于对象有什么区别?

    作者回复: 这两个广义上都属于面向对象,严格来说也算是有区别。 前者强调统一用对象建模,多应用设计模式,对象关系复杂。 而后者则相当于C with class,只把class当成struct来封装数据,继承、多态等高级特性用的比较少。

    3
    13
  • 土逗
    1、C++程序的生命周期,分为: 编辑代码 -》预处理器进行相关宏定义,typedef等替换 -》编译器编译成汇编代码,汇编器生成目标obj -》ld连接器进行相应库的链接 -》 生成的可执行文件其实就是这些obj的打包文件,如果是静态链接的话则还包含静态库的内容,如果是动态库则包含执行动态库的路径 -》执行起来成为一个进程 -》进程结束意味着该C++程序的生命周期结束了; 我理解的C++的范式,就是C++支持编码的多种方式,支持面向过程,支持面向对象,支持泛型编程,支持函数式方式编程,支持模板元编程,经常使用的就是面向对象+面向过程+泛型模板 2、C++对比Java,从编译的角度看C++需要预处理,并且最终会编译成二进制的机器码,Java编译成字节码,被Java虚拟机进行解释,而不是真正的机器码; 我理解的C++的优点缺点如下: C++的优点: 1)能够直接编译成机器码,是真正的跨平台代码; 2)C++直接编译成机器码,则可以直接被CPU执行,而Java需要中间的java虚拟机解释执行,从开销看,C++的效率会高些;另外Java是动态类型安全语言,意味着需要由虚拟机来确保程序不会违反语言语义或访问非结构化内存,在实现层面上,虚拟机必须要频繁的进行动态检查,如是否为空指针,数组是否越界,类型转换关系等,这些都需要耗费不少运行时间,但是C++不需要,空指针,越界,果断coredump掉; 缺点: 1、从编译的角度看,要编译成二进制文件,预处理等其他繁琐的编译步骤,要比java直接编译成字节码要慢; 2、C++在C++11之前没有内管里边做的很不好,对于新手不友好,在经验不足的时候容易出现cordump或内存泄漏的情况,C++11使用智能指针让内存管理方便不少; 2、罗老师说C++中包含了五种“真气”,我的理解更简单,C++其实就是5种语言组成的集合,相比其他Java学习成本更加陡峭;

    作者回复: 总结的很好,有几个小错误要说一下。 1.typedef是在编译阶段,而不是预处理阶段,这个后面讲预处理、编译的时候你就清楚了。 2.直接编译成机器码,但这并不是跨平台的代码,而是源码可以跨平台,由不同的编译器编译成对应平台的二进制代码。 Java等语言的字节码由于运行在虚拟机上,它才是跨平台的代码。 3.C++编译慢还有一个原因,就是语法复杂,还有编译优化等等。

    2
    9
  • Carlos
    回答老师的问题并提出我自己的问题: 1. 生命周期我比较熟悉, 这个过程可以用之前对编程范式了解不多, 今天头一次听说, 我觉得这个好像更是一种 "解决问题的习惯". 请问老师网上的 google c++ style guide 算不算是一直种范式? 2. 比较 c++ 与 python: python: 语法简单, 而且 "互动感" 很强, 对 object 进行操作的时候可以一句一句运行. C++: 执行速度快, 优化空间大, 感觉写代码的时候在和内存说话, 自己知道自己在写什么. 向老师提一个不情之请: 我的 C++ 是直接用英文学的, 希望老师多给出一些对应的英文帮助理解. 再小小八卦一下, 老师您的英文名和这个有关系吗: auto start = std::chrono::high_resolution_clock::now();?

    作者回复: 回答的很认真,表扬。 1.编程范式是一种方法论,指导如何编程,偏重语法规则。Google style guide是编码风格指南,还不算是范式。可以结合课程正文再理解一下。 2.比较的挺好,一个是解释型语言,一个是编译型语言。 3.C++的语法要素中英文翻译都比较规范了,如果纯英文有时候会有点别扭,有不清楚的就问吧,我给解答。 4.这个名字来自于超任的《chrono trigger》,25年前的老游戏。

    2
    7
  • Geek_a6104e
    老师你好 请问面向过程和函数式编程有什么区别? 之前看有些资料上介绍 面向过程其实就是调用函数 所以我觉得面向过程和函数式编程貌似差不多

    作者回复: 面向过程是命令式的,就像是个流水线,而函数式编程是面向函数的,是函数套函数。 两种范式虽然都用“函数”,但解决问题的思路是不一样的,等到后面讲lambda,还有容器和算法的时候可能会更好理解一些。

    4
  • 谷鱼
    1.看到了生命周期和编程范式,C++的编译和预处理是这一类语言的共性,比较显式。比如常用的脚本语言就没有这么明显,python,php,js,ruby都是这样的,更多只能感受到编码和运行两个阶段,优化的参数也多是很常规的。 2.优点和缺点我就不清楚了。公司用到了opencv,我才意识到C++的存在,但是不会去编码,会去理解它的常用语法,理解一些思路,这无疑说明,它的周期太长,适合团队开发,充分测试,无法多快好省,短平快。重武器也许都这样吧。go还友好一点

    作者回复: C++的开发周期长成本高,所以现在适合做底层、比较稳定、核心的那些部分。

    4
  • 酸葡萄
    老师,您好,编程范式讲概念还是比较难理解,特别是函数式编程,每种范式要是都能来段代码举例就好了

    作者回复: 往后面看,后面会慢慢讲,会有代码,到后面还有不清楚的再问。

    2
  • 少年
    老师的思路确实给徘徊在入门与放弃C++的人提供了一条新路,听完很有感触。生命周期的阶段划分,预处理单独成段?为啥不叫编译预处理?

    作者回复: 预处理是C语言的传统,就是文本替换,不涉及语法,英文术语就叫pre-process,用原文来理解吧。

    2
收起评论
显示
设置
留言
57
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部