在c++的类中,我如果要访问类中的成员变量或函数,有2种方法,第一种就是定义一个一个对象,如:
Class A ...
A aa;
aa.xxx();
另外一种就是
Class B ...
B *aa = new B();
aa->xxx();
这两种方法在使用上不知有没有什么区别,或是什么情况下用指针对象,什么情况下用普通对象? 收起
Class A ...
A aa;
aa.xxx();
另外一种就是
Class B ...
B *aa = new B();
aa->xxx();
这两种方法在使用上不知有没有什么区别,或是什么情况下用指针对象,什么情况下用普通对象? 收起
用指针对象,用完之后需要释放内存空间
最佳答案
你提的问题很好,这个就是c++和java之间的区别,c++函数可以不写在类里面,这样就产生了全局变量定义,文件#include等,在java中,A a = new A() c++中等同于 A a; 另外在c++中还有另外一中声明和实例化就是使用指针,如:A* a= new A() c++中的A a;就已经构造了对象; 而在java中 A a; 就是声明,还没有分配空间,在c++中就非常的灵活, A a;在栈(stack)上分配空间,A * a= new A;在堆(heap)上分配空间 栈上空间自动回收,堆空间需要程序员手动回收
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
这个本质上是对象分配区域的问题,前者是在栈(stack)上分配空间,后者是在堆(heap)上分配空间。
栈上分配空间的好处是快,而且对象生存期是自动的,离开当前域之后就自动析构回收。坏处就是栈空间有限,而且不能人为控制对象的生存期,比如你无法将一个函数内部的栈上的对象返回,因为这个函数执行完毕后栈空间会自动回收。
堆上分配空间就相反,new一个空间出来是很慢的,而且对堆上对象的访问也稍慢于栈上。一旦new一个空间出来,需要自己手动去delete回收,系统不会帮你管理回收(用GC的除外),但是分配空间大小灵活,而且正因为是手动回收的,你可以自由控制对象生存期,常用来跨域传递对象。