zoukankan      html  css  js  c++  java
  • 只允许对象生成于堆内

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

    我们已经知道,假如手头上有一个类Person,当你在程序中写下Person objTemp;时,

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

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

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

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


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

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

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

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

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

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

    本例完整的代码如下所示。

     1 #include<iostream>
     2 using  namespace std;
     3 
     4 class Person
     5 {
     6 public:
     7     Person()
     8     {
     9         cout<<"Con()"<<endl;
    10     }
    11     Person(int x)
    12     {
    13         a = x;
    14         cout<<"Con(x)"<<endl;
    15     }
    16     void  Destroy()
    17     {
    18         delete this;
    19     }
    20 
    21 protected:
    22     ~Person()
    23     {
    24         cout<<"Des"<<endl;
    25     }
    26 private:
    27     int a;
    28 };
    29 
    30 class  Student:public Person
    31 {
    32 
    33 };
    34 
    35 class Test
    36 {
    37 public:
    38     Test()
    39     {
    40         ps = new  Person();    //堆上对象
    41     }
    42     ~Test()
    43     {
    44         ps->Destroy();
    45     }
    46 private:
    47     Person *ps;
    48 };
    49 
    50 void main()
    51 {
    52     Test t1;
    53 }

    Good Good Study, Day Day Up.

    顺序  选择  循环  坚持

    作者:kaizen
    声明:本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此声明,且在文章明显位置给出本文链接,否则保留追究法律责任的权利。
    签名:顺序 选择 循环
  • 相关阅读:
    《软件需求十步走》阅读笔记一
    《探索需求》读书笔记三
    2018.9.26 随笔
    2018.9.09 随笔
    日期随笔,目录
    2018.9.03 随笔
    linux signal函数遇到的问题
    关于子线程执行两次的问题
    本科四年的一点经验
    linux 网络编程 3---(io多路复用,tcp并发)
  • 原文地址:https://www.cnblogs.com/Braveliu/p/2847475.html
Copyright © 2011-2022 走看看