C++每日一课(十二)

结构体
数组,可以一次性存储多个元素,但是所有的元素都必须是同一种类型。
C++中的结构体则比数组更为灵活,它可以一次性存储多种类型的数据,比如可以把一个学生的信息存储在结构体当中。如果想存储一个班级所有学生的信息则可以使用结构体数组来存储。


结构是用户定义的类型,而结构声明定义了这种类型的数据属性。声明类型后,就可以使用这种类型来创建变量
创建结构包含两步:
1.定义结构描述,描述并标记了能存储在结构中的各种数据类型。
2.按描述创建结构变量


比如:学生信息可以如下声明结构
struct stu
{
   int uid;
   char name[20];
   char addr[128];
   int age;
   char tel[11];
};


关键定:struct,表明这些代码定义的是一个结构的布局。标识符stu是这种数据格式的名称,因而新类型的名称就是stu.


{} 这个之间包含的是结构存储的数据类型的列表,其中每一个列表项都是一条声明语句。列表中的每一项和称为结构成员。
创建结构变量
stu zhangsan;
stu xiaoxie;
与C的风格一样的还可以如下创建变量:struct stu lisi;
如上面zhangsan这个变量的类型是stu,因而可以使用成员运算符.来访问各个成员。
zhangsan.uid;则表示要访问uid这个成员,这种访问就像是索引可以访问数组中指定的元素一样


/*
作者:xiesheng
时间:2017-07-03
版本:v1.0
说明:结构体
*/


#include <iostream>
struct stu
{
	long uid;
	char name[20];
	char addr[128];
	int age;
};


int main() {


	using namespace std;


	stu zhnagsan = {
		1,
		"张三",
		"湖南省.长沙市",
		30
	};	


	stu lisi = {
		2,
		"李四",
		"广东省.广州市",
		31
	};


	cout << "zhangsan的信息如下:" << endl;
	cout << "编号:" << zhnagsan.uid << endl;
	cout << "姓名:" << zhnagsan.name << endl;
	cout << "住址:" << zhnagsan.addr << endl;
	cout << "年龄:" << zhnagsan.age << endl;


	cout << "lisi的信息如下:" << endl;
	cout << "编号:" << lisi.uid << endl;
	cout << "姓名:" << lisi.name << endl;
	cout << "住址:" << lisi.addr << endl;
	cout << "年龄:" << lisi.age << endl;


	system("pause");
	return 0;
}



zhangsan的信息如下:
编号:1
姓名:张三
住址:湖南省.长沙市
年龄:30
lisi的信息如下:
编号:2
姓名:李四
住址:广东省.广州市
年龄:31
请按任意键继续. . .


注意:程序中struct结构体的声明位置在mian函数的前面这种声明称为外部声明,这种外部声明的可以被后面的任何函数所用。
如果我们把struct结构体的声明放在函数的内部则只能在声明它的函数中可以使用。


在C++中变量也是可以在函数内部和外部定义,外部变量邮所有的函数共享,但是在C++中是不提倡使用外部变量的,但是提倡使用外部结构声明。


结构变量的初始化,与数组的初始化方式类似,都是使用逗号分隔值列表,并把这些值使用花括号括起来。
当然C++中也是支持把列表初始化用于结构,并且等号(=)是可选的
比如:stu wangwu{3,"王五","湖北省.武汉市",25};
如果在大括号中未包含任何东西的时候,各个成员都会被设置为零。
初始化的过程中是不允许进行缩窄转换的。


结构中也是可以把string作为成员的
比如
struct std
{
   long uid;
   std::string name;
   std::string addr;
   int age;
};
如上是可以的,一定要注意必须要让结构定义可以访问到名称空间Std,或者把using指令放在结构定义之前。


结构体中的其它属性
1.可以把结构作为参数传递给一个函数
2.可以让一个函数返回一个结构
3.可以使用赋值运算符=把结构赋值给另一个同类型的结构变量,这种赋值称为成员赋值
4.在定义结构时可以同时创建结构变量并且还可以同时进行初始化


struct std
{
   long uid;
   char name[20];
   char addr[128];
   int age;
} zhangsan,lisi;




struct std
{
   long uid;
   char name[20];
   char addr[128];
   int age;
} zhangsan =
{
  1,
  "张三",
  "hunana",
  30
};


结构定义与变量的声明可以放在一起,但是这不提倡,把它们分开来更加易于阅读和理解。


声明结构时还可以声明没有名称的结构类型,也不是说声明的时候没有结构的名称,同时定义一个结构类型和一个这种类型的变量


struct
{
  int x;
  int y;
} position;


如上则创建了一个名为position的结构变量,之后可以使用position来访问其中的成员,但在此后就无法再创建这种类型的变量了。
可以创建一个元素为结构的数组,其数组中每个元素的类型都是一个结构体,那么想要访问成员的时候需要先指定数组哪个索引下的结构再使用.运算符引用
对于结构数组的初始化,可以结合使用初始化数组的规则与初始化结构的规则一起来进行初始化。
/*
作者:xiesheng
时间:2017-07-03
版本:v1.0
说明:结构体
*/


#include <iostream>


struct stu1
{
	char name[20];
	float weight;
	double height;
};
int main() {
	using namespace std;


	stu1 s[2] = 
	{
		{"张三",60.5f,165.5},
		{"李四",72.6f,175.6}
	};


	cout << "请出结构体变量s中第二个元素的值:" << endl;
	cout << "姓名:" << s[1].name << endl << "体重:" << s[1].weight << endl << "身高:" << s[1].height << endl;


	system("pause");
	return 0;
}





请出结构体变量s中第二个元素的值:
姓名:李四
体重:72.6
身高:175.6
请按任意键继续. . .




结构体中的位字段
与C一样C++中可以指定占用特定位数的结构成员,这使得创建与某个硬件设备上的寄存器对应的数据结构非常方便。字段的类型应为整型或枚举,接下来是冒号,冒号后面是一个数字,这个数字指定了使用的位数
可以使用没有名称的字段来提供间距,每一个成员都被称之为位字段bit field


struct torgle
{
    unsigned int SN:4;
    unsigned int : 4
    bool goodIn:1;
    bool goodTorgle:1;
};


通过上面的声明后可以和普通的结构体一样来进行初始化和访问成员
torgle tr = {1,true,false};
访问
if(tr.goodIn){
....
}
一般来说位字段通常时用在低级编程当中。

猜你喜欢

转载自blog.csdn.net/advent86/article/details/74279369