c++嵌套类-内存分配

首先看下列代码:
int main(){
    double *p;
    printf("sizeof(int):%d\nsizeof(double):%d\nsizeof(ptr):%d\n", 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\nsizeof(a)%d\n", 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这种形式访问。这像个类型会没所有实例对象共享。

时间: 2024-10-23 00:58:54

c++嵌套类-内存分配的相关文章

C++ primer plus读书笔记——第12章 类和动态内存分配

第12章 类和动态内存分配 1. 静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域运算符来指出静态成员所属的类.但如果静态成员是整形或枚举型const,则可以在类声明中初始化. P426-P427类静态成员的声明和初始化 //strnbad.h class StringBad { private: static int num_strings; … }; //strnbad.cpp int StringBad::num_strings = 0; 不能在类声明中初始化静态

《C++ Primer Plus》读书笔记之十—类和动态内存分配

第12章 类和动态内存分配 1.不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存.可以在类声明之外使用单独的语句进行初始化,这是因为静态类成员是单独存储的,而不是对象的组成部分.注意:静态成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或枚举型const,则可以在类声明中初始化. 2.当使用一个对象来初始化另一个新建对象时,编译器将自动生成一个复制构造函数,因为它创建对象的一个副本.复制构造函数的

java类中属性的加载顺序,以及内存分配情况介绍

看下面例子及说明: /** 假如有外部类调用了该类,代码为:new StaticTest(); 那么下面是类属性的加载顺序 */ public class StaticTest{ public int dsd=2;//第3 //多个对象会有多次分配内存 public awds() { int sdsfsd=2;//第4 //多个对象会有多次分配内存 } //静态代码块 static{ System.out.println("静态代码块正在加载...");//第1 } public st

C++ 学习笔记之---类和动态内存分配

参考自<C++ primer plus 6th edition> 请各位放大观看吧,感觉博客园的编辑器有点坑.用图片之后,又发现太小,所以... 程序对内存的使用: 链接:http://zhidao.baidu.com/link?url=An7QXTHSZF7zN9rAuY05mvaHHar0xIpgK6Yqp9oAkm2GmZYoTAz9UpN4JuhWJvSLsbu0-lOcO47PzXcNWda6gK 定义静态成员变量: 可以在类声明中定义静态成员变量,使用 static 修饰.不过,虽

Java内存分配(直接内存、堆内存、Unsafel类、内存映射文件)

1.Java直接内存与堆内存-MarchOn 2.Java内存映射文件-MarchOn 3.Java Unsafe的使用-MarchOn 简单总结: 1.内存映射文件 读文件时候一般要两次复制:从磁盘复制到内核空间再复制到用户空间,内存映射文件避免了第二次复制,且内存分配在内核空间,应用程序访问的就是操作系统的内核内存空间,因此极大提高了读取效率.写文件同理. 2.堆内存分配与直接内存分配: Java申请空间时通常是从JVM堆内存分配的,即 ByteBuffer.allocate(int cap

动态内存分配类实现

今天学习了C++语言的内存动态分配,并借助所学的知识实现了一个动态内存分配类. 问题的背景为:在已经实现了一个点类的基础上,实现一个动态内存分配类,这个类 的功能为:实现根据输入的数目size,动态的生成size个点类对象:并在提供一个借口 可以对pos位置的对象进行操作:在对象生存期结束时,可以自动释放分配的内存空间. 根据描述的问题描述的需求,规划了如下的类图: 写出了一个包含三个方法的对点动态分配内存的类: 1: #ifndef _ARRAYOFPOINTS_H 2: #define _A

关于c++类的内存分配

参考:这里 虽然有些地方错了,但是也可以一看,大概能加深对c++类相关的内存分配的了解 然后这还不算十分深入,更深入的可以看这里. 这本书是时候读一下了:<深度探索C++对象模型> (待续...)

C++-类和动态内存分配 大发彩_票平台开发

大发彩_票平台开发 地址一:[hubawl.com]狐霸源码论坛地址二:[bbscherry.com] 类和动态内存分配 动态内存和类 C++在分配内存时是让程序在运行时决定内存分配,而不是在编译时决定. 这样,可根据程序的需要,而不是根据一系列严格的存储类型规则来使用内存.C++使用new和delete运算符来动态控制内存. 1.1. 复习示例和静态类成员 这个程序使用了一个新的存储类型:静态类成员. //strngbad.h#include<iostream>#ifndef STRNGBA

JavaSE基础知识(5)—面向对象(5.1类和对象概念、创建及内存分配)

一.类和对象的相关概念 1.面向对象和面向过程的理解 面向对象和面向过程都属于解决问题的思考方式.面向过程:以执行者的角度思考问题,侧重于"怎么做",比较适合解决小型项目面向对象:以指挥者的角度思考问题,侧重于"谁来做",比较适合解决中大型项目面向对象和面向过程不能分割开来,二者相辅相成,缺一不可!宏观上通过面向对象思考,微观上通过面向过程思考! 2.类和对象的概念.关系.区别 (1)概念 对象:客观世界中所有可以被描述的事物都称为对象(万物皆对象).类:具有相同属