一、 结构体和联合体有什么区别?能否在声明过程当中缺省名字?(需要写清楚使用方法)

结构体的各个成员占用不同的内存空间,总大小是所有成员大小之和(结构体字节对齐

typedef struct Student {
	int a;
	char b;
    short c;
	char d;
} stu;
对齐规则:

         找成员中最大的类型 用他作为字节对齐数

         求出来的结果一定是对其数的整数倍

         整数倍的地址对齐
a
bxc
dxxx

        该结构体成员中的最大类型为 int 类型 4 字节,所以按 4 字节对齐,c 为 short 类型占 2 字节由于按整数倍的地址对齐所以不可以紧挨着 b 放,需要在前面补一位再放 c ,d 为 char 类型占 1 字节需要按 4 字节对齐,所以需要在后面补 3 位。 最后求得该结构体所占内存大小为 12 字节。

联合体的所有成员共享一块内存空间,联合体的大小等于其最大成员的大小

typedef union Student {
	int a;
	char c;
} stu;

        由于联合体的大小等于其最大成员的大小,所以该联合体所占内存大小为 4 字节。

a(c)aaa

可以用联合体检测大小端存储:

大端存储:低地址放高位高地址放低位

(十进制 1 ,大端存储)

00000000000000000000000000000001

小端存储:高地址放高位,低地址放低位

(十进制 1 ,小端存储)

00000001000000000000000000000000

检测大小端存储代码:

#include<iostream>
using namespace std;
int checkSystem() {
	union System {
		int a;
		char c;
		char b;
	} un;
	un.a = 1;
	return un.c == 1;
}

int main() {
	cout << checkSystem(); // 输出 1 为小端存储,0 为大端存储 
	return 0;
}

可以在声明的时候缺省名字: 我们可以在定义的同时 创建该类型的对象,也可以在定义时加上                                                 typedef 对类型起别名 那这样就可以用别名再创建对象了

在定义的同时 创建该类型的对象:

#include<iostream>
using namespace std;
#include <string>
struct{
	int a;
	char d;
	char b;
} stu;

int main() {
	stu.a = 1;
	cout << stu.a;
	return 0;
}

输出

1

在定义时加上 typedef 对类型起别名,用别名再创建对象:

#include<iostream>
using namespace std;
#include <string>
typedef struct{
	int a;
	char d;
	char b;
} stu;

int main() {
	stu s;
	s.a = 1;
	cout << s.a;
	return 0;
}

输出

1

二、结构体可以包含函数吗?在 C 和 C++ 中有何不同?

C语言中的结构体通常不包含成员函数,而是使用外部函数来操作结构体的数据。

C++允许在结构体中定义成员函数,这些函数可以访问结构体的私有成员,并且可以像类一样使用封装。

C语言中的结构体没有访问控制的概念,所有成员默认都是公有的,可以直接访问。

C++中的结构体可以有访问控制,支持public、private和protected访问修饰符。在C++中,
结构体(struct)的默认访问权限是公有的(public)。这意味着结构体中的成员默认情况
下可以被外部访问。与结构体不同,类(class)的默认访问权限是私有的(private)。
C 中的结构体的使用要加上struct关键字,或者用typedef取别名后直接使用,C++中的结构体使用时不需要加
struct关键字;

在 C++ 中直接使用类型名加变量名即可

C:struct A{};   
   int main () {
       struct A a;
   }

C++:struct A{};
     int main () {
       A a;
   }
C语言中没有构造函数和析构函数的概念。

C++中的结构体可以有构造函数和析构函数,允许在创建和销毁结构体实例时执行特定的初始化和清理代码
C的结构体不可以初始化成员,C++中的结构体可以初始化成员变量;
C语言不支持继承,因此结构体不能作为其他结构体或类型的基类。

C++支持继承,结构体可以作为基类,允许其他类或结构体继承其属性和方法。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部