• 数据成员(字段) + 函数成员
• 对象有什么?
• 实例成员与this指针
• 静态成员
• 对象在哪里?——空间分析
• 基本类型成员
• 内嵌对象成员
• 内嵌指针成员
• 操作符重载
-----------------------------------------------------------------
class Point
{
public:
int x;
int y;
static int data;//static 不占实例对象的内存空间
};
void main()
{
Point p1(1,2);
Point * p2=new Point{10,20};
}
上面的内存模型是,main函数栈中,首先是一个 Point p1栈对象,占8个字节,然后是一个
Point * p2指针占8个字节,指向了一个堆空间这个堆空间也是8个字节大小
---------------------内嵌对象成员内存模型---------------------------
class Point
{
public:
int x;
int y;
static int data;//static 不占实例对象的内存空间
};
class Rectangle
{
public:
Point left; //内嵌其他对象成员
int width;
int height;
}
void main()
{
Rectangle r;
}
对于有内嵌对象的情况,内存结构是怎么样的?
main 函数栈中,有一个 Rectangle 栈对象, Rectangle 对象的内存模型是先有
个Point栈对象(8个字节),然后有两个int 变量(8个字节),共16个字节
------------------------------------------------------------------
---------------------内嵌指针成员内存模型---------------------------
class Point
{
public:
int x;
int y;
static int data;//static 不占实例对象的内存空间
};
class Rectangle
{
public:
Rectangle(){//构造函数对指针等成员初始化}
~Rectangle(){delete leftPtr;}
Point * leftPtr; //内嵌指针
int width;
int height;
}
void main()
{
Rectangle r;
}
对于有内嵌指针的情况,内存结构是怎么样的?
main 函数栈中,有一个 Rectangle 栈对象, Rectangle 对象的内存模型是 先有
个Point指针(这个指针占8个字节,指针大小保持不变,不会随Point类成员变化,指针大小占内存发生变化),
然后有两个int 变量(8个字节),共16个字节
------------------------------------------------------------------
---------------------稍微再复杂一点的内存结构---------------------------
class Point
{
public:
int x;
int y;
static int data;//static 不占实例对象的内存空间
};
class Rectangle
{
public:
Rectangle(){//构造函数对指针等成员初始化}
~Rectangle(){delete leftPtr;}
Point * leftPtr; //内嵌指针
int width;
int height;
}
class MyShape
{
public:
Rectangle r1;
Rectangle r2;
Rectangle * r3ptr;
Point p;
int x;
int y;
static int z;
};
void main()
{
MyShape s1;
}
----------------------------------------------------
class C1
{
int i; //4 byte
char c1; //1 byte
char c2; //1 byte
};
class C11
{
int i; //4 byte
char c1; //1 byte
char c2; //1 byte
static char c3;// static静态成员是不占 C11 对象内存空间的, 相当于全局成员
};
class C2
{
char c1; //4
int i; //4
char c2; //4
};//12 byte
class C3
{
int i1;
char c1;
int i2;
char c2;
int i3;
char c3;
int i4;
char c4;
};//32
class C4
{
int i1; //4byte
int i2;
int i3;
int i4;
char c1;
char c2;
char c3;
char c4;
};//20
int main()
{
cout<<sizeof(C1)<<endl;// 输出8
cout<<sizeof(C2)<<endl;// 输出12
cout<<sizeof(C3)<<endl;// 输出32
cout<<sizeof(C4)<<endl;// 输出20
}