C++的实例化跟Java和C#的不一样,Java和C#的实例化都是直接用new或getInstance()实现。但是C++使用new是返回一个指针。
class Base{
public:
Base(){}
Base(int i){}
void func(){}
private:
};
Base* p=new Base();
Base b1; //ok
Base b2(1); //ok
Base b3(); //error,不需要括号
Base b3=new Base(); //error,返回的是指针
//调用函数
b1.func(); //ok
p->func(); //ok
(*p).func(); //ok
b1->func(); //error
p.func(); //error
经由指针调用函数和实例化对象来调用函数有什么差别呢?
指针是动态完成调用函数,即是,首先得看该函数是不是虚函数,若是虚函数,就调用它指向对象的函数;如果不是虚函数,就调用该类型的函数。
而实例化对象时不管是不是虚函数,都是调用该类型的函数
//假设两个类,一个A,一个B,B是A的子类,A有两个函数 virtualfunc()
//和nonvirtualfunc().B重写了这两个类
A* P;
A a;
B b;
a.virtualfunc(); //调用A::virtualfunc()
a.nonvirtualfunc(); //调用A::nonvirtualfunc()
b.virtualfunc(); //调用B::virtualfunc()
b.nonvirtualfunc(); //调用B::nonvirtualfunc()
p=&a;
p->virtualfunc(); //调用A::virtualfunc(),虚函数调用指向的对象
p->nonvirtualfunc(); //调用A::nonvirtualfunc(),有指针类型决定
p=&b;
p->virtualfunc(); //调用B::virtualfunc(),虚函数调用指向的对象
p->nonvirtualfunc(); //调用B::nonvirtualfunc(),有指针类型决定