写在前面的话
本系列博客主要翻译自《C++ for Java Programmers》,本人是个对Java有些了解,但对C++几乎一无所知的人。我也是在边翻译边学习C++,不免会出现一些错误,希望大家不吝指正!
组织
- 第0章,C++概览。
- 第1章,C++中的基本表示式和语句,与Java中类似。
- 第2章,函数、数组、字符串、参数传递
- 第3章,介绍指针和引用变量,着重介绍C++程序员会遇到的指针陷阱。
- 第4章,介绍基本的类。
- 第5章,操作符重载(java中没有)
- 第6章,继承
- 第7章,模板(java中没有)
- 第8章,异常
- 第9章,I/O
- 第10章,标准模板库
- 第11章,基础数组和字符串
- 第12章,C style C++
- 第13章,JNI
前言
从语法上看,C++和Java是相似的。Java中的很多基本结构例如基本表达式、条件、循环是完全相同的,除了一些细微的技术细节。因为每个新的保留字都会破坏现有的语言,所以C++社区宁愿过度使用现有的关键字如const
和static
也不愿增加新的保留字。因此,在Java中有throw
和throws
,而在C++中抛出一个异常和列出一组异常都使用throw
。
没有运行时边界检测,没有动态分配,没有GC。
C++在不断地进化。第一个广泛使用的版本支持类和继承。之后加入了模板。在这以后才加入异常。
High Level Differences
- 编译型vs.解释性
Java包含一个编译器和一个虚拟机。编译器生成Java字节码,然后字节码在运行时解释执行。因此,不仅Java源码是可移植的,理论上编译后的字节码也是可移植的并且可以在任何平台上运行。
另一方面,C++编译器生成本地代码。C++语言规范并未对本地代码做出规定,所以编译后的代码不仅在不同类型的机器间不可移植,由同一台机器的不同编译器生成的程序相互间也是不兼容的。 安全性和鲁棒性
Java非常关心代码编译,不允许不安全的代码通过编译,并且一遇到错误就会抛出异常。而C++在这方面表现欠缺。C++存在很多在纯Java中永远不会出现的问题。突出的四点如下:- 存在一个指向已回收堆内存的指针或引用。
- 不进行数组索引检测。
- C++的类型转换允许类型冲突
- 在Java中,所有变量在使用前必须赋值。
多线程
C++并没有把多线程作为语言的一部分去实现。相反,程序员必须使用平台特定例程库。
使用C++的10个理由
- C++ 仍被广泛使用
- 模板
- 操作符重载
- 标准模板库
与JavaCollections
的API相比,C++的STL具有一些优越性。 - 资源的自动回收
尽管Java提供GC,这是一个出色的特性,但是很难对其他的资源管理进行控制。例如Java程序员必须记住在及时关掉文件和数据库链接。在C++中,每个类需要提供一个特殊的方法,成为destructor
,当对象不处于活跃态时被自动调用。 - 条件编译
在C++中,程序员可以编写一些只有满足特定条件才会编译的程序。这可以通过预处理器来实现。 - Accessor 和 Mutator的区别
在Java中,当把引用变量标记成final
时,意味着该引用变量不能被修改。标记变量所引用的对象不能被修改并不容易。C++提供语法支持来区别accessors和mutators,当把对象标记成const
时,仅能对该对象进行访问。 - 多继承实现
Java不支持多继承,因为众所周知使用多继承很麻烦。但是,有时使用多继承非常有用。 - 空间效率
- 私有继承
Java仅支持共有继承,这通过使用extends
语句来实现。C++支持私有继承,这在改变接口可见性以及实现适配器模式时是有用的。