C++学习要点总结(第四章)(二)

4.4 结构简介

结构是一个比数组更灵活的数据格式,因为同一个结构可以存储多种类型的数据。

结构是用户定义的类型,而结构声明定义了这种类型的数据属性。

struct inflatable

{

char name[100];

double price;

float volum;

int num;

};

关键字struct表明,这些代码定义的是一个结构的布局,标识符inflatable是这种数据格式的名称,因此新类型的名称为inflatable。

定义结构后,便可以创建这种类型的变量了,如 inflatable hats; 并可以使用成员运算符(.)来访问各个成员。例如 hats.num就是访问的是结构的num成员。此时hats.num是一个int变量。

4.4.1 在程序中使用结构

下面一段代码展示了如何使用结构体结构。

#include<iostream>
using namespace std;
struct inflatable
{
	char name[20];
	float volume;
	double price;
};
int main()
{
	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()的里面,被称为是内部声明。外部声明可以被其后面的任何函数使用,而内部声明只能被该声明所属的函数使用。在大多数情况下,应使用外部声明比较好。

4.4.2 C++结构初始化

  1. 与数组一样,C++11也支持将列表初始化用于结构,且等号是可选的。
  2. 如果大括号内未包含任何东西,各个成员都将被设置为0。
  3. 不允许缩窄转换。(从浮点数转换为整数,从取值范围大的浮点数转换为取值范围小的浮点数(在编译期可以计算并且不会溢出的表达式除外),从整数转换为浮点数(在编译期可以计算并且转换之后值不变的表达式除外),从取值范围大的整数转换为取值范围小的整数(在编译期可以计算并且不会溢出的表达式除外))

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

可以将string类作为成员。

4.4.4 其他结构属性

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

下面一段代码将展示该赋值。

#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 $";
	cout << bouquet.price << endl;
	choice = bouquet;
	cout << "choice :" << choice.name << " for $";
	cout << choice.price << endl;
	return 0;
}

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

struct inflatable

{

int num;

float price;

} mybaby, likefood;

还可以使用如下的方式创建变量。

struct perks

{

int num;

float price;

} mybaby=
{

7,

1.3

};

4.4.5 结构数组

要创建一个包含100个inflatable结构的数组可以写成:inflatable gifts[100];gifts将是一个inflatable数组,其中每一个元素都是inflatable对象。可以与成员运算符一起使用。如cin>>gifts[0].volume;

注意:gifts.volume表述无效。因为gifts本身就是一个数组。

下面一段代码将展示如何正确使用结构数组。

#include<iostream>
using namespace std;
struct inflatable
{
	char name[20];
	float volume;
	double price;
};
int main()
{
	inflatable guests[2] =
	{
		{"Bambi",0.5,21.99},
		{"Gpdzilla",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";
	return 0;
}

4.4.6 结构中的位字段

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

4.5 共用体

共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中一种类型。即结构体可以同时存储int、long和double,共用体只能存储int、long或double。

例如,union abc{ int dessert; double flowers; long apples;}; abc pail;

pail有时可以是int变量而有时又可以是double变量。

注意:共用体的长度为其最大成员的长度。

共用体的用途之一是,当数据项使用两种或更多格式(但不会同时使用)时,可节省空间。

共用体常用于节省内存,另外,共用体常用于操作系统数据结构或硬件数据结构。

4.6 枚举

C++的enum工具提供了另一种创建符号常量的方式,这种方式可以代替const。使用enum的句法与使用结构相似。例如,enum spectrum{red,yellow,green,violet}; red,yellow,green,violet为符号常量,它们对应整数值为0-7.这些常量叫做枚举量。在默认情况下,将整数值赋给枚举量,第一个枚举量为0,第二个枚举量为1,以此类推。

枚举量是整型,可被提升为int类型,但int类型不能自动转换为枚举类型。如果int值是有效的,则可以通过强制类型转换将它赋给枚举变量,例如 spectrum band;band=spectrum(3);

4.6.1 设置枚举量的值

可以使用赋值运算符来显式地设置枚举量的值。

enum bite{one=1,two=2,four=4};

指定的值必须是整数。

可以创建多个值相同的枚举量。

4.6.2 枚举的取值范围

要找出上限,需要知道枚举量的最大值。找到大于这个最大值的、最小值的2的幂将它减去1,得到的便是取值范围的上限。例如某枚举定义的最大枚举值为110,在2的幂中比这个数大的最小值为128,因此取值范围的上限为127。选择用多少空间来存储枚举由编译器决定。对于取值范围较小的枚举,使用一个字节或更小的空间;而对于包含long类型值的枚举,则使用4个字节。

4.7 指针和自由存储空间

指针是一个变量,其存储的是值的地址,而不是值的本身。只需使用取地址符(&)就可以获取变量的地址。

下面一段代码演示了这个运算符的用法。

#include<iostream>
using namespace std;
int main()
{
	int donuts = 6;
	double cups = 4.5;
	cout << "donuts value= " << donuts;
	cout << " and donuts address = " << unsigned(&donuts) << endl;
	cout << " cups value = " << cups;
	cout << " and cups address= " << unsigned(&cups) << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值