一、 结构体和联合体有什么区别?能否在声明过程当中缺省名字?(需要写清楚使用方法)
结构体的各个成员占用不同的内存空间,总大小是所有成员大小之和(结构体字节对齐):
typedef struct Student {
int a;
char b;
short c;
char d;
} stu;
对齐规则:
找成员中最大的类型 用他作为字节对齐数
求出来的结果一定是对其数的整数倍
整数倍的地址对齐
a | |||||||
b | x | c | |||||
d | x | x | x |
该结构体成员中的最大类型为 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) | a | a | a |
可以用联合体检测大小端存储:
大端存储:低地址放高位高地址放低位
(十进制 1 ,大端存储)
00000000 | 00000000 | 00000000 | 00000001 |
小端存储:高地址放高位,低地址放低位
(十进制 1 ,小端存储)
00000001 | 00000000 | 00000000 | 00000000 |
检测大小端存储代码:
#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++支持继承,结构体可以作为基类,允许其他类或结构体继承其属性和方法。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 【每日C/C++问题】
发表评论 取消回复