C++ 结构体
C++ 中的数组可以存储多个相同类型的数据,但它无法存储不同类型的数据,比如
int a[4]; a[0] = 1; a[1] = 2; a[2] = 3.14; // 错误,类型不同 a[3] = "Hello"; // 错误,类型不同
如果我们要定义一本书的 标题
、作者
、分类
、出版时间
、书号(isbn)
,一般会怎么做呢
char* title; char* author; char* category; int isbn;
如果有很多书,那么
char* title_1; char* author_1; char* category_1; int isbn_1; char* title_2; char* author_2; char* category_2; int isbn_2;
变量个数 = 书本的数量 x 4,想象下有 100 本,那将有 400 个变量
当然了,还有优化的遗地,就是用数组
char* title[100]; char* author[100]; char* category[100]; int isbn[100];
是不是感觉很别扭,填充的时候万一开了个小差,数据就全乱了,难道就不能这样子
Book = { char* title; char* author; char* category; int isbn; }
把它们放在一起,然后取个名字 Book
,然后在创建一个数组
Book book[100];
结构体 ( struct
) 就因此而诞生了
结构体是 C++ 中另一种用户自定义的可用的数据类型,允许存储不同类型的数据项
结构体用于存储一组相关的数据项,或者说是把一组相关的变量组合在一起,并且给一个名称
定义结构体
C++ 提供了关键字 struct
用于定义一个结构体
struct
关键字定义结构体的语法格式如下
struct type_name { member_type1 member_name1; member_type2 member_name2; member_type3 member_name3; . . } object_names;
-
以
struct
关键字开头 -
然后是结构体的名字
type_name
-
紧接着用大括号把一些变量定义扩起来
-
大括号之后可以有选择性的定义一个该结构体的名字
-
最后不要忘记分号 (
;
)
我们可以看到,因为分号的存在,其实这只是一个语句,我们姑且称之为 struct
语句吧
struct
语句定义了一个包含多个成员的新的数据类型
作为练手,我们就用 struct
语句来解决我们上面提出的定义一本书
struct Book { const char* title; const char* author; const char* category; int isbn; };
然后我们就可以使用 Book
来定义一个书的变量了
定义结构体变量
定义一个结构体变量和定义一个基本类型的变量没什么不同
只不过要加上 struct
关键字
int age = 27; // 定义一个基本类型 int 的变量 age struct Book book1; // 定义一个结构体 Book 的变量 book1;
当然了,C++ 肯定也会想到了我们很懒,所以去掉 struct
关键字也是可以的
Book book2; // 定义一个结构体 Book 的变量 book1;
其实还可以在定义结构体 Book
的时候顺便定义一两个变量;
struct Book { const char* title; const char* author; const char* category; int isbn; } book1, book2;
访问结构成员
可以使用点号 ( .
) 来访问结构体变量的成员
点号(.) 也称之为 成员访问运算符 (.)
例如,要访问变量 book1
的 author
变量,可以使用 book1.author
我们写一个范例来演示下结构体的定义和结构体变量的定义
/** * file: main.cpp * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <iostream> // 定义一个结构体 Book 顺带定义一个变量 book1; struct Book { const char* title; const char* author; const char* category; int isbn; } book1; int main(){ struct Book book2; Book book3; //定义一个 结构体 Book 数组 struct Book books[3]; book1.title = "C++ 基础教程"; book1.author = "简单教程"; book1.category = "后端技术"; book1.isbn = 1; book2.title = "Swift 基础教程"; book2.author = "简单教程"; book2.category = "APP 开发"; book2.isbn = 2; book3.title = "HTML 基础教程"; book3.author = "简单教程"; book3.category = "前端技术"; book3.isbn = 3; books[0] = book1; books[1] = book2; books[2] = book3; for (int i = 0; i < 3; i++ ) { std::cout << books[i].title << "的编号是: " << books[i].isbn; std::cout << " , 放在书架 " << books[i].category; std::cout << " , 作者是:" << books[i].author; std::cout << std::endl; } }
编译和运行以上范例,输出结果如下
C++ 基础教程的编号是: 1 , 放在书架 后端技术 , 作者是:简单教程 Swift 基础教程的编号是: 2 , 放在书架 APP 开发 , 作者是:简单教程 HTML 基础教程的编号是: 3 , 放在书架 前端技术 , 作者是:简单教程
结构体作为函数参数
既然自定义的结构体也是一种数据类型,那么它当然也可以作为函数的参数
/** * file: main.cpp * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <iostream> // 定义一个结构体 Book 顺带定义一个变量 book1; struct Book { const char* title; const char* author; const char* category; int isbn; }; // 定义一个函数来输出结构体 Book 内容 void echo_book(struct Book book ) { std::cout << book.title << "的编号是: " << book.isbn; std::cout << " , 放在书架 " << book.category; std::cout << " , 作者是:" << book.author; std::cout << std::endl; } int main(){ struct Book books[3]; books[0].title = "C++ 基础教程"; books[0].author = "简单教程"; books[0].category = "后端技术"; books[0].isbn = 1; books[1].title = "Swift 基础教程"; books[1].author = "简单教程"; books[1].category = "APP 开发"; books[1].isbn = 2; books[2].title = "HTML 基础教程"; books[2].author = "简单教程"; books[2].category = "前端技术"; books[2].isbn = 3; for (int i = 0; i < 3; i++ ) { echo_book(books[i]); } }
编译和运行以上范例,输出结果如下
C++ 基础教程的编号是: 1 , 放在书架 后端技术 , 作者是:简单教程 Swift 基础教程的编号是: 2 , 放在书架 APP 开发 , 作者是:简单教程 HTML 基础教程的编号是: 3 , 放在书架 前端技术 , 作者是:简单教程
指向结构体的指针
结构体作为一种自定义类型,当然也享有被定义为指针的待遇
C++ 允许定义指向结构的指针,方式与定义指向基础类型变量的指针类似
struct Book *ptr_book;
然后我们就可以在 ptr_book
中存储结构体 Book 变量的地址了
获得结构体变量的地址和获取基本类型变量的地址一样,都是使用 &
符号
ptr_book = &book1;
当然了,访问结构体指针中的结构体体成员,则必须使用 ->
代替 .
号了
ptr_book->title;
说了这么多,我们写一个范例来演示一下
/** * file: main.cpp * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <iostream> // 定义一个结构体 Book 顺带定义一个变量 book1; struct Book { const char* title; const char* author; const char* category; int isbn; }; // 定义一个函数来输出结构体 Book 内容 void echo_book(struct Book *book ) { std::cout << book->title << "的编号是: " << book->isbn; std::cout << " , 放在书架 " << book->category; std::cout << " , 作者是:" << book->author; std::cout << std::endl; } int main(){ struct Book books[3]; books[0].title = "C++ 基础教程"; books[0].author = "简单教程"; books[0].category = "后端技术"; books[0].isbn = 1; books[1].title = "Swift 基础教程"; books[1].author = "简单教程"; books[1].category = "APP 开发"; books[1].isbn = 2; books[2].title = "HTML 基础教程"; books[2].author = "简单教程"; books[2].category = "前端技术"; books[2].isbn = 3; for (int i = 0; i < 3; i++ ) { echo_book(&books[i]); } }
编译和运行以上范例,输出结果如下
C++ 基础教程的编号是: 1 , 放在书架 后端技术 , 作者是:简单教程 Swift 基础教程的编号是: 2 , 放在书架 APP 开发 , 作者是:简单教程 HTML 基础教程的编号是: 3 , 放在书架 前端技术 , 作者是:简单教程