case1
Java:
class A {
public A() {
System.out.println("A~~~~~~~~~~~~~~~~~~~~~~~");
}
}
class B {
public B() {
System.out.println("B~~~~~~~~~~~~~~~~~~~~~~~");
}
A a;
}
C++:
class A{
public:
A(){
cout<<"A~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
};
class B{
public:
B(){
cout<<"B~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
A a;
};
C++输出为:
A~~~~~~~~~~~~~~~~~~~~~~~
B~~~~~~~~~~~~~~~~~~~~~~~
Java输出为:
B~~~~~~~~~~~~~~~~~~~~~~~
这个例子体现了C++在Java的细节差异:
Java:
- 在Java中primitive types为值语义,
- 非class 对象都是对象语义/引用语义,Java只能通过以下方式进行实例化
- new
- 使用反射,newInstance
- 对象的clone方法
- 某些类提供的工厂方法或通过反序列化等
而显然上面的代码中a并没有实例化,只是个空指针。
C++:
上面代码对Java来说答案非常简单,对C++代码很多人第一直觉B的构造函数没有什么特别,只是打印B,那为什么会输出A的信息呢?
原因是此时如果类有多个成员变量,那么构造函数会按照成员变量声明的顺序来调用成员变量的默认构造函数。
case2
Java:
class A {
public A() {
System.out.println("A~~~~~~~~~~~~~~~~~~~~~~~");
}
}
class B extends A{
public B() {
//super(); 不显示写super(),也会调用父类构造
System.out.println("B~~~~~~~~~~~~~~~~~~~~~~~");
}
}
C++:
class A{
public:
A(){
cout<<"A~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
};
class B : A{
public:
B(){
cout<<"B~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
};
在继承链上的构造函数,C++与Java的表现都是一样的,都是先构造父类,然后构造子类。
case3
委托构造,在C++11前构造函数不能相互调用,而在C++11中提供了委托构造(构造函数可以调用其他构造函数)的支持。在Java天然提供支持
Java:
class B extends A{
public B() {
System.out.println("B~~~~~~~~~~~~~~~~~~~~~~~");
}
public B(int x) {
this();
System.out.println(x);
}
}
C++:
class B:A{
public:
B(){
cout<<"B~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
B(int x) : B(){
cout<<x<<endl;
}
};
WalkeR_ZG