复合类型: 结构
定义:
- 是一种比数组更灵活的数据格式,因为同一种结构可以存储多种数据类型
- 是 c++ OOP的基础 (oop 面向对象)
- 用户自定义数据类型 (定义一个结构,可以创建这种的类型的变量)
声明结构/结构变量方法:
遵循两个步骤:
- a 定义结构描述,描述并标记了能够存储在结构种的各种数据类型
- b 按描述创建结构变量 (结构数据对象)
-
不带有结构变量声明方式:
struct <结构名>{ // 使用struct 声明结构
// 数据类型列表:每个列表项都是一条声明语句
[成员数据类型] [成员变量名称];
…
}; -
带有结构变量声明方式:
struct <结构名>{ // 使用struct 声明结构
// 数据类型列表:每个列表项都是一条声明语句
[成员数据类型] [成员变量名称];
…
}<结构变量1>,<结构变量n>;// 示例: struct inflatable{ char name[20]; float volume; double price; }coat = { // 对结构变量coat赋值 "coat", 4, 30 }; // 将结构变量和结构同时定义
-
另一种创建结构变量方式:
struct [结构类型名] [变量名]; // c++ 中struct可省略
//示例: inflatable hat = { //通过定义的结构inflable创建结构变量hat,此处struct 被省略 "hat", 3, 20 };
-
声明结构变量的位置:
a. 内部声明: 声明在main() 一开始 , 这种声明变量作用域为 只能被该声 明所属的函数使用
b. 外部声明: 声明在main() 前面 , 这种声明变量作用域为 可以被后面的任何函数调用
注意点:1. c++不提倡使用外部声明结构变量,提倡使用外部结构声明; 2. 在外部声明符号常量也提倡
结构成员:
- 普通结构,使用 成员运算符 访问结构成员
- 结构指针,使用 箭头运算符 访问结构成员
结构数组:
- 定义: 创建数组类型的结构变量
- 声明并初始化:
a. 和初始化数组类似
b. 结构数组中每个元素都是一个结构,因此可以使用结构初始化的方式给其提供值
小憩一刻
小练一.
/*
* 1. 结构CandyBar 包含3个成员,
* 第一个成员存储了糖块的品牌 --- 字符串
* 第二个成员存储糖块的重量(可以有小数) --- double/float
* 第三块存储了糖块的卡路里含量(整数) --- int
* 请编写一个程序,声明这个结构,创建一个名为snack的CandyBar变量,
* 要求1 :
* 并将其成员分别初始化 Mocha Munch 2.3 350 .
* 初始化应在声明snack时进行
* 最后 程序显示snack 变量的内容
*
* 要求2 :
* 创建一个包含 3 个元素的CandyBar 数组, 并将他们初始化为所选择的值, 然后显示每个结构的内容
*
* 要求3 : --- 考察 动态数组
* 使用new来动态分配数组, 而不是声明一个包含3个元素的CandyBar数组
* */
#include "iostream"
#define SIZE 20 // 定义数组长度常量
struct CandyBar{ // 结构是自定义数据类型
char brand[20]; // 定义一个字符数组存放字符串
double weight;
int calorie;
};
struct CandyBar1{
char brand[20]; // 定义一个字符数组存放字符串
double weight;
int calorie;
}*candyBar1 = new CandyBar1[SIZE]; // 定义动态数组
int main() {
CandyBar snake = { // 初始化应在声明snack时进行
"Mocha Munch",
2.3,
350
}; // 注意 : c++ 每条语句结束以 分号 结尾
std::cout << "Snack name: " << snake.brand // 使用 成员访问运算符访问结构成员
<< ", weight: " << snake.weight
<< ", calorie: " << snake.calorie
<< std::endl;
CandyBar candyBar[3] ; // 用结构定义的数组:数组中的每一个元素都是一个结构类型
candyBar[0] = snake; // candyBar[0] 结构类型 snake 结构类型; 同类型之间才能赋值
candyBar[1] = snake;
candyBar[2] = snake;
std::cout << "Snack name: " << candyBar[0].brand // 使用 成员访问运算符访问结构成员: 访问结构数组candyBar中的成员
<< ", weight: " << candyBar[0].weight
<< ", calorie: " << candyBar[0].calorie
<< std::endl;
std::cin.get(candyBar1->brand, SIZE);
std::cin >> candyBar1->weight;
std::cin >> candyBar1->calorie;
candyBar1->brand[0] = 'a';
return 0;
}
小练二.
/*
* 2. william win-gate 从事披萨饼分析服务, 对于每个披萨饼 他都需要记录下列信息:
* 信息如下:
* 披萨饼公司名称 可以有多个单词组成
* 披萨饼的直径
* 披萨饼的重量
* 要求1 : --- 考察 结构
* 请设计一个能够存储这些信息的结构, 并编写一个使用这种结构变量的程序;
* 程序将请求用户输入上述信息, 然后显示这些信息
* 要求2 : --- 考察 结构指针
* 使用 new 来为结构分配内存, 而不是声明一个结构变量.
* 另外, 让程序在请求输入披萨饼公司名称之前输入披萨饼的直径
* */
#include "iostream"
struct service{ // 定义 service 结构 用于存放需要记录的信息
char company[20]; // 定义char 数组 存放公司名称
float diameter; // 定义float 存放直径
int weight; // 定义 int 存放重量
}company1; // 定义 未初始化的结构变量 company1
struct service1{
char company[20];
float diameter;
int weight;
}*company2 = new service1(); // 定义一个结构指针 company2 , 并通过new分配内存
// new 是给变量分别内存, 而不是给结构成员分配内存
int main(){ // McDonald
std::cout << "please input the name of company: ";
// std::cin.get(company1.company, 20) ; // 通过cin.get() 方法 输入值给 company1的成员company
std::cin.get(company2->company, 20); // 通过 箭头成员运算符访问结构指针成员
std::cout << "\n" << "please input diameter of pizza (cm) : ";
std::cin.ignore(); // 忽略前面语句留下的换行符
// std::cin >> company1.diameter;
std::cin >> company2->diameter;
std::cout << "\n" << "please input weight of pizza (kg): ";
std::cin.ignore(); // 忽略前面语句留下的换行符
// std::cin >> company1.weight;
std::cin >> company2->weight;
// std::cout << "\n" << "the name of company is : " << company1.company << '\t'
// << "diameter of pizza is " << company1.diameter << '\t'
// << "weight of pizza is " << company1.weight << '\t' ;
std::cout << "\n" << "the name of company is : " << company2->company << '\t'
<< "diameter of pizza is " << company2->diameter << '\t'
<< "weight of pizza is " << company2->weight << '\t' ;
delete company2; // 在程序结束使用delete释放new分配的内存, 避免程序导致内存泄露问题
std::cout << "\n" << "the name of company is : " << company2->company << '\t'
<< "diameter of pizza is " << company2->diameter << '\t'
<< "weight of pizza is " << company2->weight << '\t' ;
return 0;
}