C++从零开始(开源):一文读懂muduo
🌟《C++从零开始》 系列,工作快一年,终于又开始更新了…🥗
C++从零开始https://hwh.zone/p/62712
在学校接触C++比较少,主要是用Java 、Python较多。入职腾讯前,为了恶补下C++网络相关基础,读了一些经典的demo级 开源库,如 Tinyhttpd 、Zavar 等。入职后大多数时候在业务屎山上玩耍,内部也有封装好的网络框架,但一直对网络通信底层挺感兴趣。
疫情过后,所在的业务收缩(千万PCU–>百万PCU),并发数下降了一个量级。也算有了难得的时间,来静下来心来读一些工业级别的开源库。经过调研,锁定在muduo-cpp11 、brpc 两个项目,先花了一周先读完了相对简单的muduo,写篇文章给自己总结回顾,也给后来者一份全面清晰地参考吧。
一、Muduo整体架构
注意,muduo 源码@chenshuo基于boost,本文代码引用@S1mpleBug基于C++11改写的muduo-cpp11。
1.1 从EchoServer说起
1.1.1 快速开始
下好源码后,我们编译一下项目中EchoServer示例:
12git clo ...
C++从零开始(零)
🖋 《C++从零开始》系列,持续更新中…
写在前面
为什么写这份笔记
这个系列虽然名为:《C++从零开始》,但细细算来,我已经不止系统性地学过C++一次了。说来惭愧,每次目的也都是为了对付考试,取个不错的成绩而下点苦工罢了。
阴差阳错,我明年即将入职腾讯,并以C++开始自己职业生涯的第一站,正好在校还有段较清闲的时光,于是下笔写了这个C++系列笔记。一是分享记录、以讲代学,希望能对同样学习C++的读者有点帮助;二是好记性不如烂笔头,同时帮助自己时时记忆和温习;三是开源分享、贡献一点力量,中文(文字版)开源教程/笔记太少,希望能自己整理一份精炼也足够清晰的C++总结记录。
动笔前,我仔细构思了下该系列笔记的整体结构,下节会开始介绍具体介绍。
特别的,这个系列处于初建状态,文章可能会由于更新等原因和之前版本有所不同;
所有的文章更新记录变化,可以在第三大节:更新记录中查看。
谁适合阅读本文
这个系列虽然叫做“从零开始”,但如果你真的零基础,阅读了前面《环境搭建》两篇文章便可能要开始怀疑自己是不是适合做程序员了。
当然作者并非有意让你感到这种沮丧的情绪,一是希望以讲代学 的方式帮助 ...
校招笔记(零)_写在前面
转眼就到了属于我的毕业季,还记得初来学校的期待和兴奋,却从“小师弟”眨眼变成了“老油条”。实习和秋招也算正式告一段落,对于我这种懒蛋,有幸拿到了腾讯、美团、Shoope SG等 后端开发岗 offer,勉强算是一个 “happy ending”。找工作是今年我经历的最重要事情之一,同时也想给师弟师妹提供一点帮助,便整理了这份 (互联网)校招笔记。
直入主题
互联网校招主要形式和考察内容如下:
考察形式
线上考察,视频面试(大部分公司)或电话面试(阿里等部分公司喜欢这种方式)。
考察内容
算法能力
俗称“刷题”,一般面试都是常见题,理论上刷完Leetcode-Top100,能做到烂熟于心(指现场秒背题或模板),大厂面试一般没有多大问题。
当然针对心仪公司,可以在面试前更加针对性地练习该公司的常出题,这一点上codeTop是一个不错的网站。
计算机基础
俗称“八股”,考察范围包含:计算机网络、Linux、数据库、操作系统、常见中间件&框架、智力题等。可以看得到考察范围非常广,但是考察的题目非常固定。所以只要背熟常见题目问答便能不错地应对面试,这也是该部分内容被称 ...
Hexo+Github Pages快速打造属于自己的网站
⚠️ 阅读本文前,你需要具备:
会打字
熟练掌握Ctrl+C/Ctrl+V
或许有一点的网络知识
如果操作遇到困难,可在文章下方进行留言😃。
前言
迫不及待?建站效果实时预览:royhuang‘s blog 。
royhuang's bloghttps://www.hwh.zone
第一次建站时还是三年前用WordPress搭建,网站放在腾讯云VPS上运行。因为机器配置较低比较卡,有次暴躁debug把整个服务器remake了,不了了之。再后面又因为对Java Web开发比较感兴趣,折腾了SpringBoot Web开发和前后端相关知识,打算自己完全前后端自主开发一个博客。因为主客观各种原因,做了一个残次品,阴差阳错最后要以C++开始自己职业生涯第一站,也没有最终完善。
趁着这段时间,使用Hexo+Github Pages 作为最终建站方案折腾了几天,总体来说效果还比较满意。为了后来人少踩点坑,同时为自己糟糕的记忆留点回忆,特此记录。
主流建站方式比较
在正式开始前,我们不妨先来分析下主流建站方式,做到心中有数。自然,此节也可以略过。
建站难度
所需知识
定制化程度 ...
C++从零开始(十二):Linux系统编程入门
🌟《C++从零开始》 系列,毕业论文初稿写完三个月过去,终于又开始更新了…🥗
C++从零开始https://hwh.zone/p/62712
Linux系统编程作为《C++从零开始》三部曲之一,自有其极其重要的地位。
如果将Linux比作为一台性能出众的跑车,我们一定不会只满足于驾驶它上下班,只会挂挡、踩油门和控制方向之类的基本操作。我们想要更加了解它,挖掘更多的潜能。
学习系统编程便是让你做到这一点。
Linux系统内容纷繁复杂,在学习过程中《Linux系统编程手册》使我受益良多。在本部曲中,我将尽量用简洁的语言进行总结和扩展。
好了,轻松一点,让我们先从Linux的前身——UNIX历史说起吧。
UNIX历史
UNIX和C简史
1969年,bell实验室(隶属AT&T电话公司),Ken Thompson,开发出了首个 UNIX 系统。
UNIX 是MULTICS(多信息及计算服务,Multiplexed Information and Computing Service)一词的双关语。
1970年,AT&T 的工程师,在Digital PDP-11 小 ...
C++从零开始(十一):C++进阶(下)STL
🌟《C++从零开始》 系列,开始更新中…
C++从零开始https://hwh.zone/p/62712
九、STL
STL 即“标准模板库”( “Standard Template Library”) 的缩写, 是C++标准库的一部分,使用时不用单独安装,直接引入头文件即可。
比如:
12# include <vector> // 引入vector# include <array> // 引入array
STL发展历史重要时刻一览:
1987年:贝尔实验室Stepanov 进行C++泛型软件库的研究;
1992年:Alex Stepanov 正式提出 STL(Standard Template Library);
1994年:STL 正式纳入 C++ 标准化进程之中,随者 C++ 标准的改进,STL 也不断做着相应演化;
1998年:ANSI/ISO C++ 标准正式定案,STL 正式成为C++ 标准库不可或缺的重要组成部分。
STL 几乎所有的代码都采用了模板类和模版函数的方式,由此提供了很好的代码重用机会。
STL从广义上讲分为三类:
...
C++从零开始(十):C++进阶(上)模板
🌟《C++从零开始》 系列,开始更新中…
C++从零开始https://hwh.zone/p/62712
八、模板
模板(Template)是C++中的泛型编程的基础。
就像类是一种模板,可以创建不同的对象。模板(Template),也可以创建不同的“对象”,只不过这个“对象”是函数或类。
类为同一类型的不同对象,提供了一份“通用的代码”。而产生所需的不同对象,只需实例化类生成对象时通过:
分配内存:为不同对象分配不同内存,这决定了它们物理意义上的不同;
构造函数初始化:调用指定构造函数和参数进行初始化,可以让对象产生值意义上的不同。
模板类似,根据类模板/函数模板可以实例化出不同的类/函数。这些类之间或函数之间的差异性,是在实例化时:
编译器会为每个实例出来的类/函数分配不同空间;
另一方面,是实例化时我们可以指定不同的数据类型。
模板最大的好处便体现在第2点,让我们编写的类或函数和数据类型无关,从而实现了通用编程。
本文主要探讨以下内容:
函数模板、类模板的应用场景及基本使用;
模板参数;
模板特化应用场景及使用,包含全特化和偏特化。
8.1 模板初识
8 ...
C++从零开始(九):面对对象(下)继承和虚函数
🌟《C++从零开始》 系列,开始更新中…
C++从零开始https://hwh.zone/p/62712
七、继承和虚函数
7.1 继承
面对对象三大特性:封装、继承、多态,继承在面对对象中的重要性不言而喻。
本章主要探讨的问题:
为什么需要继承?
继承的访问权限和成员访问权限的区别?
继承的派生类出现和基类同样(函数签名、返回类型一致)的函数,会发生什么?
派生类对象构造时,是如何进行构造的?
多重继承优缺点及菱形问题。
7.1.1 为什么需要继承?
想象这么一个问题:如果存在一些简单、基本的对象,如何来创建一个新对象?
通常我们使用对象组合和对象继承两种方式。
对象组合。这符合我们最直观的认知,适合新对象与基本对象之间存在has-a 关系。
例如,一个房间有一张桌子和凳子。我们创建一个ClassRoom类,然后组合table 和 chair构成ClassRoom。
12345678class ClassRoom // 教室{ private: Table _table; // 桌子 Chair _chair; // 椅子 public: ...
C++从零开始(八):面对对象(中)运算符重载
🌟《C++从零开始》 系列,开始更新中…
C++从零开始https://hwh.zone/p/62712
六、运算符重载
在前面我们接触过函数重载,让我们可以使用多个同名函数,只要它们有唯一的函数签名(由函数参数类型、个数、函数名组成)可以让编译器区分即可。
在C++中,运算符被视为函数,自然也可以进行重载。
认识下运算符这个特殊的函数。
运算符operator+ 作为函数,接收了两个int类型参数:
123int x { 2 };int y { 3 };x+y;
重载函数operator+ ,又接收了两个double 类型参数:
123double x { 2 };double y { 3 };x+y;
这都是C++为我们内置实现了operator+ 重载,用于C++基本类型之间运算。
我们也可以自定义重载自己的运算符函数。
虽然C++ 中几乎所有的运算符我们都可以进行重载,但要注意以下规则:
重载运算符中的至少一个操作数必须是用户定义的类型,比如重载operator+ 函数,一个参数是i ...
C++从零开始(七):面对对象(上)快速入门
🌟《C++从零开始》 系列,开始更新中…
C++从零开始https://hwh.zone/p/62712
五、面对对象入门
C++和C一大主要区别,便是引入了入面对对象。
为什么需要引入面对对象?它有什么好处?
5.1 为什么需要面对对象?
5.1.1 从面向过程说起
在传统编程中,数据和处理该数据的函数是单独的实体,它们组合在一起以产生所需的结果。
也就是面向过程通常做法。
但是由于面向过程的这种分离,传统编程通常不能提供非常直观的现实表示:
1goToHome(you);
在这个例子中,行为主体you 和行为goToHome 被分隔了:you 被当做单独的数据实体,行为goToHome 被当做单独的函数实体。
面对对象则提供了更直观的表示能力。
因为面对对象将对象(行为主体)、属性和行为封装到独立、可重置的类中。 而这些属性和行为往往也被认为是密不可分的。
1you.goToHome();
显然,这让对象(you)是谁,以及正在调用什么行为(goToHome)更清楚了。我们不再专注于编写函数,而是专注于定义行为集的对象。
这,也就是面对对象。
得益于这种专注于对象的行为,面 ...