Java 与 C++ 异同
之前接触Java比较多,现在公司做c++开发,虽然都是面向对象编程,但是之间还是有很大的差别,在这里我借鉴一位同事整理的和加上我自己整理,做一下总结笔记,避免以后踩一些不必要的坑。
指针和引用
最显著的不同应该就集中在这两个点上了,Java里既没有明确的指针和引用,不过Java里的对象使用时类似指针。
C++指针和引用具体的不多讲,简单提一下指针是一个变量,储存的是值的地址而不是值本身。
引用是目标变量的另一个名字,对引用的操作等同于对变量的操作。
int n = 5;
int *foo = &n; // &作为地址运算符
int &bar = n; // &类似类型标识符
基本数据类型
Java是一种强类型语言,只有8中基本类型,四种整形byte,short,int,long,两种浮点型double和float,字符型char以及布尔型boolean。
C++类型相对更多就不一一列举,同时还有unsigned关键字等。掌握起来比Java更花时间。但整体上分为算术类型和空类型,在算术类型下下分整形与浮点型,其中整形包括整形,字符型和布尔型。
数组
这个相对来说知识性不那么强但是自己错的太多到现在还偶尔会错所以记一下
Java:
int[] foo = new int[10];
c++:
int foo[10];
int *foo = new foo[10];
String
Java里String是内置的,被final修饰不可变。C++里没有内置string,std::string是可变的,类似Java里的StringBuffer。顺带说下,Java里String是object所以不能用==来比较。
函数
Java所有的函数必须在一个类内部,c++可以有全局的函数或者namespace里的函数。同时,Java要求函数内本地变量强制初始化。
C++函数和C一样有先声明再定义,没有引入头文件的情况下要注意函数的位置或者提前声明。在引入头文件时修改函数时不要忘了修改头文件里的声明,能省些编译失败重复编译的时间。
虚函数
虚函数可以被子类继承和覆盖,通常使用动态调度实现,是实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数。虚函数通过关键字virtual实现。
virtual int foo() {}
在Java中没有虚函数的概念,所有函数默认虚函数,防重载使用final关键字
public final int foo(){}
在这里提个不相干的,在c++里有const修饰函数的时候,和这里Java中final的用法不一样,自己也是犯了几次这种错误。
const int foo() const {}
第一个const是修饰返回值的第二个const是表示方法本身不修改类的成员变量。
对象
之前提过Java的对象类似C++的指针,Java的对象本身储存在JVM的堆中。C++的堆一般由程序员分配释放,通过new或者malloc()等函数与运算符。所以
Java:
Foo foo = new Foo(); // 总是在堆中声明
C++:
Foo foo; // 作为本地变量存在栈中
Foo *foo = new Foo; // 作为对象存在堆中
delete
Java中没有delete操作符,靠GC(垃圾回收器)来释放内存。
C++可以通过delete或者delete[]来提前释放内存。
析构函数
Java中没有一个明确的析构函数,Java在GC准备释放内存时会调用finalize(),但finalize()不是析构函数,只有JVM在内存使用达到一定值之后进行垃圾回收时才会触发。
C++中的析构函数则是当一个对象结束其生命周期时调用。它不带参数且没有返回值,可以帮助程序提前释放资源。其中调用条件包括:对象被delete掉;本地对象超出其作用域;临时对象生命周期结束等。
class String
{
private:
char *s;
int size;
public:
String(char *); // constructor
~String(); // destructor
};
String::String(char *c)
{
size = strlen(c);
s = new char[size+1];
strcpy(s,c);
}
String::~String()
{
delete []s;
}
抽象类
因为没有abstract关键字,最开始以为c++没有抽象的概念。在c++中,抽象类只要包含至少一个纯虚函数即可。
class aircraft
{
void refuel(); // 加燃油,普通虚函数
void fly()=0; // 飞行,纯虚函数
};
class Bar {
public:
virtual void foo() = 0;
};
Java可以再语法上声明抽象类或者接口
abstract class Bar {
public abstract void foo();
}
interface Bar {
public void foo();
}
protected
在Java中,protected对子类和同一个package中其他类可见,在C++中只对子类可见。
迭代器
C++和Java迭代器从声明上看起来类似,使用起来区别却比较大。
C++迭代器是类的成员,从FOO.begin()开始,到FOO.end()为止,用++操作符递增。
vector myVec;
for ( vector
itr != myVec.end();
++itr )
{
cout << *itr;
}
Java迭代器是一个接口,必须使用hasNext()来检查下一元素,使用next()来递增。
List myArrayList = new ArrayList();
Iterator itr = myArrayList.iterator();
while (itr.hasNext()) {
System.out.println( itr.next() );
}
以上是这两个月来在对C++学习的过程中总结出的和Java的异同,发出来避免自己再因为语言特性的混淆而再犯类似的错误,后面如果不幸遇到新的问题会持续更新。希望大家不要和我踩进一样的坑里。