Struct与C++类的不同
1. 成员变量和函数的默认范围方式不同:struct是public;类是private
2. struct 可以用 {} 初始化
3. C语言的struct不可以包含函数,C++中可以,但不能直接在结构体内实现,是将一个函数的地址直接付给结构体的成员函数
4. C++中的结构体可以包含构造函数
Struct {}; Struct A{}; Struct {}B; Struct A{}B; 的区别:
结构体声明由三部分组成,tag, member-list, variable-list。
struct tag
{
member-list;
}variable-list;
所有可选部分不能全部省略--它们至少出现2个。
//1.是错误定义形式,即没有该形式
//能编译通过,但无法使用该结构体
struct
{
int x;
int y;
};
//---------------------------------------------------------------------------------------
//2.结构体类型定义,定义{}中的结构为一个名称是“A”的结构体
struct A{
int x;
int y;
};
//等价于第2种:struct A{};
typedef struct TagA{
int x;
int y;
}A; //A为TagA的别名,是等同的。
//---------------------------------------------------------------------------------------
//3.
//结构体变量定义,以{}中的结构,定义一个名称为”B”的变量。
//这里的结构体称为匿名结构体,是无法被直接引用的
// 这种写法是最没人用的,因为它的定义是一次性的
struct{
int x;
int y;
}B;
//这种写法的改良是,在前面加关键字:typedef,使B成为匿名结构体类型的别名。
typedef struct{
int x;
int y;
}A;
//---------------------------------------------------------------------------------------
// 4. 即2和3 的结合
struct A
{
int x;
int y;
}B,C;
Struct前加typedef的区别
typedef strcut A{}a;
相当于定义了struct A该类型的别名为a,之后声明该类型时不需要再使用struct A variable1;
而可以直接使用类型别名a variable1;
该问题主要存在于C语言中,C++中声明该类型变量时也可以不用加struct,直接A variable1;
内存对齐问题
Union与struct
Union:C/C++关键字 共用体(联合)
在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。
所以union的长度是其中变量所占长度最长的那个,(不求和)之后还要补齐:即保证是最长变量类型的整数倍
union A
{
int a[5]; //20
short b; //2
double c; //8
char p2; //1
};
struct B {
int n; // 4字节
A a; // 24字节
char c[10]; // 10字节
};
union的大小 = 24;-----------原本取最大,应该为20,但要和最大变量类型长度对齐,即和8字节的double对齐,应为其整数倍,所以大于20的最接近8的整数倍的数为24.
struct的大小 = 8+24+16 = 48;------------因为A是8字节对齐的,所以其他也要8字节对齐
对齐系数
程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”
将union的定义放struct外面,与放struct里面,占用内存大小不同:
union A
{
int t; //4
short m; //2
char p; //1
};
struct B
{
A a; //4
double c; //8
char p2; //1
};
//注意,上面struct B{};等效于下面表达:
//区别于下一条代码框的内容
struct B
{
union A
{
int t; //4
short m; //2
char p; //1
}a; //定义union变量a;
double c; //8
char p2; //1
};
B的大小 = 8+8+1---即17---------- > 对齐为24;
struct B
{
union A
{
int t; //4
short m; //2
char p; //1
} ;
double c; //8
char p2; //1
};
B的大小 = 4+8+1----即13---------- > 对齐为16;