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;
  1. struct 关键字开头

  2. 然后是结构体的名字 type_name

  3. 紧接着用大括号把一些变量定义扩起来

  4. 大括号之后可以有选择性的定义一个该结构体的名字

  5. 最后不要忘记分号 (;)

我们可以看到,因为分号的存在,其实这只是一个语句,我们姑且称之为 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;

访问结构成员

可以使用点号 ( . ) 来访问结构体变量的成员

点号(.) 也称之为 成员访问运算符 (.)

例如,要访问变量 book1author 变量,可以使用 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 , 放在书架 前端技术 , 作者是:简单教程

C++ 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.