[C++] 基础知识之1、C++和C的区别

来源:互联网 发布:java点击标签监听 编辑:程序博客网 时间:2024/04/29 20:07

C++和C的区别

  本文从设计哲学、语言特性和使用场景三个层面总结了C和C++的区别和联系,目的是通过对比加深对两种语言的理解。在整理过程中融合了网络上相关帖子的内容,在此表示感谢。

设计哲学

  C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。用C来解决问题,总是将大的过程分解成小的阶段或者小的过程,把各阶段或小的过程结果汇总,最后将问题解决。就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了?其实不是,算法是程序设计的基础,好的设计如果没有好的算法一样不行。而且“C加上好的设计”也能写出非常好的东西。例如目前最著名、最有影响、应用最广泛的windows、Linux和UNIX三个操作系统都是用C语言编写的。OS是计算机系统(由软硬件两个子系统构成)的核心和灵魂,是最庞大最复杂的系统软件。既然如此庞大复杂的OS都可以用C语言编写,从狭义而言,还有什么系统软件和应用软件不能用C语言编写呢??此外,C语言的发展还贯穿了计算机发展的历程,它蕴含了程序设计的基本思想,囊括了程序设计的基本概念。由此可以肯定的说,C语言是一门十分优秀而又重要的语言。

  与C语言不同,C++首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。所以C和C++的最大区别在于它们用于解决问题的思想方法不一样。举个例子:比如你想做一个模型飞机,利用“面向过程”的思想,你所想的就是,先做头再做身体,再做尾巴,它是一个比较顺着的概念。而如果利用“面向对象”的思想,你所想的就是,你要做飞机的话,它有翅膀,头部,身体,尾巴等各个部件,你先把各个部分做好,再考虑他们的直接的接口怎么连。这就是面向过程和面向对象的区别。

语言特性

  由于C++兼容了大部分C语言的功能,所以这里主要列举C++相比于C语言支持的新特性:

  • 支持函数重载:C语言对变量类型最为敏感,不支持函数重载。而C++语言支持函数重载。但是由于参数有类型提升和隐式转换的需求(例如可以将short提升为int,将int提升为long或者double等),所以C++还定义了一套复杂的规则来实现数据类型的显示和隐式转换(C++ Primer中有详细介绍)。
  • 支持操作符重载:操作符重载也是C++的典型高级应用,和函数重载有类似的地方,可以让代码更加简洁和通俗易懂。C++中只有五个操作符不支持重载:.(成员访问运算符),.(成员指针访问运算符),::(域运算符),sizeof(长度运算符)和?:(条件运算符*),其余运算符理论上都可以被重载,感觉特别不可思议。
  • 支持内联函数:由于内联函数直接在编译阶段就将代码展开,所以其实是以代码膨胀的代价来减少了函数调用的代价。这对于实现简单且调用频繁的函数而言比较有优势。
  • 支持const:让常数性成为与类型不可分割的一部分,除了提升安全,让编译器承担检查的责任之外,也有助于代码的优化。
  • 支持引用(reference):简化指针的语法,并有效减少指针的使用。
  • 支持流操作符:流操作符使得C++的IO变得统一,并且可以提供更为强大的功能。
  • 支持类和面向对象编程(OOP):这是C++相比于C最大的区别。由于支持类,所以C++中就有了数据封装、继承、多态、虚函数等概念(后面章节中会详细介绍)。由于支持面向对象,所以利用C++就可以很好地在软件系统设计中采用设计模式,从软件工程学的角度来提高系统的可扩展性和代码的可复用性。不过由于C++同时支持面向过程,所以严格意义上来讲它并非完全的面向对象(相比而言Java才是真正意义上的完全面向对象)。
  • 支持模板和通用编程(GP):个人认为这是C++除了类之外和C最大的区别和进步了。由于模板可以在一定程度上将程序设计和实现中的算法和数据分离,所以相比于C,C++也就更具有“设计”的概念。
  • 支持RAII:RAII(resource acquisition is initialization)即资源获取即初始化(在栈空间中)。这种特性比较独特,在C/C#/Java中都没有相应功能。

除此之外,C++相比于C还有如下特点:

  • 更严格的类型检查系统:包括异常处理、RTTI(run-time type identification)等。
  • 更丰富的标准库:C 语言也有标准的函数库,但它们是松散的,只是把功能相同的函数放在一个头文件中;而 C++ 对于大多数的函数都是集成的很紧密。尤其是当STL被C++标准委员会吸纳为标准之后,C++标准库的丰富程度大大提高了。
  • 更强大的结构定义:C 和 C++ 中都有结构的概念,但是两者有如下三个方面的区别:1)在 C 语言中结构只有成员变量,而没成员方法,而在 C++ 中结构中,它可以有自己的成员变量和成员函数;2)在 C 语言中结构的成员是公共的,而在C++中允许定义public, protected和private三种级别的访问权限;3)C中的结构体不可以继承,而C++的结构体可以被继承。

虽然C++相比于C语言有了不少扩展,但C作为C++的一个自洽子集,侧重于面向过程,也有强大的功能,具有不可替代性。

使用场景

  C语言作为一种结构化编程语言,层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力也极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构,还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本 的C语言。

  C++是在C的基础上改进后的一种编程语言,主要是增添了许多新的功能。由于兼容了C,所以和C一样可以用于计算机底层操作。所有C可以实现的复杂工程,都可以用C++实现,甚至包括操作系统内核。C++对于指令、内存的操作能力是从C继承过来的,所以要求精确到汇编级的程序可以也可以用C++开发。另外因为C++具有面向对象的能力,所以C++还可以以脚本语言的形式开发大型复杂工程。最后,由于C++语言同时兼具面向过程的优点(速度快)和面向对象的优点(便于维护和扩展),所以在对运算效率要求较高的大型软件系统开发中,C++往往成为首选(例如Matlab以及各种工程模拟和仿真软件等)。

0 0
原创粉丝点击