一个班级的班级规模

时间:2018-06-28 06:29:30

标签: 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; //same as above
        }
        int a;
        class B
        {
                B()
                {
                        b=10;
                }
                int b;
        };

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

3 个答案:

答案 0 :(得分:2)

因为,在类A中,只有int a;是类范围内的成员变量,该变量被视为类的大小。

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

B objB; 
C objC;

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

答案 1 :(得分:1)

您需要了解的第一件事是类声明就像一个蓝图,并且不占用任何数据内存。因此,存在类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个字节。 在构造函数中声明的任何数量的局部变量都不会增加类的大小。

答案 2 :(得分:0)

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

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

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