C++ PRIMER里面曾经说到,类的初始化列表是很多资深C++程序员都无法熟练运用的一个好方法。。。
关于两种生成对象的方法,我发一个自己的总结:
(1)在c++的类中,我如果要访问类中的成员变量或函数,有2种方法,第一种就是定义一个一个对象,如:
Class A ...
A aa;
aa.xxx();
另外一种就是
Class B ...
B *aa = new B();
aa->xxx();
(2)在java中,A a = new A()
c++中等同于 A a;
另外在c++中还有另外一种声明和实例化就是使用指针,如:A* a= new A()
c++中的A a;就已经构造了对象;
而在java中 A a; 就是声明,还没有分配空间,如果要继续分配空间必须像上面一样new A();
在c++中就非常的灵活,A a;在栈(stack)上分配空间,是静态的
A *a= new A;在堆(heap)上分配空间,是动态的
栈上空间自动回收,堆空间需要程序员手动回收
(3)静态分配内存适合于编译时就已经可以确定需要占用内存多少的情况,而在编译时不能确定内存需求量时可使用动态分配内存;但静态分配内存的运行效率要比动态分配内存的效率要高,因为动态内存分配与释放需要额外的开销;动态内存管理水平严重依赖于程序员的水平,如果处理不当容易造成内存泄漏。
可以知道动态内存分配相对于静态内存分配的特点:
1、不需要预先分配存储空间;
2、分配的空间可以根据程序的需要扩大或缩小。
要实现根据程序的需要动态分配存储空间,就必须用到malloc函数.
ps: C++: A a =new A(); 会报错
A *a=new A();
a.run();//会报错(所以必须用a->run())
所以,在程序中必须考虑用指针并且动态分配内存的情况下还能防止内存泄露......