将C++ 看作多种语言的联合体

起初, C++ 仅仅是增补了面向对象特性的 C 语言。甚至 C++ 原始的名称都叫做“使用类的C 语言,这可以很明显地反映出这一继承关系。

随着 C++ 逐渐成熟,它变得更加丰富多彩,更加大胆前卫,它开始采纳一些与使用类的 C 语言”不同的编程策略。在构建函数时为达到不同目标, C++ 的发明者为其添加了异常处理机制;模板为设计思想注入了新的活力;同时, STL 使 C++ 达到了前所未有的可扩展度。

现在的 C++ 是一门多范型编程语言,它包含面向过程、面向对象、函数式编程、泛型、元编程等等特征。 C++ 的强大和灵活几乎是无可比拟的,但这也会造成一些紊乱。所有的 “恰当的用法”的准则似乎都存在例外。那么我们如何恰当的理解它呢?

最简单的办法就是把 C++ 看作一个有若干门语言组成的联合体,而不是一门单独的语言。在一个特定的子语言中,规则就显得简单、直接,而且不易忘记。当更换到另一门子语言时,规则就相应地改变了。为了理解 C++ ,必须认清 C++ 主要的子语言。幸运的是,主要的子语言只有四门:

#C 。尽管变革是深刻的, C++ 仍然基于 C 语言。程序块、语句、预处理器、内建数据类型、数组、指针,等等。所有都来自于 C 。在许多情况下, C++ 可以比 C 更优雅地完成一些任务(预处理器的替代方法和使用对象管理资源),但是当我们发现正在使用C++ 中的C” 这一部分编写程序时,高效编程原则就会反映出 C 语言的局限:没有模板、没有异常处理、没有重载,等等。

#面向对象的 C++ 。这一部分的 C++ 就是 使用类的 C 语言 的一切:类(包括构造器和析构器)、封装、继承、多态、虚函数(动态绑定),等等。这一部分的 C++ 是面向对象设计最为直接的应用,即类的规则。

#包含模板的 C++ 。这是 C++ 中泛型编程的一部分,大多数程序员在泛型编程领域涉足甚浅。模板的概念对 C++ 产生了深远的影响。模板如此之强大,它足以为我们带来了一个全新的编程范型:模板元编程 (template meta-programming, 简称 TMP) 。但是除非对模板到了痴迷的地步,大可不必投入过多精力。主流 C++ 编程很少涉及到 TMP 规则。

#STL 。显然地, STL 是一个模板库,但是它是一个非常特别的模板库。它的约定使得容器、迭代器、算法、函数对象完美地协同工作,当然模板和库也可以基于其它的理念来构建。 STL 有自己独特的解决问题的方法,当我们使用 STL 编程时,必须要遵循它的约定。

 

时刻地对这四门子语言保持头脑清醒,当高效规则要求我们必须要更改策略,从而必须更改到另一门子语言时,不要大惊小怪。比如说,对内建(比如类似 C 语言的)类型而言,传值要比通过引用传递更高效,但是当我们从C++ 中的C” 迁移到“面向对象的 C++ 后,构造器和析构器的存在就意味着通过引用传递给一个 const 常量会更好。在使用“包含模板的 C++”时通常都是这样的状况,因为我们也许根本就不知道当前正在处理的对象的类型。然而当开始使用 STL 时,迭代器和函数对象都是模仿 C 语言中指针的机制,在 STL 的迭代器和函数对象上, C 语言的传值规则又再次奏效了。

 

C++ 并不是一门单一的编程语言,它不仅仅拥有一套单一的规则,而是四门子语言的联合体,每门子语言都有自己的惯例。时刻清醒地分辨这四门子语言,你会发现 C++ 并没有那么难。

 

需要记住的

C++ 的高效编程规则根据我们正在使用的 C++ 的那一部分而改变。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值