C++ 一个类中一个类的大小

C++ 一个类中一个类的大小,c++,C++,为什么类A的对象的大小是-4字节(它不考虑类B和C) 我如何创建对象A,使得B和C也被创建 那么物体的大小会改变吗?如果否,那么对象B和C是否仍被视为对象a本身的一部分 class A { public: A() { a=9; //B objB; //you wont be able to call since A::B::B() is private //C objC

为什么类A的对象的大小是-4字节(它不考虑类B和C)

我如何创建对象A,使得B和C也被创建

那么物体的大小会改变吗?如果否,那么对象B和C是否仍被视为对象a本身的一部分

class A
{
public:
        A()
        {
                a=9;
                //B objB; //you wont be able to call since A::B::B() is private
                //C objC; //same as above
        }
        int a;
        class B
        {
                B()
                {
                        b=10;
                }
                int b;
        };

        class C
        {
        public:
                int c,d,e,f,g;
        };
};

因为,在类A中只有
intA
是类作用域中的成员变量,它被计为类的大小

在创建对象之前,类本身不会占用任何空间。您已经使用以下代码创建了对象,但如果将其设置为类B和C的公共构造函数并按如下方式添加到A的构造函数中,则不会执行该代码,因为B的构造函数是私有的:

B objB; 
C objC;

它在构造函数中是本地的,并在构造函数完成执行后解除分配。

因为,在类A中仅
int A
是类作用域中的成员变量,它被计为类的大小

在创建对象之前,类本身不会占用任何空间。您已经使用以下代码创建了对象,但如果将其设置为类B和C的公共构造函数并按如下方式添加到A的构造函数中,则不会执行该代码,因为B的构造函数是私有的:

B objB; 
C objC;

它在构造函数中是本地的,并在构造函数完成执行后释放。

您需要了解的第一件事是,类声明就像一个蓝图,不占用任何数据内存。所以类B和C是存在的,但不会占用任何内存,因为对象并没有实例化

您正在A的构造函数中创建它的局部变量

class A
{
    public:
    int a;
    int x; //added an additional variable (this should increase the size of object to 8)
    A()
    {
        a=9;           
        //Below 2 objects are allocated on stack not object memory     
        B objB; 
        C objC; 
        //Memory for objects objB and objC are released after exit from constructor
    }

    //class B and C are accessible only within class A
    class B
    {
        public: //made public so object can be instantiated.
            int b;
            B()
            {
                b=10;
            }

    };

    class C
    {
        public:
            int c,d,e,f,g;
    };        
};
在类A中添加整数x将使大小再增加4个字节。 以上类的总大小现在是8字节。
构造函数中声明的任何数量的局部变量都不会增加类的大小。

首先需要了解的是,类声明就像一个蓝图,不会占用任何数据内存。所以类B和C是存在的,但不会占用任何内存,因为对象并没有实例化

您正在A的构造函数中创建它的局部变量

class A
{
    public:
    int a;
    int x; //added an additional variable (this should increase the size of object to 8)
    A()
    {
        a=9;           
        //Below 2 objects are allocated on stack not object memory     
        B objB; 
        C objC; 
        //Memory for objects objB and objC are released after exit from constructor
    }

    //class B and C are accessible only within class A
    class B
    {
        public: //made public so object can be instantiated.
            int b;
            B()
            {
                b=10;
            }

    };

    class C
    {
        public:
            int c,d,e,f,g;
    };        
};
在类A中添加整数x将使大小再增加4个字节。 以上类的总大小现在是8字节。
构造函数中声明的任何数量的局部变量都不会增加类的大小。

定义与其实例之间存在差异。当您计算对象的大小时,您计算的是实例的大小,而不是类的大小。由于特定于A实例的唯一信息是整数A,因此该实例的大小仅为整数

B和C不是A定义的一部分。您可能已经在A的范围内声明了类B和C,但是由于您没有在A中声明任何B或C成员,那么,A的内存中没有B或C的实例


类B和C确实是创建的,但只能在A的上下文中使用(这是在A中声明它们的要点)。

定义和实例之间存在差异。当您计算对象的大小时,您计算的是实例的大小,而不是类的大小。由于特定于A实例的唯一信息是整数A,因此该实例的大小仅为整数

B和C不是A定义的一部分。您可能已经在A的范围内声明了类B和C,但是由于您没有在A中声明任何B或C成员,那么,A的内存中没有B或C的实例


类B和C确实是创建的,但只能在A的上下文中使用(这是在A中声明它们的要点)。

为什么A实例大于4字节?
objB
objC
都不是
A
的成员。它们是自动变量。@WhozCraig:我不确定我是否理解你的意思。这些不是自动变量。我不明白为什么B和C的大小不应该是a的一部分?“这些不是自动变量”-是的,它们是。我艾哈迈德的答案准确地解释了这一点。如果您认为
objB
objC
A
的实例提供了逻辑或物理表示,那么您的理解是不正确的。这就是语言的工作原理。将它们移出构造函数,使它们成为
A
的成员,就像
A
是一样,它们将加入愚蠢的行为。如果将4KB变量添加到
a::a()
,该变量对
a
的实例大小没有任何影响。如果将其移动为成员,则它现在是
a
的一部分(并因此影响其大小)。为什么实例会大于4字节?
objB
objC
都不是
A
的成员。它们是自动变量。@WhozCraig:我不确定我是否理解你的意思。这些不是自动变量。我不明白为什么B和C的大小不应该是a的一部分?“这些不是自动变量”-是的,它们是。我艾哈迈德的答案准确地解释了这一点。如果您认为
objB
objC
A
的实例提供了逻辑或物理表示,那么您的理解是不正确的。这就是语言的工作原理。将它们移出构造函数,使它们成为
A
的成员,就像
A
是一样,它们将加入愚蠢的行为。如果将4KB变量添加到
a::a()
,该变量对
a
的实例大小没有任何影响。将其移动为一个成员,它现在是
a
的一部分(并因此影响其大小)。B objB不正确。代码无法编译。由于评论中提到的原因,我对这两行进行了评论,以使我的问题更加清楚。问题实际上不是关于B是否是私人的。问题更多的是关于B在A中的存在。确切地说,在我的主要问题B中有三个问题是不正确的。代码无法编译。由于评论中提到的原因,我已经向m评论了这两行