【C++ Primer Plus学习记录】结构简介

目录

1.在程序中使用结构

2.结构可以将string类作为成员吗

3.其他结构属性

4.同时完成定义结构和创建结构变量

5.结构数组


假设要存储有关篮球运动员的信息,则可能需要存储他(她)的姓名、工资、身高、体重等。希望有一种数据格式可以将所有这些信息存储在一个单元中。数组不能完成这项任务,因为虽然数组可以存储多个元素,但所有元素的类型必须相同。

C++中的结构可以满足要求。

结构是一种比数组更灵活的数据格式,因为同一个结构可以存储多种类型的数据,这使得能够将有关篮球运动员的信息放在一个结构中,从而将数据的表示合并到一起。如果要跟踪整个球队,则可以使用结构数组。

结构是用户定义的类型,而结构声明定义了这种类型的数据属性。定义了类型后,便可以创建这种类型的变量。因此,创建结构包括两步。首先,定义结构描述——它描述并标记了能够存储在结构中的各种数据类型。然后按描述创建结构变量(结构数据对象)。

例如,假设Bloataire公司要创建一种类型来描述其生产线上充气产品的成员。具体地说,这种类型应存储产品名称、容量(单位为立方英尺)和售价。下面的结构描述能够满足这些要求:

struct inflatable  //structure declaration
{
char name[20];//结构成员
flaot volume;//结构成员
double price;//结构成员
}

关键字struct表明,这些代码定义的是一个结构的布局。

定义结构后,便可以创建这种类型的变量了:

inflatable hat;//hat is a structure variable of type inflatable
inflatable woopie_cushion;//type inflatable variable
inflatable mainframe;//type inflatable variable

C++允许在声明结构变量时省略关键字struct

由于hat的类型为inflatable,因此可以使用成员运算符(.)来访问各个成员。例如,hat.volume指的是结构的volume成员,hat.price指的是price成员。总之,通过成员名能够访问结构的成员,就像通过索引能够访问数组的元素一样。由于price成员被声明为double类型,因此hat.price相当于是double类型的变量,可以像使用常规double变量那样来使用它们。

访问类成员函数(如cin.getline())的方式是从访问结构成员变量的方式衍生而来的。

1.在程序中使用结构

//4.11 说明了有关结构的一些问题,还演示了如何初始化结构
#include<iostream>
using namespace std;

struct inflatable   //structure declaration,在main()函数之外
{
	char name[20];
	float volume;
	double price;
};  //注意这里有“;”

int main()
{
	//创建结构变量在main函数中
	inflatable guest = 
	{
		"Glorious Gloria", //注意这里的双引号,逗号
		1.88,
		29.99
	};//guest是一个结构型变量

	inflatable pal = 
	{
		"Audacioous Arthur",
		3.12,
		32.99
	};

	cout << "Expand your guest list with " << guest.name;
	cout << " and " << pal.name << "!\n";
	cout << "You can have both for $";
	cout << guest.price + pal.price << "!" << endl;

	system("pause");
	return 0;
}

结构声明的位置很重要。可以有两种选择:(1)将声明放在main()函数中,紧跟在开始括号的后面,这种称为内部声明;(2)将声明放到main()函数的前面,如上述程序4.11中,位于函数外面的声明被称为外部声明。对于那些包含两个或更多函数的程序来说,声明的位置很重要。外部声明可以被其后面的任何函数使用,而内部声明只能被该声明所属的函数使用。通常应使用外部声明,这样所有函数都可以使用这种类型的结构。

变量也可以在函数内部和外部定义,外部变量由所有的函数共享(将在第9章介绍)。在外部声明符号常量更合理。

2.结构可以将string类作为成员吗

可以将成员name指定为string对象而不是字符数组吗?即可以像下面这样声明结构吗?

#include<string>
struct inflatable
{
std::string name;
float volume;
doouble price;
};

当然可以。只要您使用的编译器支持对以string对象作为成员的结构进行初始化。

一定要让结构定义能够访问名称空间std。为此,可以将编译指令using移到结构定义之前;也可以像上面一样,将name的类型声明为std::string。

3.其他结构属性

可以将结构作为参数传递给函数,也可以让函数返回一个结构。

还可以使用赋值运算符(=)将结构赋给另一个同类型的结构,这样结构中每个成员都将被设置为另一个结构中相应成员的值,即使成员是数组。这种赋值被称为成员赋值。

//4.12 结构赋值
#include<iostream>
using namespace std;

struct inflatable
{
	char name[20];
	float volume;
	double price;
};

int main()
{
	inflatable bouquet =
	{
		"sunflowers",
		0.20,
		12.49
	};
	inflatable choice;
	cout << "bouquet: " << bouquet.name << " for $" << bouquet.price << endl;

	choice = bouquet;//assign one structure to another
	cout << "choice: " << choice.name << " for $" << choice.price << endl;

	system("pause");
	return 0;
}

4.同时完成定义结构和创建结构变量

可以同时完成定义结构和创建结构变量的工作。只需将变量名放在结束括号的后面即可:

struct perks
{
int key_number;
char car[12];
}mr_smith,ms_jones;  //two perks variables

甚至可以初始化以这种方式创建的变量:

struct perks
{
int key_number;
char car[12];
}mr_glitz = 
{
7,
"Packard"
};

5.结构数组

可以创建元素为结构的数组,方法和创建基本类型数组完全相同。例如,要创建一个包含100个inflatable结构的数组,可以这样做:

inflatable gifts[100];

gifts将是一个inflatable数组,其中的每个元素都是inflatable对象,可以与成员运算符一起使用:

cin >> gifts[0].volume;
cout << gifts[99].price << endl;

要初始化结构数组,可以结合使用初始化数组的规则(用逗号分隔每个元素的值,并将这些值用花括号括起)和初始化结构的规则(用逗号分隔每个成员的值,并将这些值用花括号括起)。由于数组中的每个元素都是结构,因此可以使用结构初始化的方式来提供它的值。如下:

inflatable guests[2]=
{
   {"Bambi",0.5,21.99},
   {"Godzilla",2000,565.99}
};

例4.13是一个使用结构数组的简短示例。

//4.13使用结构数组的简短示例
#include<iostream>
using namespace std;

struct inflatable
{
	char name[20];
	float volume;
	double price;
};

int main()
{
	inflatable guests[2] =
	{
		{ "Bambi", 0.5, 21.99 },
		{ "Godzilla", 2000, 565.99 }
	};

	cout << "The guests " << guests[0].name << " and " << guests[1].name << "\nhave a combined volume of " << guests[0].volume + guests[1].volume << " cubic feet.\n";
	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值