定义一个只在堆(栈)上生成对象的类

来源:互联网 发布:淘宝美工的电脑配置 编辑:程序博客网 时间:2024/06/17 07:01

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,就可以实现对象只建立在栈上。


阅读全文
0 0
原创粉丝点击