C++ 概览

      最近,一些同学忙着实习找工作,避免不了的一个难关就是笔试,而大多数企业的笔试都要求一门语言C++。虽说是学过C++的人,但总觉得认识浮浅的不行,今天突有想法重新认识C++,当然希望这种突然的想法换来的不是突然地坚持~~

      1、C++支持面向对象的程序设计、支持数据抽象、支持通用型(泛型)程序设计。

      说一个语言支持某种风格的程序设计,这是因为它提供了一些功能,使得它能够方便的(比较容易,安全,有效地)用语这种程序设计风格。如果要写那样的程序必须付出很大的努力和各种技巧,就说这门语言不支持某种技术。这样的预言是允许使用这类技术。例如:用C写面向对象的程序,不是不能做,但会出奇的苦难,因为这类语言并支持这类技术。

      “面向对象程序设计是一种程序设计的技术——对一组问题写出‘好’的程序的一种泛型。”此话出于《The C++ Programming Language》,直到读到这句话的时候,才真正的了解到什么是支持泛型程序设计。C++通常是根据问题需要定义类,用类之间的函数调用来解决问题,这就是一种程序设计泛型。

      “要支持一种泛型,不仅在于某些能直接用于该种泛型的显见形式的语言功能,还在于一些形式上更加细微的,对无意中偏离了这种泛型情况做编译或者运行时检查。类型检查是这类事物中最明显的例子。歧义性检查和运行时检查也被用作对某种泛型的语言支持。语言之外的功能,例如,库和程序设计环境,也能进一步提供对一种泛型的支持。”这段话用C++的特征来解释就是说C++不仅仅支持类定义等这些语言功能,还提供编译及运行时检查的功能以保证程序符合它的语法。

      《The C++ Programming Language》一书中对语言的好坏做了最权威的评论,“一种语言并不会因为拥有其他语言所没有的某种特征二比其他语言更好。最重要的问题不是语言究竟拥有多少特征,而在于它所拥有的特征是否足以在某个所希望的应用领域中支持某种所希望的程序设计风格”。“所有程序设计的风格都应该遵守以下原则:

      a.所有特征必须清晰而优美的集成在语言之中。

      b.必须能组合这些特征去得到一种解决方案,如果无法这样组合,那就要求额外的独立特征。

      c.应尽可能减少荒谬的和专用特征。

      d.用户只需要明确自己在写程序时用的那个语言子集。

      e.任何特征的实现都不应该给未使用这种特征的程序强加明显的额外开销。

a 原则是在美学和逻辑的要求,b和c表述最小化思想,最后两条可以总结为:你不知道的东西不会伤害你。”

笔者说设计C++就是为了要支持数据抽象,面向对象程序设计和通用型程序设计以及在这些约束下的传统的C设计技术。

     2、几种程序设计风格:过程式程序设计,模块程序设计,数据抽象,面向对象程序设计,通用型程序设计。(C++都是支持的)

     2.1 过程式程序设计 

          确定你需要哪些过程,采用你能找到的最好的算法。关注的处理过程是执行预期计算所需要的算法。支持这种泛型的语言提供的功能就是函数(给函数传参以及从函数返回结果)。算法本身通过函数调用和其他语法功能写出。为此,语言需要一些语法来规范变量和算术,循环和检测,以及指针和数组等。

     2.2 模块程序设计

          确定你需要哪些模块,将程序分为一些模块,使数据隐藏在模块中。一集相关的过程与被他们操作的数据组织在一起,通常被称为一个模块。这一泛型也被称为“数据隐藏原理”。最常见的例子是定义一个堆栈,那么需要解决的主要问题是[1]为堆栈提供用户界面接口(push()和Pop()) [2]保证堆栈的表示只能通过用户界面访问 [3]保证堆栈在使用之前已经做了初始化。C++提供了一种机制,可以把相关数据,函数等组织到一个名字空间里。那么这个数据是怎么隐藏的呢?堆栈我们可以使用数组实现,但是用户使用的只是接口push和pop,并不知道是用数组实现的。除此,C++支持“分别编译”(.h,.c,主函数可以放在不同的文件中),严格来说,分别编译不是语言要考虑的问题,而是关于如何做好的利用特定语言实现的优点的问题。模块化是几乎一切成功的大兴程序的一个最基本特征。

     2.3 数据抽象

          确定你需要哪些类型,为每个类型提供完整的一组操作。这些类型,我们可以概括为用户自定义类型,具体类型,抽象类型。抽象数据类型也就是用户自定义类型,各种算数类型,例如有理数、复数,是用户自定义类型最常见的实例。这个自定义类型大多数时候就是类(class),大部分模块表示成用户自定义类型更好一些。而抽象类型和具体类型的区别在于,抽象类型更专注于用户接口的设计,也就是这个类型不管它的数据成员,例如接口或者抽象类。

     2.4 面向对象程序设计

         确定你需要哪些类,为每个类提供完整的一组操作,利用继承去明确的表示共性。也许面向对象设计最多的工作就是设计类,并组织类的层次结构,除了语言本身提供的一些特性如:虚函数,抽象类等,这个工作已经有很多技术牛总结了经验,一些面向对象的设计模式就很好。

     2.5 通用型程序设计

         确定你需要哪些算法,将它们参数化,使它们能够对各式各样适当的类型和数据结构工作。例如我们设计一个堆栈,一开始也许设计了适合字符使用的堆栈,但后来发现我们还需要整型堆栈,解决这样的问题,C++提供了一个很好的机制——模板(template),用一个模板参数取代特定的类型。类似的,使用C++模板可以将表,向量,映射(关联数组)等都定义为模板。一个能保存某种类型的一集元素的类,一般被称为容器类,或简单的叫做容器。模板是一种编译时机制,因此,与“手工编写的代码”相比较,他们的使用并不引起任何的额外运行时开销。

      正如《The C++ Programming Language》的笔者说的那样,没有一种程序设计语言是完美无缺的,幸运的是,它们也不必是完美无缺的,也可以成为构造伟大系统的良好工具。因此,对语言特征的细节理解,甚至有关一个语言的所有特征,也不能代替对该语言以及使用它的基本技术的全局性认识。

posted on 2013-06-05 20:18  雨过晴空  阅读(306)  评论(0编辑  收藏  举报

导航