【C/C++】C和C++中Struct和Class区别

一、结构体

1.1 C结构体和C++的结构体

C++中的结构体是C结构体的扩展,增加了一些新的用法和属性
在这里插入图片描述
使用时的区别:

struct Human
{
	char name[15];
	int age;
};
typedef struct Human human_; C语言中取别名
struct Human tom;			 C语言中使用
Human tom; 					 C语言别名使用/C++中使用

根本:
C语言中结构体就是不同类型元素的集合,不涉及处理数据的算法
C++中结构体不仅有数据还封装了不同处理数据的方法

1.2 C++结构体和C++的类

  1. 内部成员的默认权限不同
struct student1		成员默认public属性
{
	int age;
};
class student2		成员默认private属性
{
	int age;
};
  1. 继承下默认权限不同
struct human
{
	int age;
}
struct student : human		默认public继承属性
{
	int Stu_ID;
}
student tom;
tom.age = 19;class下会报错,class默认private属性
  1. 模板的使用
定义一个模板:
template <class T> 或者 template <typename T>,但不能是:struct

1.3 结构体内存对齐

目的:为了提高程序运行的效率,访问没有对齐的内存,CPU需要进行两次,而对齐的内存访问只需要一次
CPU访存的地址必须满足4的整数倍,内存对齐是一种牺牲空间换取效率的方案

对齐规则:

  1. 首元素不需要对齐
  2. 其他成员对齐到自身类型整数倍
  3. 如果指定默认对齐数,则对齐到自身类型和默认对齐数较小值的地址
  4. 总大小:最大对齐数的整数倍
struct A	// 24
{
	char a;		
	double b;
	char c;	
};
struct B	// 12
{
	char a;
	int b;
	char c;
};
struct C	// 8 
{
	char a;
	char b;
	int c;
};
struct D	// 16 
{
	double a;
	char b;
	int c;
};
struct E	// 32
{
	char a;
	struct D b;
	double c;
};

二、位段

1.1 什么是位段?

  1. 位段是一种数据的压缩,不考虑效率,注重空间使用率,因此不需要内存对齐
  2. 位段在TCP/IP报头中使用
struct A
{
	char a : 3;
	char b : 4;
	char c : 5;
	char d : 4;
};
int main()
{
	A a = { 0 };	// 初始化,防止里面是随机值
	a.a = 10;
	a.b = 12;
	a.c = 3;
	a.d = 4;
	cout << sizeof(struct A) << endl;
	return 0;
}

在这里插入图片描述

1.2 位段在TCP/IP协议报头中的使用

在这里插入图片描述

struct 
{
	unsigned int vison : 4;
	unsigned int handler lend : 4
	unsigned int TOS : 8
	unsigned int total length : 16
};

三、联合

联合的成员公用同一块空间,所以联合也叫共用体

union Un 
{ 
 char c; 
 int i; 
}; 
//联合变量的定义
union Un un; 
//计算连个变量的大小
printf("%d\n", sizeof(un));
un.i = 1
if (un.c)
	printf("小端\n");
else
	printf("大端\n");
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值