C++struct与C中struct的不同
1.C++和C的struct命名小有不同
struct data
{
int a;
int b;
};
同样的结构体,C++可以直接使用data声明类型,而C必须使用struct data(不使用typedef)
2.C++的struct可以定义函数,C不行
3.C++struct可以包含一些C++独有的类的特性(访问控制符号,成员函数,继承)
C++struct与class的不同
class 时,类中的成员默认都是 private 属性的;而使用 struct 时,结构体中的成员默认都是 public 属性的。
class 继承默认是 private 继承,而 struct 继承默认是 public 继承。
class 可以使用模板特性,而 struct 不能。(有的文章有,但是我试过了,struct是可以使用模板的)
struct与union的区别
1.在存储多个成员信息时,编译器会自动给struct第个成员分配存储空间,struct 可以存储多个成员信息,而Union每个成员会用同一个存储空间,只能存储最后一个成员的信息。(struct的大小根据内存对齐计算,union根据成员中最大的成员决定)
2.都是由多个不同的数据类型成员组成,但在任何同一时刻,Union只存放了一个被先选中的成员,而结构体的所有成员都存在。
3.对于Union的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于struct 的不同成员赋值 是互不影响的。
4.union可以使用模板,可以使用函数(包括构造函数,析构函数,拷贝构造函数,有this指针),可以使用(访问控制符),但是不能使用继承(和被继承),内部不能定义引用,不能定义静态变量
注意:union 可以定义常量,可以通过修改其他共享内存的变量来对常量进行修改
代码:
#include <iostream>
#include <typeinfo>
using namespace std;
class A
{
};
union un
{
int a;
int b;
void func()
{
cout<<1<<endl;
}
int c;
};
struct st:public A
{
int a;
int b;
void func()
{
cout<<1<<endl;
}
int c;
};
int main()
{
un u;
u.a = 2;
u.b = 3;
st s;
s.a = 2;
s.b = 3;
printf("%d\n",sizeof(u));
printf("%p\n",&u);
printf("%p\n",&u.a);
printf("%p\n",&u.b);
printf("%p\n",&u.func);
printf("%d\n",sizeof(s));
printf("%p\n",&s);
printf("%p\n",&s.a);
printf("%p\n",&s.b);
printf("%p\n",&s.func);
}
运行结果:
分析:
union 的大小由成员变量中的最大字节决定,struct的大小由内存对齐决定
union和struct中可以定义函数,函数指针储存在对象内存的附件,但是sizeof不计算.
struct可以继承,union不可以
union中共享内存的部分只是在进程内而不是进程之间。并且union中的函数不与成员变量共享内存(包括指针)