|
|
Java和C++的几点不同之处 |
|
|
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站 |
1. Java的构造函数可以调用另一个构造函数,如 class A { public A() { this(0); } public A(int i) { ... } } 而C++的构造函数不能调用另一个构造函数,如 class A { public: A() { A(0); } //构造了A的临时对象 A(int i) { ... } }; 这是一个有用的功能,不过C++中因为有默认参数,对这个功能的需求减少了。如果确实几个构造函数有相同的代码,那可以把那段代码放在一个private的init(...)中,供各个构造函数调用。
2. Java的public和protected函数是虚拟函数(借用C++的说法)可以override,而private函数则不是虚拟函数;而C++的private函数也可以是虚拟的。 Java: class A { public void g() { f(); } private void f() { System.out.println("In A's f"); } }; public class B extends A { private void f() { System.out.println("In B's f"); }
public static void main(String args[]) { B b = new B(); b.g();//print "In A's f"
C++: class A { public: void g() { f(); } private: virtual void f() { cout << "In A's f" << endl; } }; class B : public A { public: void f() { cout << "In B's f" << endl; } }; int main() { B b; b.g();//print "In B's f" }
3. Java的构造函数调用虚拟函数时,保留了虚拟函数的含义,即调用了子类override的函数版本,而C++的构造函数调用虚拟函数时不会去调用子类override的函数版本。 Java: class A { public A() { f(); } protected void f() { System.out.println("In A's f"); } } class B extends A { protected void f() { System.out.println("In B's f"); } static void main(String args[]) { B b = new B(); // print "In B's f" } }
C++: class A { public: A() { f(); } protected: virtual void f() { cout << "In A's f" << endl; } }; class B : public A { protected: virtual void f() { cout << "In B's f" << endl; } };
int main() { B b;//print "In A's f" } 在这一点上,C++设计的比Java要好,因为在父类的构造函数中调用子类的方法时,子类还没有完全构造起来,这可能会出错。
4. C++的override要比Java宽松一点,子类中override的函数返回值的类型(指针或引用)可以是父类对应函数返回值类型的子类,如: class C { }; class D : public C { };
class A { public: virtual C* f() { cout << "In A" << endl; return 0; } }; class B : public A { public: D* f() { cout << "In B" << endl; return 0; } };
int main() { A *a = new B(); a->f(); // print "In B" }
而在Java中,子类方法的返回值必须和override的父类方法的返回值一样,如以下代码编译出错: class C { }
class D extends C { }
class A { public C f() { return null; } } class B extends A { public D f() { return null; } }
错误信息: f() in B cannot override f() in A; attempting to use incompatible return type found : D required: C

|
|
相关文章:相关软件: |
|