C++初学(9)

9.1、结构简介

虽然数组能够和存储多个元素,但所有元素必须相同,也就是说,同一个数组不能既存放int类型也存放float类型,而C++的结构可以满足要求。结构是一种比数组更灵活的数据格式,因为同一个结构可以存储多种类型的数据。

下面给个结构:

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

关键字struct表明,这些代码定义的是一个结构。标识符inflatable是这种数据格式的名称,因次新类型的名称为inflatable。这样就可以像创建char或int类型那样创建inflatable类型的变量。该结构里面的char数组、一个float和一个double每一项都被称为结构成员。

inflatable hat;
inflatable woopie_cushion;
inflatable mainframe;

C++允许在声明变量中时省略关键字struct,在C++中,结构标记的用法与基本类型名相同。

由于hat的类型是inflatable,因此可以用成员运算符(.)来访问各个成员。hat是一个结构,hat.price是一个double类型的变量,可以通过成员名来访问结构的成员。

9.1.1、在程序中使用结构

下面给一个程序:

#include <iostream>
struct inflatable
{
	char name[20];
	float volume;
	double price;
};

int main()
{
	using namespace std;
	inflatable guest =
	{
		"Glorious Gloria",
		1.88,
		29.99
	};
	inflatable pal =
	{
		"Audacious Arthur",
		3.12,
		32.99
	};
	cout << "Expand your guest list with " << guest.name;
	cout << " and " << pal.name << "!" << endl;
	cout << "You can have both for $";
	cout << guest.price + pal.price << "!" << endl;

	return 0;
}

结构声明的位置很重要。对于程序来说,有两种选择。一种是将声明放在main()函数中,紧跟在开始括号的后面;另一种选择是将声明放到main()的前面。

该程序用的是第二种,被称为外部声明(当然还有一种说法是全局声明)。第一种则被称为内部声明。两者来说差别挺大的,外部声明可以被其后面的任意函数使用,而内部声明只能被该声明所属的函数使用。因此我们一般用外部声明。

结构的初始化方式:

inflatable guest =
{
	"Glorious Gloria",
	1.88,
	29.99
};

和数组一样,使用有逗号分隔值列表,并将这些值用花括号括起。在该程序中,每个值占一行,但也可以将它们全部放到同一行中。只是应用逗号将它们分开:

inflatable duck={"Daphne",0.12,9.98};

9.1.2、C++11结构初始化

与数组一样,C++也支持将列表初始化用于结构,且等号(=)是可选的:

inflatable duck{"Daphne",0.12,9.98};

如果大括号内没有任何东西,各个成员都将被设置为0。

9.1.3、结构可以将string类作为成员吗

答案是可以的。一定要让结构定义能够访问名称空间std。可以将using namespace std;放到结构初始化前面,或者将name的类型声明为std::string。

9.1.4、其他结构属性

C++可以将结构作为参数传递给函数,也可以让函数返回一个结构。另外,还可以使用赋值运算符(=)将结构赋给另一个同类型的结构,这样结构中每个成员都被设置为另一个结构中相应成员的值,即使成员是数组。这种赋值被称为成员赋值。

下面给一段代码:

#include <iostream>
struct inflatable
{
	char name[20];
	float volume;
	double price;
};
int main()
{
	using namespace std;
	inflatable bouquet =
	{
		"sunflowers",
		0.20,
		12.49
	};
	inflatable choice;
	cout << "bouquet: " << bouquet.name << " for $";
	cout << bouquet.price << endl;

	choice = bouquet;
	cout << "choice: " << choice.name << " for $";
	cout << choice.price << endl;
	return 0;
}

从中可以看出,成员赋值是有效的,因为choice结构的成员值和bouquet结构中的值相同。

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

struct perks
{
   int key_number;
   char car[10];
}my_smith,my_opinion;

然而将结构变量和变量声明分开,可以使程序更易于阅读和理解。C语言介绍结构体时应该会教一下创建单独的结构变量,后面可能不会这么创建。

9.1.5、结构数组

inflatable结构包含一个数组,当然我们也可以创建元素为结构的数组,方法和创建基本类型数组完全相同。例如:

inflatable gifts[100];

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

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

注意:gifts是一个数组,不是结构!不是结构!不是结构!因此gifts.price是无效的。

要初始化结构数组,可以使用初始化数组的规则和初始化结构的规则。由于数组中的每个元素都是结构,因此可以使用结构初始化的方式来提供它的值。

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

#include <iostream>
struct inflatable
{
	char name[20];
	float voulume;
	double price;
};
int main()
{
	using namespace std;
	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].voulume + guests[1].voulume << " cubic feet." << endl;
	return 0;
}

9.1.6、结构中的为字段

C++允许指定占用特定位数的结构成员,这使得创建与某个硬件设备上的寄存器对应的数据结构非常方便。字段的类型应为整型或枚举,接下来是冒号,冒号后面是一个数字,它指定了使用的位数。每个成员都被称为位字段。下面是一个例子:

struct torgle_register
{
   unsigned int SN:4;
   unsigned int :4;
   bool goodIn:1;
   bool goodTorgle:1;
};
相关推荐
暗黑起源喵5 分钟前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong9 分钟前
Java反射
java·开发语言·反射
Troc_wangpeng11 分钟前
R language 关于二维平面直角坐标系的制作
开发语言·机器学习
努力的家伙是不讨厌的12 分钟前
解析json导出csv或者直接入库
开发语言·python·json
Envyᥫᩣ26 分钟前
C#语言:从入门到精通
开发语言·c#
童先生1 小时前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu1 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会1 小时前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香1 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv