【全球播资讯】现代C++学习指南-方向篇
C++是一门有着四十年历史的语言,先后经历过四次版本大升级(诞生、98、11、17(20),14算小升级)。每次升级都是很多问题和解决方案的取舍。了解这些历史,能更好地帮助我们理清语言的发展脉络。所以接下来我将借它的发展历程,谈一谈我对它的理解,最后给出我认为比较合理的学习路线指南。
C++0——诞生
C++诞生的目的是为了解决两个主要问题——性能和抽象。性能指的是拥有像C一样的底层访问能力和执行效率,抽象则意在语言层面提供对问题的描述能力和思考方法。这是C++的立命之本,也是C++经久不衰的原因。对于这两个目标,Bjarne Stroustrup想到的解决方法是充分利用现有的C的技术和工具,然后提供类来解决抽象问题。基于这个前提,我们就可以看出类是C++学习路上的第一个关卡。
(相关资料图)
C++认为类是一种抽象思维,类的相关特性都是为抽象提供服务的。所以C++中的类比其他面向对象的类提供了更多的能力,所以也具有更多的复杂性。为了描述这种复杂性,就不得不提到C++的两个特点,静态类型安全,资源管理。
静态类型安全可以帮助开发者定义出更合理合法的自定义类,如通过操作符重载,自定义类可以写出和基本类型一样的简洁代码。可以通过构造函数避免隐式类型转换而造成的运行时错误,也可以通过明确阻止某些操作阻止自己的类被滥用。所有的自主权都由开发者决定。所以假如我们是库的使用者,完全可以不用关心这些细节,我们只需要按照一般的语言一样写代码,遇到不合理的,编译器会直接告诉我们,不用担心这些问题会隐匿在程序运行时的某个时刻。
资源管理则可以帮助开发者提供资源管理的指导和支撑。资源有很多种,而在计算机中的资源大部分都是有限的,必须有借有还,而且借和还必须一一对应,不然就是内存泄漏。在C时代,资源管理靠的是开发者对资源的全局掌控力,语言层面没有提供更好的支持。为了更好地支持资源管理,C++提出了构造函数和析构函数,两者分别可以对应资源的获取和回收。但是很多时候资源不仅仅供自己使用,还需要提供给外部使用。为了配合这种资源的转移,C++又提供了移动和复制两种操作来支持。
综上,总结一下,C++的类提供了很多特性,但是不是所有的特性都是开发者需要的。开发者在定义类的时候需要考虑的主要问题是,对这个类提供哪些支持,然后再在这些提供的功能中选择合适的语法特性来实现。构造函数和析构函数可以提供很好的一一对应的操作,移动和复制则提供了资源在对象中怎么共享,操作符重载则可以让类使用更加简洁和优雅。
C++98——标准化
C++98最大的升级是模板和异常,并且搭配了好用的标准库。
模板在C++中的地位怎么强调都不为过。它属于另一种抽象机制。所以它解决的也是抽象问题。C++中的类解决的是相似概念的抽象,更注重概念间的相似性。而模板解决的是通用问题的抽象,更注重概念的通用性。两者共同构成了C++的两大抽象基石。前面已经谈过了类,这里我们着重说一下模板。
得益于C++强大的静态类型安全,模板编写起来也很简单,普通的函数怎么写,它就可以怎么写,无非就是把特定类型换成泛型。但是,另一方面,模板还可以做得更多。模板可以支持多种参数,多个参数,限定参数,并且是类型安全的。更厉害的是,它还可以指定值。合理地配合使用类型和值,基本上就能解决大部分问题了。
说起异常。对于普通开发者没有多大吸引力。因为异常主要解决的问题是怎样告诉调用者发生错误了,是什么错误,并将执行能力转移到调用者一方。而我们大部分时间开发的都是业务代码,我们知道发生了什么,该怎样解决,大部分情况下是不太需要异常的。当然,并非说异常一无是处,异常对库开发者来说异常重要。对于库开发者来说,他需要在异常发生后,告诉调用者发生了错误,操作没有办法顺利执行。但是很多时候,库开发者并不知道调用者该怎样处理这个错误,是忽略呢,还是清理现场。异常机制提供了抛异常和异常捕获两种方式来支持库开发者和使用者。
对于新手来说,可能不太喜欢标准库,而倾向于自己写。这不是个好主意。标准库是经过工业级测试的代码,可以在绝大部分情况下正常工作,而自己手写虽然成就感更好,但是更可能携带BUG。早期的标准库提供的功能有限,只有string
,输入输出流,位运算,三大容器,和一些小算法。不过,这些都足够我们日常使用了,尤其是现在标准库功能越来越完善了,大部分编程场景都能找到合适的工具来完成,完全可以放弃手写特定代码了。
C++98更多着眼于标准化,模板是一种标准,标准库也是一种标准。自此,C++的三座大山算是构筑完成了,类,模板,标准库。每一项都为C++带来了无限可能和旺盛生命力。
C++11——全新语言
C++11的改动是革命性的,但是还保留着难以置信的兼容性,是非常不容易的。这里我们不细谈具体的特性和细节,只从大方向上来个笼统的概述。
首先直观的变化是在类型系统上,C++11将类型系统做了尽可能的规范化和统一化。
- 通过同意初始化规范了对象的初始化形式;
- 通过
auto
简化了类型声明的形式; - 通过
nullptr
规范化了空指针的形式; - 通过
enum class
提供了静态类型安全的枚举; - 通过别名简化了类型书写的方式;
- 还有其他更多更多
类型系统的改进意味着开发者可以写出更简洁,更规范,也更安全的代码,但是对编译器的挑战却是巨大的,所以,很长时间内,C++11都没有得到很好的支持,同时也妨碍了C++的发展。
除了类型系统,另一项大改进就是提供了对线程的支持。C++11的标准库中提供了线程,条件对象,锁等线程相关的工具,这对库开发者来说是革命性的。在几乎不损失性能的情况下,提供了跨平台的线程支持,这极大地提高了库的稳定性和性能,也节省了很多平台测试时间,不得不说是顶呱呱。
另一个重要升级就是资源管理了。标准库提供了unique_ptr
,shared_ptr
来协助资源管理。同时为了更出色的性能,引入了右值引用和移动语义。右值引用和移动语义听起来很高端,实际上就是解决一个问题,避免大对象的反复销创建和销毁,转而使用代价更低的移动。根本思路就是两条,对于直接量提供了右值引用,以增加它的生存时间,使之可以像普通变量一样通过参数传递。而对于变量来说,提供了移动语义,将不再需要使用的对象管理的资源转移到另一个对想象中。同时增加了移动构造,复制构造方式来优化函数的返回值。可谓是榨干了计算机的每一寸内存。
C++11无疑是C++里程碑式的更新,在对历史遗留问题清理的同时,引领了接下来C++的发展方向,它的作用是承上启下的。对类型系统的改进无疑弥补了最开始从C继承来的一些缺陷。同时也充分考虑了现代计算机的发展,引入了线程支持。在内存管理上也是更上一层楼,引入了智能指针,移动语义,右值引用。它基本上抛开了历史束缚,但依旧是不忘使命,依旧是奔着更好的静态类型支持,更多的自主性,更高效的资源管理,更克制的特性支持来展开的。
C++17,20——新生
C++17和C++20应该是相辅相成的,绝大部分特性都已经得到支持和完善了。但是由于编译器的限制,我用的特性比较少。C++17比较期待的是跨平台的文件系统支持,这对于大部分应用开发者来说无疑是激动和喜悦的。另一个我喜欢的特性是结构化绑定,这个特性我在Python里面用得很顺手,当然现在基本上所有现代语言都支持它了。
而对于C++20就用得更少了,更多的是示例性质的。我比较在意的是模块和协程,但是由于了解得不深入,就不详谈了。
什么是C++的基本面
从前几个章节不难看出,我着重夸了C++的类,模板,标准库,类型系统。这些都是我觉得学习C++比较重要的方面。但对于初学者来说,我觉得类型系统和标准库就足够了。
类型系统是一门语言最小的单元了,在C++中它包括类型声明,对象初始化,函数传参,函数返回值。在学习初期学多少特性都是骗人的,实际上手还是需要从这个最小的单元入手。比如声明一个变量,这个变量该是什么类型的,可以是指针吗,可以是引用吗。定义函数的时候,参数列表该怎样确定,返回值是什么,怎样才能让函数传参高效,怎样阻止和避免无用的参数检查,返回值该是什么类型,等等,这些都是在实际项目中需要直接面对的问题。所以对类型系统的学习,是写出高效可用代码的第一步,也是最重要的一步。考虑的问题越深入、全面,得到的回报就越大。
标准库则是提供了很好的算法支持和容器支持,可以帮助我们写更健壮的代码。对标准库接口的学习,一方面可以促进对类型系统的认识,另一方面也是积累好习惯的地方。
有了这两项技能的支持,我觉得已经能够写出很棒的应用程序了。但是对于库设计者来说,写出很好的库还需要对类和模板有着更深刻的理解。
一个定义良好的类需要对对象的生命周期进行严格的控制,构造,转移,销毁都是需要控制的。对于需要支持的操作,类设计者应该提供尽可能便捷和高效的支持,对于类禁止的操作,类设计者应该明确禁止,防止发生误用或者隐藏BUG。所以对于类,着重需要关注的是资源的构造,以及在多个对象间的传递和共享。容易发生问题的地方在于函数传参和返回值上,特别是层层调用的函数上,高效和安全就是必须要考虑的了,所以这就回到了前面提到的类型系统,只有对它有了比较深入的了解,才能设计出比较好的类。
模板则是类的另一方面,它和类的概念虽然是不同的,但是思路上却是相通的。模板和Java里面的泛型相似,却更加灵活和重要,是和类一样的高度。模板需要考虑的问题是,提供什么算法,什么对象可以使用这个算法,怎样避免和阻止错误对象的滥用,在使用过程中怎样尽可能利用编译错误来避免运行时错误。所以它是比类更进一步的抽象概念,对开发者有着比类更高的要求。
C++学习路线图
从上一章节,可以看出我推荐的学习路线是类型系统,到标准库,到类,最后才到模板。其他的语言细节不是说不重要,而是在学习这四大板块的同时会融入到学习过程中,没必要单独去学习和理解,毕竟细节是繁杂而且散乱的,不会增加对语言的掌握,却会打乱学习节奏,分散注意力。
类型系统的学习又可以按以下步骤进行
- 变量声明(常量和编译时常量)
- 初始化(统一初始化,赋值)
- 函数定义,函数参数定义,返回值(引用,指针的使用)
- 简单类定义,不涉及到内存管理,资源管理
标准库可以按以下步骤进行
- 智能指针(
shared_ptr
,unique_ptr
等) - 字符串
- 容器类对象(
list
,map
等)。 - 标准输入输出使用
- 线程库使用
- 通用算法(
sort
,find
等)
类可以按以下步骤进行
- 类的构造函数,移动构造,复制构造
- 类的运算符重载
- 继承
- 虚函数
- 多继承
模板可以按以下步骤进行
- 模板函数
- 模板类
- 模板递归
- 模板特化
总结
C++细节繁多,初学者容易一头扎进语法细节而不自知,最终白白浪费了大把时间不算,还严重打击了学习积极性。本篇的主旨是在帮初学者理清这门语言的主要脉络,并提供我认为比较科学的学习路线,希望对初学者有所帮助。
C++语言是一门通用型语言,有着很长的发展历史。这导致了它有着不小的历史包袱,所以在引入语言特性和怎样引入的事情上一直保持着克制。但是为了更好地服务于现代硬件和简化开发者工作,又不得不引入新特性,遗弃一些老特性。基于这种原因,语言表现出了一定的复杂性和杂乱性。但是它的核心方向是明确的,就是为了更好地解决效率和抽象问题。抓住这两个核心,再结合这份指南,先难后易,抓大放小,再加上一点归纳和总结就能很好地掌握这门语言的大部分内容。对于指南外的特性,在实际项目中需要了再学习完全是来得及的,毕竟大部分时间我们用到的特性也是很少的一部分,应该把精力花在性价比最高的部分。
标签:
推荐
- 【全球播资讯】现代C++学习指南-方向篇
- 【热闻】曝字节2023年向英伟达订购大量GPU 总价超10亿美元
- 北京所有二本大学名单(北京共有21所二本大学)
- 全球视点!6月13日晚间公告集锦:国联水产与沙特主权财富基金亚洲区签订《谅解备忘录》
- 无线传输模块推荐厂家_无线传输模块
- 河南交通力争突破10余项关键共性技术_环球新资讯
- 燕之屋原材料成本占总销售成本近八成,超一半收入源自线上
- 世界新消息丨牵线搭桥科技经理人 构筑创新创业人才高地
- 丨贵安新区高质量发展蹲点报道丨贵安新区:构建新格局 塑造新优势
- Apple在使用虚拟键盘时在visionOS上实现详细的视觉反馈方面付出了额外的努力
- 四川宜宾启动第五次全国经济普查综合试点-新动态
- 微信离线消息接收时间(微信接收离线消息)
- 环球热讯:“黑科技”又上新了,一颗小“胶囊”让心脏健康跳动12年!
- 市民在家门口就能亲近自然 太仓入选公园绿地开放共享省级试点城市
- 滨海能源新设能源科技子公司 含半导体器件专用设备制造业务
- 三星手机s5可用运存多少(三星手机S5820)
- 【天天报资讯】2023年6月13日山东省甲酸价格最新行情预测
- 尖草坪区户籍考生!免学费、教材费、住宿费!山西定向招收147人_热消息
- 名侦探柯南cos:高中生完美cos小兰,大长腿毫无违和感,神还原|环球精选
- 《期开得胜》:市场对宏观预期偏空,原油需求前景未能改善 世界百事通
- 武略高出白起、韩信,一生从无败绩,七子却遭斩首车裂的巨奸名臣 天天速讯
- 天天快报!安倍夫人就任安倍"继任者"后援会会长:为了我丈夫
- 快讯:已有34家!国家级文化产业示范园区有哪些新看点
- 每日头条!国际油价暴跌!发生了什么?重要数据,今晚出炉
- 世界即时:第四届福建高校3×3篮球赛举行
- “三夏”农忙正当时 抢收抢晒保归仓|天天速看料
- 蒙迪欧水箱位置示意图(蒙迪欧安全座椅插口在什么位置?)
- 中远海能:6月12日融券卖出13.8万股,融资融券余额3.51亿元
- 苹果手机iccid是什么意思(iccid是什么意思)|天天报道
- 杨德昭带队赴江苏开展招商引资考察活动
- 600343股票 环球热点评
- 电影截图教程(电影截图)
- 每日时讯!我的千岁寒txt下载百度云_我的千岁寒txt
- 广州放大招 剑指10万亿!
- 公司出售二手车给个人税费怎么算(个人税费怎么算)
- 九联科技最新公告:2023年员工持股计划拟募资不超3427.18万元
- 高考结束就“放飞自我”?6个生活提示助你拥有快乐假期_世界报资讯
- 西安高新区224户居民喜迁新居
- 安凯客车:聘任余刚为公司董秘 每日热文
- 理想担心的事正在小鹏、蔚来上演!销量不行就赚不到钱-全球新消息
- 连续20个交易日股价低于1元/股 *ST天润自6月13日起停牌-世界报资讯
- 世界滚动:消息称推特拒付谷歌云服务账单,或影响部分运作
- 世界微资讯!佳禾智能:公司声学方案和产品可应用于游戏娱乐,已规划和布局的AR/VR产品也可应用于游戏领域
- 气象信息为令 汉中打赢夏粮“抢收战”-全球快播
- 小拳拳捶你胸口视频_小拳拳捶你胸口
- 天仙子植物图片_天仙子|世界微头条
- 环球快资讯丨晶澳科技:预计2023年末N型电池产能将超40GW
- 青浦这家医院神似太空舱,三级专家触屏可及→_环球今热点
- 单换周琦?广东最大克星成第1“新下家”,联盟最强黑马正式崛起
- 方特文旅项目落地呼和浩特 与伊利集团达成战略合作-时快讯
- “体验茶与礼 传承茶文化”,“小观茶团”走进2023国际茶文化展_焦点热闻
- 世界通讯!日韩股市小幅高开
- 全球观天下!财产重新分割可以吗
- 苹果icloud登录页面(icloud登录页面)
- 焦点速讯:题材股是指哪些股票_题材股
- 环球今日报丨埃及央行周日发布的数据显示,该国5月年通胀率从4月的38.6%升至40.3%
- 行业首创 上海数据交易所数商服务平台上线
- 八年级上册语文课件ppt七彩课堂(八年级上册语文课件ppt)
- 天天消息!乘龙怪婿2住家赛_乘龙怪婿2
- 当前焦点!日本人拆了辆比亚迪海豹 还出了本书 定价6.7万
- 第十三双眼睛原版试听完整版(第十三双眼睛原版试听)-关注
- 世界速讯:“校内1斤3毛,校外6毛”四川一中学不让学生带书离校售卖?官方回应
- 《西行纪 燃魂》阿修罗战场战场宝典
- 耳垂上长痘痘是怎么回事碰它还很痛(耳垂上长痘痘)_全球快看点
- 力挺!小波特低迷场均7分 马龙:他不会掉出轮换 绝不质疑他_每日速递
- 今日热闻!从此闭嘴英文_闭嘴英文
- 是的英文单词怎么写(是的英文单词)_环球速看
- c15混凝土价格多少一方 c15混凝土
- 旱碱麦成“名片”迎来丰收 盐碱地特色农业开出“增收花”
- 刘亚仁涉嫌使用毒品种类追加, 新发现2种一共七种_环球焦点
- 床垫甲醛多少超标(床垫甲醛释放量国家检测标准是多少) 世界球精选
- Failed to connect to zw.gozuowen.com port 80: Timed out-世界速看
- 小学三年级童话作文写法_小学三年级童话作文
- 造梦西游3如何捉宠物(造梦西游3咋抓宠物)-世界速看料
- 怎么哄女孩子回心转意 怎么哄女孩子
- 当前短讯!14家养殖公司5月份销售生猪超1226万头 专家:头部企业产能不减行业难言见底
- 天天关注:高质量发展调研行 | 在智慧港口见证大湾区经济活力——广州南沙港走访一线见闻
- 《仙剑三》翻拍:情怀有多不值钱? 世界消息
- AMD超威卓越平台全面登陆国内式机市场:为游戏玩家和创作者提供卓越解决方案_每日关注
- 当前速递!新中式风格的设计说明(中式风格的设计说明)
- 微速讯:AI前哨 | OpenAI联合创始人Sam Altman:安全性很重要 不会很快有GPT-5
- 最美童星长大后惊艳全网!16岁时因“不够性感”被导演刷掉,她霸气怒怼:恶心的猪!
- 环球速读:经济日报刊文:如何看待一线城市的“人口信号”
- 天天日报丨中大凯丰酒店_天恒大酒店
- 世界实时:拟定的意思是什么_拟定的意思
- 今日要闻!111ttt舞曲网交谊舞曲_111ttt要听舞曲网每天都要听
- 环球资讯:丹麦男子10年访遍全球每个国家,不坐飞机,行程36万公里
- 中国移动5G无线主设备集采:超77亿大单落地,华为一骑绝尘,爱立信、诺基亚份额增长
- 特朗普再次被起诉,转头又去打高尔夫,网友:他和高尔夫是真爱 热点在线
- 全球热文:tab是什么意思英语_tab是什么意思
- 快看:梦见鱼是什么意思有什么预兆(梦见鱼是什么意思)
- 关于铁路计次票、定期票 如何购买使用
- 棒打鸳鸯专业户_棒打鸳鸯系统
- newcger官方入口(newcger)_全球头条
- 全球看点:小学心理健康工作制度(小学心理健康教育制度)
- M2新款MacBook Air 13英寸降价 史低8999
- 这个小村子为何能走出300多名大学生?|天天新动态
- 首都经济与贸易大学本科招生网(首都财经贸易大学)_环球热资讯
- 美国上市新能源车企菲斯科来华访问,计划年内进军中国市场 天天最新
- 三冠王越来越容易?皇马摇头说不,拜仁巴萨双手赞同,曼城在冲刺
X 关闭
行业规章
X 关闭