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

21 | 知识串讲(上):带你开发一个书店应用

你好,我是 Chrono。
到今天为止,课程里的 C++ 知识就全部讲完了。前面我们总共学习了四大模块,我再带你做一个简略的回顾。
在“概论”单元,我带你从宏观的层面上重新认识了 C++,讲了它的四个生命周期和五个编程范式,分别介绍了在编码阶段、预处理阶段、编译阶段,C++ 能够做哪些事情,接着又重点说了在 C++ 里,运用哪些特性才能更好地实践面向对象编程。
在“语言特性”单元,我们一起研究了自动类型推导、常量、智能指针、异常、函数式编程这五个特性。这些特性是“现代”C++ 区别于“传统”C++ 的关键,掌握了它们,你就能够写出清晰、易读、安全的代码。
在“标准库”单元,我介绍了字符串、容器、算法和并发。它们是 C++ 标准库中最核心的部分,也是现代 C++ 和泛型编程的最佳应用和范例。学会了标准库,你才能说是真正理解了 C++。
在“技能进阶”单元,我为你挑选出了一些第三方工具,包括序列化、网络通信、脚本语言和性能分析,它们很好地补充完善了 C++ 语言和标准库,免去了我们“自己造轮子”的麻烦,让我们把精力集中在实现业务逻辑上。
除了上面的这“十八般武艺”,我还谈了谈能够帮你更好地运用 C++ 的设计模式和设计原则,介绍了几个比较重要、常用的模式,希望你在今后的实际开发工作中,能够有意识地写出灵活、可扩展的代码。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《罗剑锋的 C++ 实战笔记》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(16)

  • 最新
  • 精选
  • yadandan
    老师您好,“这样就绕过了 C++ 的语言限制,不必在实现文件“*.cpp”里再写一遍变量定义,全部的代码都可以集中在 hpp 头文件里”,这句话怎么理解,能举个例子吗?

    作者回复: C++要求静态成员变量必须在cpp文件里定义实现,头文件里只是声明。 而在静态成员函数里声明静态变量,再以函数返回值的形式来使用,就不需要在cpp里重复写一遍,只要在头文件里写就行了。 课程的示例代码就是这样的,你也可以自己模仿着试一下,用静态成员函数代替静态成员变量。

    3
    14
  • reverse
    关于UML图 想学的同学可以看一下《UML大象》

    作者回复: uml其实并不难,也没有必要完全学通学精,本质上就是个画图。 先学会最基本的类图、时序图,其他的可以在实践中慢慢学。

    2
    10
  • K. D.
    老师你好,我上网查了一下spin lock(自旋锁)和mutex(互斥锁)的区别,自旋锁是会让线程busy waiting,而互斥锁则是让线程sleep,从cpu的占用角度,是否sleep是更好的?busy waiting感觉更加cpu intensive。

    作者回复: 你理解的很对,两者的区别就在这里,自旋锁的好处是不会让出cpu,busy waiting,这在小等待时的代价就比较低,可以充分利用cpu。而mutex会让线程sleep,暂时让出cpu给其他线程,这就有点浪费。 具体该用哪个还是要看应用场景,在这里我用自旋锁只是为了演示atomic的用法。

    3
    7
  • henry
    老师您好!ZmqContext 类中的两个工厂方法 recv_sock,send_sock, 返回值是zmq::socket_t的对象,里面的临时对象sock析构时不用担心zmq_close 关闭了_handle,是因为zmq::socket_t实现了移动构造函数,临时对象sock的_handle别转移了,自己的_handle已经是null_ptr了对吧。 要是我自己实现这个代码的话,估计还是会用智能指针的方式。时刻注意构造和析构细节感觉挺麻烦的。

    作者回复: 是的,都看zmq.hpp的源码了,很认真啊。 有了右值和转移构造,在C++里返回对象确实省了很多力气。

    2
    1
  • 泡泡龙
    老师能否说说需求到UML图的过程,是怎么把需求提到UML的。还有就是给一张UML图,应该怎么看?

    作者回复: 1.这个就是基本的需求分析了,简单来说,就是提取出需求里的名词和动词,转化成相应的类,比如销售记录、配置文件、锁、XX主循环。 2.UML图有很多种,这里用到的是类图,表示的是类之间的关系,需要理解UML的基本语言要素,比如聚合、联系等,然后可以随便选一个类作为起点,像爬虫一样,沿着关系链接去看它相关的类,逐步去理解这些类是如何配合工作的。

    1
  • Geek_1cd0c8
    老师请问下 ,1.书店程序文章内说是从不同地方收集数据汇到后端服务,当我运行客户端程序c.out,的时候没见到有数据收集的入口呀,2.开着openresty。服务端程序a.cout,第二次运行客户端程序c.out,服务器程序a.out直接崩了,hello cpp_study server 1 2 3 4 terminate called after throwing an instance of 'msgpack::v1::type_error' what(): std::bad_cast 已放弃 (核心已转储),有遇到这个问题吗

    作者回复: 1. 客户端程序只是示意,直接在代码里写死了两条记录。 2.可以用gdb debug看看出错在哪里。

    归属地:天津
  • Geek_1cd0c8
    大哥们编译问题都能解决?编译时 crytypes.h文件 line:24 "std" has no member "string_view" 这需要c++17编译咋没人提 ,你们都用的c++14编译过的吗

    作者回复: 是哪个库引用的string_view?是不是新版本库引用了C++17的这个组件,如果是GitHub项目里的应该用C++14肯定能过的。

    归属地:天津
  • 我是一只小小鸟
    老师,您好,有个问题请教下,只使用.hpp,如果函数接口比较多,易读性怎么保证。到时候一个hpp文件,会不会出现1000+

    作者回复: 其实这个和hpp没有必然关系,用.h + .cpp也会有同样的问题,只要类设计合理,用好设计模式,不要出现面条类,一两千行的源文件也是可以接受的,如果再大就要考虑重构了。

    归属地:北京
  • Geek_6427cc
    老师您好,get模板函数的返回值不是很懂,不明白LuaRef_cast是什么,类型转换不是只有那四个方法吗

    作者回复: LuaRef_cast是lua bridge自己的类型转换函数,把lua数据转换C++数据。

    2
  • Geek_8866d4
    /home/wuchaochao/c++/cpp_study/section5/client.cpp:36:20: error: non-local lambda expression cannot have a capture-default 36 | auto make_sales = [=](const auto& id, auto s, auto r) 老师 ,我在编译您的源码的时候报错

    作者回复: 我测试了一下,没有重现你说的这个问题,是不是使用的标准不对,编译时加上-std=c++14再试试。

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