只能在栈上或者堆上创建对象

只允许对象生成于堆内?怎么理解?肿么办?

假如,手头上有一个类Person,当你在程序中写下Person rn时,

编译器悄悄地做了两件事:调用constructor构造对象rn,而在弹栈时,调用destructor析构对象rn。

对象rn的构造和析构全部由编译器负责,这是栈的特性!

诸所周知,对象rn生成于栈内。

而我们现在的要求是什么?“只允许对象生成于堆内。”rn明显违背了我们的要求,也就意味着它应该被禁止。


那这种 “坑爹型”的事情肿么办呢?有人想说,只要让Person的构造函数或者析构函数成为private就OK了。

也许许多人真会有这样的第一想法,假使那样,咱再往下进一步思考。

如果那样的话,这个类可以实现继承吗?No,即就是禁止继承。

另外,这个类允许其他类拥有它的对象吗?No,即就是禁止包含。

那怎么办呢? 解决的方法也很简单,解除继承的副作用只需让Person的析构函数成为protected就可以了;

解决内含的副作用只需让Test中的成员变量ps成为Person*类型并在Test的构造/析构函数中对成员变量做初始化和释放操作就可以了。

本例完整的代码如下所示。
#include<iostream>
using  namespace std;

class Person
{
public:
    Person()
    {
        cout<<"Con()"<<endl;
    }
    Person(int x)
    {
        a = x;
        cout<<"Con(x)"<<endl;
    }
    void  Destroy()
    {
        delete this;
    }

protected:
    ~Person()
    {
        cout<<"Des"<<endl;
    }
private:
    int a;
};

class  Student:public Person
{

};

class Test
{
public:
    Test()
    {
        ps = new  Person();    //堆上对象
    }
    ~Test()
    {
        ps->Destroy();
    }
private:
    Person *ps;
};

void main()
{
    Test t1;
}
转载自:http://www.cnblogs.com/Braveliu/archive/2013/01/06/2847475.html
只能在堆上创建对象
C++中存放变量的地方有三个,分别是全局/静态变量存储区,局部变量存储区 即栈,new存放的变量存放在堆上,解题的思路是: 如果只在栈上创建对象则禁止在堆上创建,重写operator new 和operator delete 如果只在堆上创建对象则把析构函数定义为私有的,但是一定要定义一个函数把new的 对象删除掉 void distory () const { delete this; } #include <iostream> using namespace std; class A { public: A() { cout<<"dhjj"<<endl; } void distory () const //通过公有接口访问私有的析构函数 { delete this; } private : ~A(){ cout<<"this";} }; int main() { A* a=new A; a->distory(); return 0; }
只能在栈上创建对象
#include <iostream>
using namespace  std;

class A
{
public:
 
  A()
 {

  cout<<"dhjj"<<endl;
 }
 
  ~A(){ cout<<"this";}
private:
 void* operator new (size_t t); 
 void  operator delete(void *ptr);   

 
 

};
int main()
{


 A* a=new A;
 A a;
 
 return 0;
}

 

 转载自:http://blog.csdn.net/acdnjjjdjkdckjj/article/details/5633611
原文地址:https://www.cnblogs.com/leijiangtao/p/4495185.html