c++中继承导致了对象的指针和引用有两种不同类型:静态类型&动态类型
静态类型:对象在声明时采用的类型 如A a,是在编译期决定的,不能更改;
动态类型:目前所指对象的类型 如 string *psa=new string[10],是在运行期决定的,可以更改;
静态建立一个类对象,是由编译器在栈空间中开辟空间,通过挪动栈顶指针,挪出适当的空间,在这片内存空间内
调用构造函数形成一个栈对象,使用这种方法直接调用类的构造函数;
动态建立一个类对象,是使用new关键字将对象建立在堆空间上,分为两步:①调用operator new()函数,在堆空间中
搜索合适的内存并进行分配。②调用类的构造函数构造对象,初始化这片空间,即间接调用类的构造函数;
一、只能在堆上建立对象
对象只能在堆上建立,那就说明不能直接调用构造函数,不能用将构造函数私有化的办法,任意一种方法都会调用类的构造函数
;对象建立在栈上,是由编译器为它分配空间的,当对象使用结束后,编译器对它进行回收,如果私有了构造函数,编译器无法收回这块空间,
那么编译器就不会在栈上开辟空间了
这样只能使用new关键字来建立对象,构造函数是公有的,但是必须用一个Destroy函数来进行空间的释放,类对象使用完后必须使用Destroy
缺点:无法解决继承问题。如果A类作为其他类的基类,则析构函数通常设为virtual,然后在子类中重写,以实现多态;
因此析构函数不能设为private,可以将其设为protected: 类内可以访问,类外部不能访问;
类的使用并不方便,使用new建立对象,却使用Destroy函数释放对象,而没有使用delete,假如使用delete
,delete对象的指针会调用析构函数,而析构函数类外不能访问
这样调用Create函数在堆上创建A对象,调用Destroy函数释放内存;
二、只能建立在栈上
只要使用new关键字,对象才会建立在堆上,只要不用new,就可以实现对象只建立在栈上。