所有由java转到c++的程序员都有很多相同的疑问。
其中对我而言,非常大的疑问在于new不new的问题,与*不*。
当实例化一个对象时,
在java中,惯用的方式是
A a = new A();
而在C++中,惯用的方式是
A *a = new A;
当然也有这种方式:
A a;
区别在哪呢,当程序只有一个实例时,保存A a,不需要浪费new开辟空间。当需要多个实例时,需要A *a = new A;
之所以没有new A()是执行了默认构造函数,当然有括号也是可以的。
开始我以为A *a = new A; 与 A aObj; 的区别只在于sizeof(a)=4,而sizeof(aObj)=sizeof(A)远比指针大得多,所以选择指针而非对象。
其实更深层的在于继承中的多态![见Inside the C++]
当
class A{
public:
virtual void fun(){
std::cout<<"i am A";
}
};
class B:public A{
void fun(){
std::cout<<"i am B";
}
};
B b;
A a = b;
a.fun();
结果为i am A
而B b;
A &a=b
a.fun();
结果为i am B
当然
B b;
A *a=&b
a->fun();
结果也为i am B
所以,只有通过指针和引用才能支持多态