C++

「C++」 编程语言发展

Posted by Dawn-K's Blog on March 4, 2021

编程语言发展

发展历程

C 的发展历程

C 语言之父 丹尼斯里奇,在上世纪 70 年代早期在贝尔实验室研发了 C 语言,改进了 B 语言。后用于重写 Unix 内核。

  • 美国国家标准局 C89(ANSI C)
  • 国际化标准组织 C90(ISO C)
  • 1999 年发布的 C99

C++发展历程

1980s 年早期 , 贝尔实验室开始对 C 进行改进,加入了面向对象的特性,命名为’C with class’

1998 ANSI 和 ISO 联合发布了至今使用最为广泛的 C++ 标准,称为 C++ 98.

2011 年 C++11.

Java 发展历程

上世纪 90 年代早期,sun 公司需要一个跨平台的编程语言,运行于 JVM 虚拟机之上。最开始取名叫 oak, 后发现名字已被使用,故改名 Java. 后来从 jdk1.5 开始改名 jdk5. 因特网的发展极大推进了 Java 的繁荣,因为通过网络传输的软件最好是能在各种架构和 cpu 下运行。

C#发展历程

C# 是微软在本世纪早期发明的语言,吸收了 Java 的一些思想。运行于。NET Framework.

C 与 C++的区别

new 和 malloc 的区别

  • new 是操作符 , malloc 是函数
  • new 只能分配实例整数倍的空间,malloc 可以分配任意字节,并且 malloc 需要制定分配的字节数
  • new 分配内存后调用构造函数,delete 调用析构函数;但是 malloc 仅仅分配内存。
  • new 申请失败抛出异常,malloc 分配失败返回 Null
  • new 是类型安全的,malloc 返回 (void *)
  • new 可以被重载,malloc 可以 realloc
  • delete 一定删除数组时一定要记得delete []p;

class 与 struct 区别

  • class 封装继承多态。封装有访问控制。struct 没有继承,只有初步的封装,其内部的成员都可以被外部访问。
  • 都有构造函数
  • class 可以继承自 struct
  • 但是 c++里面的 struct, 也可以写 private, public, 也可以继承,也可以有成员函数。仅仅是默认的访问权限是 public. 在继承关系,struct 默认是 public 的,而 class 是 private.
  • class 支持模板,struct 不支持。

其他

  • C++相比 C, 增加多许多类型安全的功能,比如强制类型转换
  • C++支持范式编程,比如模板类、函数模板等

C++与 Java 的区别

  • C++创建对象之后,需要再使用完将其调用 delete 方法将其销毁;Java 有垃圾回收机制,用来监视 new 出来的所有对象,辨别不会再被引用的对象,然后释放内存空间。
  • C 和 C++会将较大作用域的变量隐藏起来,但是 Java 不允许。
  • 当变量作为类的成员使用时,Java 才确保给定默认值,以确保那些基本类型的成员变量得到初始化,但是 C++没有此功能。而对于局部变量,C++编译器会对其予以警告,Java 则会视为错误。
  • Java 不可以将一个非布尔值当做布尔值在逻辑表达式中使用,C++却可以。
  • C++引入了操作符重载机制,Java 不支持
  • Java 允许我们把任何基本数据类型转换成别的基本数据类型,除了布尔类型外。
  • Java 没有 Sizeof. C++中不同的数据类型在不同的机器上可能有不同的大小。但是 Java 中所有数据类型在所有机器中大小都是相同的。
  • C++有 goto, Java 没有 goto. Java 提供了一种类似的跳转机制:标签。
  • C++中析构函数是提供一个在对象删除前可以释放这个对象所占用的资源的机会,但是 Java 并未提供”析构函数”或者类似的概念。
  • 如果 Java 的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽其在基类中的任何版本。而 C++若要在子类中引入一个新的重载方法,则需要屏蔽基类方法。
  • C++中有多继承,Java 中只有单一继承。Java 可以通过接口实现多继承。
  • Java 是半解释和半编译的,运行速度比 C++慢。
  • Java 没有 Struct 或者 Union
  • Java 的泛型不允许使用基本数据类型。
  • 在 c++中,数组定义时,已经分配存储空间,并可以使用。(定义时指定数组大小). 在 java 中,数组定义时,int arr[], 只字义了数组变量,数组是不可以使用的。只有数组 new 以后,才会创建数组,分配存储空间,并可以使用。(定义时指定数组大小是非法的,创建时指定数组大小)
  • C++有指针,Java 没有。

.net 与 Java 的区别

.net 是一种框架,而 java 是一种语言。

BNF

巴克斯范式,一种形式化的语法表示方法,不仅能严格地表示语法规则,而且所描述的语法是与上下文无关的。 BNF 表示语法规则的方式为:

  • 非终结符用尖括号括起。
  • 每条规则的左部是一个非终结符,右部是由非终结符和终结符组成的一个符号串,中间一般以::=分开。
  • 具有相同左部的规则可以共用一个左部,各右部之间以直竖” “隔开。
  • 在双引号中的字 “word” 代表着这些字符本身。而 double_quote 用来代表双引号;
  • 在双引号外的字(有可能有下划线)代表着语法部分;
  • 尖括号 < > 内包含的为必选项;括号内部可以串联多个
  • 方括号 [ ] 内包含的为可选项;
  • 大括号 { } 内包含的为可重复 0 至无数次的项;
  • 圆括号 ( ) 内包含的所有项为一组,用来控制表达式的优先级;
  • … 表示术语符号;
  • 斜体字:参数,在其它地方有解释;