实例化一个类有两种方式:
// 假设有一个类A
// 方式一:直接定义法
A a;
// 方式二:动态内存分配法
A * a = new A();
两者有什么差别呢?
实际上,方式二即等价于如下代码:
A * a = new A();
等价于
A * a;
a = new A();
方式一就是直接将a放入栈区(局部变量,大小受限,自动释放);
方式二则是在堆区(动态内存,大小任意,手动释放)分配一块内存,然后用指针a去指向这块内存;
那么我们很容易就知道为什么要使用动态内存分配来实例化一个类。
原因:
1.可以动态的申请空间,以便动态确定对象所需要的内存;
2.便于储存大型对象,通常情况下栈区的大小容不下过于庞大的对象;
3.传递指针比传递整个对象更方便高效;(当然对于一个变量也可以取地址,但是临时变量的地址是不能长久使用的,特别是返回临时变量的地址是大忌)
4.同时传递指针可以便于大家共同维护一个空间,指针在传递的过程中,大家都可以修改指针指向的内容,当然要加锁进行保护,这样一处修改,处处修改,否则就要设置全局的变量,大家统一修改使用;
举几个生动形象的例子解释以上三条原因:
1. 每个人都要吃盐,盐不够了再去买显然比把这辈子要吃的盐一次性买下来要明智;
2. 如果你是卖盐的,储存了很多盐,你只需要建一个仓库把盐放进去,然后自己记住仓库地址即可,而不需要把盐全部放在自己的家中;
3. 如果要去很远的地方谈卖盐的生意,只需要选一些有代表性的信息(地址)给对方就可以了,不需要把整个仓库搬过去给对方看。
4.比如a,b,c三个人一起卖盐,然后都知道仓库的地址,然后A卖的时候,知道地址就可以把盐取走,仓库里的盐变少了,这样b和c的仓库都被修改了,这样就达到了一个一处修改,处处修改,如果不是指针,而是给三个人都有一个全量的仓库,那么一个修改,另外两个不会修改。想到达统一,就得一个人修改,后再通知另外两个盐变少了多少。