C++如何只能在堆上或栈上生成对象
2017-06-21 21:12
274 查看
#include <iostream> using namespace std; //只能在栈上构造对象的实现:即不能调用new来在堆上构造对象,调用new其会调用operator new(), //所以只要显示定义重载一下operator new() operator delete()操作符设为私有部分 //类外就无法调用new/delete在堆上建立释放对象了。 class B { public: B() { cout<<"B()"<<endl; } ~B() { cout<<"~B()"<<endl; } private: //显示定义设为私有权限 void* operator new(size_t); void operator delete(void*); public: int _b; }; void test1() { B b; //B* pb=new B(); //编译错误 } //只能在堆上构造对象,不能在栈上:即不能静态由编译器直接创造对象则只需将构造函数 //与析构函数设为私有的,即类外就不能在栈上自动构造对象(又由于考虑到继承:派生类不能访问基类私有函数, //则将造成派生类中的父类成员不能成功调用其父类构造函数与析构函数,所以要将构造函数与析构设为protected) //最后提供接口实现用new生成对象,delete释放对象 class C { public: static C* Create() //用静态函数原因:还没有类对象只能用类调用静态函数创造对象 { return new C(); //类内new原因new过程也会调用构造函数,而构造函数现已类外不能访问 } void Destroy()//不用静态函数原因:现已存在对象,可用对象调用此函数 { delete this; //类内delete与上相同原因,析构函数权限为保护,类外不能访问 } protected: //保护权限考虑继承 C() { cout<<"C()"<<endl; } ~C() { cout<<"~C()"<<endl; } public: int _c; }; void test2() { //C c; //C* c=new C(); C* c=C::Create(); c->Destroy(); } int main() { test1(); test2(); return 0; }
相关文章推荐
- C++如何只在堆上或者栈上生成对象
- 如何定义一个只能在堆上(栈上)生成对象的类
- 如何定义一个只能在栈上生成对象的类
- 如何定义一个只能在栈/堆上生成对象的类
- C++ 只能new / 只能定义 的方式生成新对象
- C++如何实现类对象只能动态分配或只能静态分配
- 如何定义一个只能在栈上生成对象的类
- 面试题:C++如何只在堆上或栈上生成对象
- C++ 设计一个类,只能生成一个对象
- 如何定义一个只能在堆(栈)上生成对象的类
- 如何控制JAVA中一个类只能生成一个对象?
- 如何定义一个只能在堆上(栈上)生成对象的类?
- C++如何限制类对象只能静态分配或者只能只能动态分配
- 第二讲:如何定义一个只能在堆上生成对象的类
- 如何定义一个只能在堆上(栈上)生成对象的类?
- 如何定义一个只能在堆上(栈上)生成对象的类?
- 如何定义一个只能在堆上生成对象的类
- 如何定义一个只能在堆上生成对象的类
- 如何定义一个只能在栈上生成对象的类
- 如何定义一个只能在堆上生成对象的类