在c++的类中,我若是要访问类中的成员变量或函数,有2种方法,第一种就是定义一个一个对象,如:java
Class A ... A aa; aa.xxx();
另一种就是c++
Class B ... B *aa = new B(); aa->xxx();
在java中,A a = new A();
等同于c++中的 A a;
程序员
另外在c++中还有另一种声明和实例化就是使用指针,如:A* a= new A();
,在Java中没有对应的形式,最重要的缘由是C++中的这种声明形式的内存是须要程序员手动管理的,可是Java有内存回收机制,不须要程序员关心对象的内存的问题。segmentfault
上面是从内存回收的角度看,这时候:在java中,A a = new A();
等同于c++中的 A a;
函数
可是假如从建立对象的时间来看:在java中,A a = new A();
也能够当作等同于c++中的 A *a = New A();
指针
c++中的A a
;就已经构造了对象。可是在java中 A a
; 就只是声明,可是尚未分配空间,java中的A a = new A()
才是分配了内存的。而C++中的A *a;
也只是声明了一个指针,可是尚未分配指针,a = new A();
才是建立了一个实体,而且另指针a指向这个实体的内存地址!code
再说说Delphi,假若有一个类ClassA,而后声明一个对象,代码大概以下:对象
var ObjectA: ClassA; //这里只是声明了一个变量名,Delphi中变量名其实就是一个指针,此时并无分配空间 begin ObjectA:= ClassA.Create; //这里才是建立了一个内存实体,分配了内存空间,而且令ObjectA指向这块内存地址 //注意这里的语法格式不一样于C++的ClassA *ObjectA = new ClassA(); //也不一样于Java的ClassA ObjectA = new ClassA(); //注意区别三者的语法格式的不一样 end;
在Delphi的面向对象的语法中,要注意理解Delphi对象名与对象实体的本质区别,一个Delphi的对象的对象名其实本质上就是一个指针,指向内存中的对象实体。内存
在C++中就很是的灵活,A a;是在栈(stack)上分配空间,是静态的。而A * a= new A;是在堆(heap)上分配空间,是动态的。栈上空间自动回收,堆空间须要程序员手动回收get
静态分配内存适合于编译时就已经能够肯定须要占用内存多少的状况,而在编译时不能肯定内存需求量时可以使用动态分配内存;但静态分配内存的运行效率要比动态分配内存的效率要高,由于动态内存分配与释放须要额外的开销;动态内存管理水平严重依赖于程序员的水平,若是处理不当容易形成内存泄漏。
动、静态内存分配比较能够知道动态内存分配相对于静态内存分配的特色:
1)不须要预先分配存储空间;
2)分配的空间能够根据程序的须要扩大或缩小。
对于C++语言:
A a =new A(); //会报错 A *a=new A(); //这样是对的
详细说明缘由:
//只能是 A a; //或者是 A *a = new A(); //没有 A a = new A(); //这个是Java中的语法,因此要区分C++和Java的语法和机制
若是用A* a = new A();声明了对象
a.run(); //会报错 a->run(); //这才是正确的语法