设为首页 加入收藏

TOP

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

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_ptrshared_ptr来协助资源管理。同时为了更出色的性能,引入了右值引用和移动语义。右值引用和移动语义听起来很高端,实际上就是解决一个问题,避免大对象的反复销创建和销毁,转而使用代价更低的移动。根本思路就是两条,对于直接量提供了右值引用,以增加它的生存时间,使之可以像普通变量一样通过参数传递。而对于变量来说,提供了移动语义,将不再需要使用的对象管理的资源转移到另一个对想象中。同时增加了移动构造,复制构造方式来优化函数的返回值。可谓是榨干了计算机的每一寸内存。

C++11无疑是C++里程碑式的更新,在对历史遗留问题清理的同时,引领了接下来C++的发展方向,它的作用是承上启下的。对类型系统的改进无疑弥补了最开始从C继承来的一些缺陷。同时也充分考虑了现代计算机的发展,引入了线程支持。在内存管理上也是更上一层楼,引入了智能指针,移动语义,右值引用。它基本上抛开了历史束缚,但依旧是不忘使命,依旧是奔着更好的静态类型支持,更多的自主性,更高效的资源管理,更克制的特性支持来展开的

C++17,20——新生

C++17和C++20应该是相辅相成的,绝大部分特性都已经得到支持和完善了。但是由于编译器的限制,我用的特性比较少。C++17比较期待的是跨平台的文件系统支持,这对于大部分应用开发者来说无疑是激动和喜悦的。另一个我喜欢的特性是结构化绑定,这个特性我在Python里面用得很顺手,当然现在基本上所有现代语言都支持它了。

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

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目