为什么是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;
};
};
答案 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中声明它们的关键)。