C++ vs. Java
1. main函数
- Java中main函数必须是public和static, 并且不需要返回值
- C++不需要main函数在类中定义为public或static, 但需要返回值
2. 类型大小
- Java的int整型大小与目标机器或操作系统无关. int为4字节, short为2字节, float为4字节, double为8字节
- C++的int大小与目标机器或操作系统有关, 但int必须大于或等于short大小(>=4字节)
3. bool类型的隐式转换
- Java中不允许其他类型转换为boolean值
boolean x=true;
if(x==0){ /* error, cannot convert int to boolean */
// ...
} - C++中允许整数类型转为bool值
4. 未初始化操作
- Java中不区分变量的声明与定义, 所以一个未初始化的变量不能输出或作为右值
- C++中区分声明与定义, 可以输出或赋值未初始化的变量
5. >>操作
- Java中>>使用符号位填充高位(算数移位)
- C++中>>不确定为算数移位(符号位填充高位)还是逻辑移位(0填充高位)
6. 逗号运算符
- Java不支持逗号运算符
- C++的逗号运算符可支持多表达式顺序执行, 运算优先级最低
7. String
- Java将String定义为不可变对象, 这样就可使得多个相同内容的字符串共享一个对象, 但代价就是修改字符串操作变得复杂. String并没有重载==操作符, 所以判断两个String是否相等要通过equals函数实现.
- C++的std::string为可变字符串, 支持修改. 两个std::string可用==判断是否相等, 因为std::string已经重载了==操作符.
8. 嵌套定义
- Java中不可在嵌套块中重定义一个变量
- C++允许在嵌套块中重定义一个变量
9. 运算符重载
- Java重载了部分类型的运算符(例如String), 但没有给程序员重载运算符的权利
- C++给程序员重载运算符的权利
10. 命令行参数
- Java只保存了运行文件后的所有参数
- C++在第一位(args[0])保存了运行文件的名称, 和之后的参数
11. new
- Java中所有类对象只能在堆上生成(也就是说, 只能通过new来生成对象)
- C++可在堆和栈上生成类对象, 例如:
Object x(1); // Java无法这样创建一个类对象
Object x = new Object(1);
12. 函数定义
- Java不能在类外定义函数体, 函数是否inline取决于JVM的决定
- C++可在类外定义函数体, 且如果在类内定义函数, 则直接视为inline函数
13. 方法参数
- Java的方法传递的都是参数
- C++可用值传递或引用传递
14. 类继承
- Java使用extends来表示继承关系, 且只有公有继承
- C++使用:表示继承关系, 且有三种继承方式(public, protected, private)
15. 调用父类/超类的关键字
- Java使用"super"来调用超类的成员
- C++使用"父类名+::"的方式来调用父类的成员(调用父类的构造函数除外)
16. 虚函数
- Java没有vitrual关键字, 每个类成员函数都具有多态性, 运行时会自动地调用类方法
- C++使用virtual来指明那些成员函数具有多态性
17. 多继承
- Java不支持多继承(因此不需要virtual继承), 单可使用final关键字阻止子类覆盖父类
- C++支持多继承, 但没有机制来实现子类覆盖父类
18. 抽象函数/抽象类
- Java支持抽象类, 只要在class和function处声明abstract关键字
abstract class Person{
publi abstract String getDescription();
} - C++支持抽象类, 但不需要在class上声明, 只需要在虚函数尾部用**=0**标记
class Person{
public:
virtual string getDescription()=0;
}
19. protected
- Java中受保护部分为本包和所有子类, 安全性更差
- C++中受保护部分为本类和所有子类
20. Vector
- Java中的ArrayList, 但ArrayList没有重载**[]**, 并且进行赋值操作时传递的是引用 (两个ArrayList指向的是同一个实体)
- C++中vector重载了**[]**, 但赋值操作时进行的是值传递 (两个vector互不影响)
21. getClass()
getClass()返回当前运行时的类对象的Class, getSuperclass返回父类的Class
package test; |
22. 二维数组申请
C++固定[]必须在数组变量名后, 且第二个[]必须写明数字
// int a[3][] = {1,2,3,4,5,6}; // error |
Java不规定[]的位置, 但第一个[]必须有数字
float f[][] = new float[6][6]; |
23. 数组长度
- C++中声明数组时必须说明数组长度
int a[50];
// int a[]; // error - Java中声明数组不能说明数组长度, 只有实例化对象时才能给定数组长度
String a[];
// String a[50]; // error
24. 函数重载
C++和Java的重载定义相同:
- 方法名称相同, 参数个数, 次序或类型不同
- 返回值类型与重载无关