设为首页 加入收藏

TOP

现代C++学习指南-方向篇(二)
2023-07-23 13:27:38 】 浏览:59
Tags:现代 习指南 -方向篇

而对于C++20就用得更少了,更多的是示例性质的。我比较在意的是模块和协程,但是由于了解得不深入,就不详谈了。

什么是C++的基本面

从前几个章节不难看出,我着重夸了C++的类,模板,标准库,类型系统。这些都是我觉得学习C++比较重要的方面。但对于初学者来说,我觉得类型系统和标准库就足够了。

类型系统是一门语言最小的单元了,在C++中它包括类型声明,对象初始化,函数传参,函数返回值。在学习初期学多少特性都是骗人的,实际上手还是需要从这个最小的单元入手。比如声明一个变量,这个变量该是什么类型的,可以是指针吗,可以是引用吗。定义函数的时候,参数列表该怎样确定,返回值是什么,怎样才能让函数传参高效,怎样阻止和避免无用的参数检查,返回值该是什么类型,等等,这些都是在实际项目中需要直接面对的问题。所以对类型系统的学习,是写出高效可用代码的第一步,也是最重要的一步。考虑的问题越深入、全面,得到的回报就越大。

标准库则是提供了很好的算法支持和容器支持,可以帮助我们写更健壮的代码。对标准库接口的学习,一方面可以促进对类型系统的认识,另一方面也是积累好习惯的地方。

有了这两项技能的支持,我觉得已经能够写出很棒的应用程序了。但是对于库设计者来说,写出很好的库还需要对类和模板有着更深刻的理解。

一个定义良好的类需要对对象的生命周期进行严格的控制,构造,转移,销毁都是需要控制的。对于需要支持的操作,类设计者应该提供尽可能便捷和高效的支持,对于类禁止的操作,类设计者应该明确禁止,防止发生误用或者隐藏BUG。所以对于类,着重需要关注的是资源的构造,以及在多个对象间的传递和共享。容易发生问题的地方在于函数传参和返回值上,特别是层层调用的函数上,高效和安全就是必须要考虑的了,所以这就回到了前面提到的类型系统,只有对它有了比较深入的了解,才能设计出比较好的类。

模板则是类的另一方面,它和类的概念虽然是不同的,但是思路上却是相通的。模板和Java里面的泛型相似,却更加灵活和重要,是和类一样的高度。模板需要考虑的问题是,提供什么算法,什么对象可以使用这个算法,怎样避免和阻止错误对象的滥用,在使用过程中怎样尽可能利用编译错误来避免运行时错误。所以它是比类更进一步的抽象概念,对开发者有着比类更高的要求。

C++学习路线图

从上一章节,可以看出我推荐的学习路线是类型系统,到标准库,到类,最后才到模板。其他的语言细节不是说不重要,而是在学习这四大板块的同时会融入到学习过程中,没必要单独去学习和理解,毕竟细节是繁杂而且散乱的,不会增加对语言的掌握,却会打乱学习节奏,分散注意力。

类型系统的学习又可以按以下步骤进行

  • 变量声明(常量和编译时常量)
  • 初始化(统一初始化,赋值)
  • 函数定义,函数参数定义,返回值(引用,指针的使用)
  • 简单类定义,不涉及到内存管理,资源管理

标准库可以按以下步骤进行

  • 智能指针(shared_ptr,unique_ptr等)
  • 字符串
  • 容器类对象(list,map等)。
  • 标准输入输出使用
  • 线程库使用
  • 通用算法(sortfind等)

类可以按以下步骤进行

  • 类的构造函数,移动构造,复制构造
  • 类的运算符重载
  • 继承
  • 虚函数
  • 多继承

模板可以按以下步骤进行

  • 模板函数
  • 模板类
  • 模板递归
  • 模板特化

总结

C++细节繁多,初学者容易一头扎进语法细节而不自知,最终白白浪费了大把时间不算,还严重打击了学习积极性。本篇的主旨是在帮初学者理清这门语言的主要脉络,并提供我认为比较科学的学习路线,希望对初学者有所帮助。

C++语言是一门通用型语言,有着很长的发展历史。这导致了它有着不小的历史包袱,所以在引入语言特性和怎样引入的事情上一直保持着克制。但是为了更好地服务于现代硬件和简化开发者工作,又不得不引入新特性,遗弃一些老特性。基于这种原因,语言表现出了一定的复杂性和杂乱性。但是它的核心方向是明确的,就是为了更好地解决效率和抽象问题。抓住这两个核心,再结合这份指南,先难后易,抓大放小,再加上一点归纳和总结就能很好地掌握这门语言的大部分内容。对于指南外的特性,在实际项目中需要了再学习完全是来得及的,毕竟大部分时间我们用到的特性也是很少的一部分,应该把精力花在性价比最高的部分。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇动态规划 - DP 下一篇并行计算——绪论

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目