zoukankan      html  css  js  c++  java
  • c++嵌套类-内存分配

    首先看下列代码:
    int main(){
        double *p;
        printf("sizeof(int):%d sizeof(double):%d sizeof(ptr):%d ", sizeof(int), sizeof(double),sizeof(p));

        getchar();
        return 0;
    }
    结果为:

    我是在64位机器上运行的,可以看到,int类型分配4字节,double类型8字节,指针4字节。
    /**********************/
    再看如下代码:
    /*****************空类****************/
    #include <iostream>
    class A{
    };
    int main(){
        A a;
        printf("sizeof(A)%d sizeof(a)%d ", sizeof(A),sizeof(a));
        getchar();
        return 0;
    }
    结果为:


    /***********类中有int类型,,***********/
    class A{
        int n;
    };


    /*******有指针********/
    class A{
        int *n;
    };


    /*******有函数*******/
    class A{
        void fun(){}
    };

    /******枚举类型****/
    class A{
        enum
        {white =1};
    };


    那么嵌套类是怎样的呢
    class A{
    public :
        class B{
            int n;
            int *p;
        };
    };
    结果任然是


    这说明嵌套类不是以指针的方式存储的。
    但如果这样写:
    class A{
    public :
        class B{
            int n;
            int *p;
        };
        B b;
    };

    你会发现他刚好等于B的大小但是这是有区别的。class B是类的定义部分完全可以写成这样
    class A{
    public :
        class B;

        B *b;//没有定以前只能声明引用或指针
    };
    class A::B{
        int n;
        int *p;
    };
    结果为

    这是大小恰是指针的大小
    而B b创建类的实实例才会将B中的类型分配空间,后者已经不叫嵌套类而叫做包含类。
    所以但在存储空间上讲嵌套类不会和实例变量存储在一起,而是像枚举类型,函数一样被存储的在其他地方,甚至连指针也不算。
    存储效果和下面一样,不同的是访问的层次关系变了。
    class B{
        int n;
        int *p;
    };
    class A{
    public :
        B b;
    };

    当嵌套类和枚举被定义在public部分是
    可以在外部用A::B这种形式访问。这像个类型会没所有实例对象共享。


  • 相关阅读:
    实现图片加载时显示百分比思路——serverpush
    我对大项目的看法(定义)
    lucene
    Access常用内置SQL函数
    闰年算法
    DotFuscator使用步骤
    软件加密狗破解思路和方法
    Lucene(.net)学习
    .Net 代码安全保护产品DNGuard HVM使用
    为什么动态创建的控件没有显示出来
  • 原文地址:https://www.cnblogs.com/littleby/p/4984967.html
Copyright © 2011-2022 走看看