C++声明对象,并且和Java中的相关语法和原理进行比较
C++中创建对象的两种语法
在c++的类中,我如果要访问类中的成员变量或函数,有2种方法,第一种就是定义一个一个对象,如:
Class A ...A aa;aa.xxx();
另外一种就是
Class B ...B *aa = new B();aa->xxx();
Java中创建对象
在java中,A a = new A()等同于c++中的 A a;
另外在c++中还有另外一种声明和实例化就是使用指针,如:A* a= new A(),在Java中没有对应的形式,最重要的原因是C++中的这种声明形式的内存是需要程序员手动管理的,但是Java有内存回收机制,不需要程序员关心对象的内存的问题
c++中的A a;就已经构造了对象;但是在java中 A a; 就是声明,还没有分配空间,java中的A a = new A()才是分配了内存的。
C++的静态与动态内存分配
在C++中就非常的灵活,A a;是在栈(stack)上分配空间,是静态的。而A * a= new A;是在堆(heap)上分配空间,是动态的。栈上空间自动回收,堆空间需要程序员手动回收
静态分配内存适合于编译时就已经可以确定需要占用内存多少的情况,而在编译时不能确定内存需求量时可使用动态分配内存;但静态分配内存的运行效率要比动态分配内存的效率要高,因为动态内存分配与释放需要额外的开销;动态内存管理水平严重依赖于程序员的水平,如果处理不当容易造成内存泄漏。
动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点:
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(); //这才是正确的语法