C++丨7丨用户自定义数据类型

用户自定义类型(user-defined type,UDT):

结构体(structure)共用体(union)枚举(enumeration)、类(class)等。


目录

结构体

声明结构体类型

定义变量

1。先声明结构体类型再定义变量

2。在声明类型的同时定义变量

结构体变量的初始化

引用结构体变量

1。赋值

2。引用结构体变量中的成员的值

结构体数组

指向结构体变量的指针

结构体类型数据作为函数参数

1。用结构体变量名作参数(推荐指数:★☆☆)

2。用指向结构体变量的指针作实参 ★★☆

3。用结构体变量的引用做函数参数 ★★★

用new和delete运算符进行动态分配和撤销存储空间

new

delete

枚举类型

声明枚举类型

PS:关于枚举元素:

定义变量

用typedef声明新的类型名

共同体


结构体 struct

声明结构体类型

关键字:struct

struct 结构体名
{
    结构体成员列表
};
struct Student // 声明一个结构体类型
{
    int num;
    char name[20];
}; // 注意有分号!

PS:

在C语言中,结构体的成员只能是数据。

而C++对此加以扩充,结构体的成员既可以包括数据,又可以包括函数。

PPS:

成员也可以是一个结构体变量。(套娃


定义变量

1。先声明结构体类型再定义变量

struct Student // 声明结构体类型
{
    int num;
    char name[20];
};

Student stu1, stu2; // 定义结构体变量

2。在声明类型的同时定义变量

struct Student // 声明结构体类型
{
    int num;
    char name[20];
} stu1, stu2; // 定义结构体变量

结构体变量的初始化

struct Student // 声明结构体类型
{
    int num;
    char name[20];
} stu1 = { 16,"chocolate" }; // 初始化

or

struct Student // 声明结构体类型
{
    int num;
    char name[20];
};

Student stu1 = { 16,"chocolate" }; // 初始化

引用结构体变量

1。赋值

stu1 = stu2;

2。引用结构体变量中的成员的值

stu1.name = "chocolate";
// . 成员运算符(优先级最最最高!)

结构体数组

struct Student // 声明结构体类型
{
    int num;
    char name[20];
};

Student stu[3] = { 1,"ku",2,"ruru",3,"ghost" }; // 定义+赋值

指向结构体变量的指针

struct Student // 声明结构体类型
{
    int num;
    char name[20];
};

Student stu;
Student* p = &stu; // 定义p为指向Student类型数据的指针变量并指向stu
使用时用:
(*p).num; 或 p->num; // 等价于 stu.num;
(*p)两侧的 () 不可以省略。因为 . 的优先级更高

结构体类型数据作为函数参数

1。用结构体变量名作参数(推荐指数:★☆☆)

值传递。

调用函数时要单独开辟内存单元,效率较低。

void F(Student stu) {
    cout << stu.num;
}
int main() {
    Student stu = { 16,"chocolate" }; // 初始化
    F(stu);
    return 0;
}

2。用指向结构体变量的指针作实参 ★★☆

实参将stu的起始地址传给形参,效率较高。

看程序时不够直观。

void F(Student* p) {
    cout << p->num;
}
int main() {
    Student stu = { 16,"chocolate" }; // 初始化
    Student* p = &stu; // 定义p为指向Student类型数据的指针变量并指向stu
    F(stu);
    return 0;
}

3。用结构体变量的引用做函数参数 ★★★

传递的是stu的地址,效率较高。

程序直观易懂,兼有(1)和(2)的有点。

void F(Student& stud) {
    cout << stud.num;
}
int main() {
    Student stu = { 16,"chocolate" }; // 初始化
    F(stu);
    return 0;
}

PS:引用作参很好用很好用! 在类中也很常用到!(指当传递的参数为类时)


用new和delete运算符进行动态分配和撤销存储空间

PS:new和delete是运算符

PPS:C语言中用的是库函数malloc和free。

new

new 类型 [初值]
new int(100); // 开辟存放一个整数的空间,并指定该整数的初值为100
              // 返回一个指向该存储空间的地址(指针)
new char[10]; // 开辟一个存放字符数组(包含10个元素)的空间
              // 返回字符数组首元素的地址(指针)
double* p = new double(3.14); // 一般会这么用

delete

对变量:
delete 指针变量
对数组:
delete [] 指针变量

枚举类型 enum

声明枚举类型

关键字:enum

enum 枚举类型名 {枚举常量表};
enum weekday { sun, mon, tue, wed, thu, fri, sat };

上面声明了一个枚举类型weekday,花括号中 sun, mon, ..., sat, 等称为枚举元素 or 枚举常量

PS:关于枚举元素:

1。枚举元素作为常量,它们是有值的。其值是一个整数,编译系统按定义时的顺序对它们赋值为0,1,2,3...。

2。输出的时候也是输出整数而不是元素的名称。

3。也可以在声明枚举类型时自己指定枚举元素的值,如:

enum weekday { sun = 7, mon = 1, tue, wed, thu, fri, sat };

指定sun为7,mon为1,后面的从mon开始按顺序+1。

4。枚举值可以用来做比较判断。

5。不可以把一个整数直接赋值给一个枚举类型。

workday = tue; // (v)
workday = 2;   // (x)

定义变量

声明之后,可以用它来定义变量:

weekday workday;
// C语言中写法:enum weekday workday;

枚举变量的值只能是sun到sat之一。

workday = mon;

也可以在声明枚举类型的同时定义枚举变量:

enum weekday { sun, mon, tue, wed, thu, fri, sat } workday;

用typedef声明新的类型名

关键字:typedef

typedef int INT // 指定用标识符INT代表int类型

效果:

int a, b;
INT a, b;

以上两行是等价的!

PS:并不是多出了新的类型。只是给原有的类型加了个别名!

对结构体类型声明一个新的名字:

typedef struct date {
	int month;
    int day;
} DATE; // 此处因为有typedef,所以DATE是date的别名。
// 如果不加typedef,那么表达的含义为DATE是一个结构体变量。

DATE bday; // 等价于 date bday;

PS:对结构体类型或类用typedef的时候很容易出错!(I mean 粗心)

具体可以参考《Ruru的C++报错日常》


共同体 union

书上好像没有这玩意...?

共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其·中·一·种类型。(结构体可以同时存储很多类型)

我的理解大概是,一个块里放放着一堆可能使用到的成员,但是共同体只能记录下其中一个(最后赋值的)成员!

PS:共用体的长度为其最大成员的长度。因为共同体每次只能存储一个值,因此它必须有足够的空间来存储最大的成员,所以取最大值。

共用体类型数据的特点

(1)使用共用体变量的目的是希望用同一个内存段存放几种不同类型的数据。但请注意,在每一瞬时只能存放其中一种,而不是同时存放几种。

(2)能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后,原有的成员就失去作用。

(3)共用体变量的地址和它的各成员的地址都是同一地址。

(4)不能对共用体变量名赋值;不能企图引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。

(5)共用体和结构体可以互相嵌套。
 

参考:

c++共同体_zzxiaoma的技术博客_51CTO博客

C++学习笔记 --- 共同体和结构体_c++ 共同体的意义_昆山人在上海的博客-CSDN博客

学习笔记 | C++共用体类型union_大虎牙的博客-CSDN博客


- END -

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值