C++自定义数据类型

简介: C++自定义数据类型

(1)结构体(struct)


结构体可以包含不同数据类型的结构。


定义结构体的一般形式


image.png


结构体变量名的定义和初始化:


//定义结构体同时声明结构体变量名 struct 结构体类型名 { 成员类型1 成员名1; 成员类型2 成员名2; ... ... 成员类型n 成员名n; }变量名1,变量名2,...变量名n; //先定义结构体 [struct] 结构体类型名 变量名; //直接定义 struct  { 成员类型1 成员名1; 成员类型2 成员名2; ... ... 成员类型n 成员名n; }变量名1,变量名2,...变量名n; struct  person { int year; int age; string name; }p1 = {2019,24,"heiren"}, p1 = { 2020,24,"heiren" }; struct  person { int year; int age; string name; }; struct person p1 = { 2019,24,"heiren" }, p1 = { 2020,24,"heiren" }; struct  { int year; int age; string name; }p1 = {2019,24,"heiren"}, p1 = { 2020,24,"heiren" };

结构体变量的使用:


具有相同类型的结构体变量可以进行赋值运算,但是不能输入输出


对结构体变量的成员引用:结构体变量名.成员名


指向结构体的指针变量引用格式:指针变量名->成员名;

结构体数组的定义,初始化和使用与结构体变量、基本类型数组相似


struct person { int year; int age; string name; }p[2] ={ {2019,24,"heiren"}, { 2020,24,"heiren" }};//可以不指定数组元素个数 p[1].age;

结构体作为函数传递有三种:值传递,引用传递,指针传递


结构体大小和字节对齐:

   现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐.

   为什么需要字节对齐?各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。



三个概念:


自身对齐值:数据类型本身的对齐值,结构体或类的的自身对齐值是其成员中最大的那个值,例如char类型的自身对齐值是1,short类型是2;

指定对齐值:编译器或程序员指定的对齐值,32位单片机的指定对齐值默认是4;

有效对齐值:自身对齐值和指定对齐值中较小的那个。

字节对齐的三个准则

结构体变量的首地址能够被其有效对齐值的大小所整除

结构体的总大小为结构体有效对齐值的整数倍。

结构体每个成员相对于结构体首地址的偏移量都是有效对齐值的整数倍。

可以通过#pragma pack(n)来设定变量以n字节对齐方式


image.png



(2)公用体(union)


几个不同的变量共享同一个地址开始的内存空间。


成员类型可以是基本数据类型,也可以是构造数据类型。

公用体变量初始化时,只能对第一个成员赋值。

公用体变量所占的内存长度等于最长的成员长度。

公用体变量在一个时刻只能一个成员发挥作用,赋值时,成员之间会互相覆盖,最后一次被赋值的成员起作用。

定义:


union 共同体类型名 { 成员类型1 成员名1; 成员类型2 成员名2; ... ... 成员类型n 成员名n; };


初始化:


union data{ int i; float f; char c; }x = {123};union data{ float f; int i; char c; }; data x = {12.3};union { char c; int i; float f; }x = {’y‘};

引用:


共同体变量名.成员名;union data{ int i; float f; char c; }x = {12};int main(){ cout << x.i << " " << x.f << " " << x.c << endl;//12 1.68156e-44 x.c = 'c'; cout << x.i <<" "<< x.f << " " << x.c << endl;//99 1.38729e-43 c return 0; }

下期更新输入输出~


相关文章
|
5月前
|
C语言 C++
C/C++ 自定义头文件,及头文件结构详解
还是从"stdio.h"说起,这是C语言中内置的标准库,也就是说,头文件很多时候其实就是一个“库”,类似于代码的仓库,也就是说将某些具有特定功能的常量、宏、函数等归为一个大类,然后放进这个“仓库”,就像stdio.h就是一个标准输入/输出的头文件
189 1
|
5月前
|
存储 算法 数据库
【C++ 软件设计思路】学习C++中如何生成唯一标识符:从UUID到自定义规则
【C++ 软件设计思路】学习C++中如何生成唯一标识符:从UUID到自定义规则
317 0
|
2月前
|
C++
C++ PCL 沿着自定义的平面做横截面(直通滤波)
C++ PCL 沿着自定义的平面做横截面(直通滤波)
39 0
|
5月前
|
存储 程序员 C++
C++数据类型
C++数据类型
43 2
|
1月前
|
存储 Linux C语言
【C++基础】数据类型详解
这篇文章详细介绍了C++中各种基本数据类型,包括整型、浮点型、字符型、字符串型和布尔型,以及它们的使用方式和范围。
19 4
|
4月前
|
Java API C++
Java JNI开发时常用数据类型与C++中数据类型转换
Java JNI开发时常用数据类型与C++中数据类型转换
181 0
|
2月前
|
C++
c++学习笔记01 基本知识与数据类型
C++学习笔记,涵盖了C++中的常量定义、数据类型、变量内存大小计算、基本数据类型(整型、实型、字符型、字符串型、布尔型)以及转义字符的使用。
44 4
|
2月前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
36 0
|
4月前
|
存储 C++ 容器
C++一分钟之-变量与数据类型入门
【6月更文挑战第18天】**C++编程基础:变量与数据类型概览** 了解变量(存储数据的容器)和数据类型是编程入门的关键。声明变量如`int age = 25;`,注意初始化和类型匹配。基本数据类型包括整型(int等)、浮点型(float、double)、字符型(char)和布尔型(bool)。理解类型范围和精度,使用字面量后缀增强可读性。深入学习数组、指针、结构体和类,以及动态内存管理,避免数组越界和内存泄漏。不断实践以巩固理论知识。
41 1
|
4月前
|
数据安全/隐私保护 C++
C++ 中的类是一种用户定义的数据类型,用于表示具有相似特征和行为的对象的模板。
C++ 中的类是一种用户定义的数据类型,用于表示具有相似特征和行为的对象的模板。