C++中的结构

时间:2020-02-23 14:30:06  来源:igfitidea点击:

介绍

在本教程中,我们将学习C++中的结构基础,它们的工作原理以及它们的用法。
C++提供了可以由用户使用各种方法或者技术创建的自定义数据类型。
结构就是其中之一。
理解结构在铺平使用C++中的类和对象的道路上起着至关重要的作用。

C++中的结构是什么?

结构是相同名称的各种变量的分组。
在某些情况下,我们需要将逻辑上相关的元素放在一起,并将它们统一处理。

这个问题可以通过合并结构来解决。
可以使用关键字struct在C++中声明结构。
下面给出了相同的语法,

struct structure_name
{
  data_type1 ele1;
  ...
  data_typeN eleN;
}structure_variable,...;

其中

  • 关键字struct用于初始化结构structure_name,
  • 该结构包含各种元素,这些元素具有不同的数据类型或者类似的元素,其名称为ele1,…,直到eleN,
  • 顾名思义," structure_variable"是自定义数据类型structure_name的变量。
    注意:我们可以使用逗号(',')分隔多个结构变量,以声明多个结构变量。

记住,我们还可以使用下面给出的代码片段在结构声明之后声明一个结构变量,

structure_name variable_name;

结构要素

让我们考虑一个名为date的结构,以了解C++中的结构元素。

#include<iostream>
using namespace std;
struct date{   //declared date structure
  int dd;          //day
  int mm;          //month
  int yyyy;        //year
}birthday;  //variable birthday

int main()
{
	birthday.dd=1;     //initialisation of structure elements
	birthday.mm=1;
	birthday.yyyy=2001;
	cout<<"Birthday is on: "<<birthday.dd<<"/"<<birthday.mm<<"/"<<birthday.yyyy;  //accessing elements using . operator
	return 0;
}

输出:

Birthday is on: 1/1/2001

所以在上面的代码中

  • 我们已经声明了一个结构" date",其中包含dd,mm和yyyy元素,并存储了相应的日期,
  • 在main()函数内部,我们初始化结构变量Birthday的dd,mm和yyyy元素。
    这是通过使用"。
    "运算符从结构变量访问特定元素来完成的,
  • 此外,我们再次使用dot('。
    ')运算符打印整个生日,并获得所需的输出。

因此,通过这种方式,我们可以初始化以及访问结构的不同元素。
自己尝试以获得更好的理解。

C++中的嵌套结构

结构元素可以是简单或者复杂的。
它可以由本身就是复杂的元素组成,即结构或者数组等。
由这种元素组成的结构称为复杂结构。
而且,如果该结构将另一结构作为其元素之一,则我们将该集合称为嵌套结构。
看下面的例子,

#include<iostream>
using namespace std;
struct Addr{
	char area[20];
	char state[20];
	char country[20];
};
struct stud{             //stud structure declaration
	int roll;
	char name[30];
	Addr address;   //address is another structure variable of type Addr
};

int main() {
stud s1; //Declaring the object
}

您可以清楚地看到,这里的stud是一个结构,由另一个地址类型为Addr的结构变量组成。
这就是嵌套结构在C++中的样子。
下一节将讨论访问嵌套结构元素。

访问嵌套结构成员

如果您想访问嵌套结构的成员,则可以进一步使用点('。
')运算符。
例如,如果我们需要从上述代码的address变量中访问country元素,则可以使用以下代码段:

stud s1.address.country;

同样,我们可以通过以下方式将所有嵌套的结构元素一起初始化:

stud s2={ 10,"John",{ "Garia", "Kolkata", "San Franceco"} };

其中我们声明了另一个名为s2的数据类型为" stud"的结构变量,并使用一些值对其进行了初始化。

让我们使用上一节中的代码片段并访问嵌套变量:

#include<iostream>
using namespace std;
struct Addr{
	char area[20];
	char state[20];
	char country[20];
};
struct stud{             //stud structure declaration
	int roll;
	char name[30];
	Addr address;   //address is another structure variable of type Addr
};

int main() {
stud s1={ 10,"John",{ "Garia", "Kolkata", "San Franceco"} }; //Declaring Variable

cout<<s1.name<<"\n";
cout<<s1.address.area<<"\n";
cout<<s1.address.state<<"\n";
cout<<s1.address.country<<"\n";
return 0;
}

这样,我们可以打印以及初始化嵌套元素。

C++中的结构数组

我们知道数组包含一系列相似的类型元素。
因此,结构数组是仅包含结构类型元素的数组。

结构类型元素数组的声明与结构类型变量的声明相似。
只是我们需要指定数组的大小。
看下面的例子,

struct Addr{
	char area[20];
	char state[20];
	char country[20];
};
Addr Add[10];

  • 因此对于上面的示例," Addr"是一个包含3个元素的结构-区域,州和国家。

  • 我们声明类型结构Addr的数组成员,名为Add,大小为10。

  • 这意味着数组" Add [10]"现在可以存储10个结构类型变量,或者更具体地说,可以存储10个地址。

要访问数组的各个元素,我们可以再次使用"."运算符,但这一次我们需要提及数组索引。
让我们看看

Addr.Add[i].area

这样,我们访问存在于数组Add []的第i个位置的结构元素的区域。

将结构传递给函数

到目前为止,我们使用的是全局结构。
但是在许多情况下,我们可能需要将结构或者其元素传递给函数,以对它们执行任何操作,并在某些情况下返回一些值。
这可以通过将以下作为参数传递给函数来实现,

  • 功能的结构要素
  • 结构到函数
  • 结构到函数的数组

因此,现在让我们使用一些简单的示例来深入研究每种方法。

1.将结构元素传递给函数

我们可以通过为它们创建自己的副本(通过value调用)使它们接收值,从而将结构的所有元素传递给函数。
因此,在下面的示例中,

struct stud{
	int roll;
	char name[30];
	int marks[5];
};
stud s1;

我们可以通过按值调用方法将元素直接传递给函数,如下所示,

Function(s1.roll, s1.name, s1.marks);

对于上面的示例,该函数为各个元素创建自己的副本,现在可以在不更改实际地址中的值的情况下对其进行操作。

2.将结构传递给函数

看下面的示例,在这里我们尝试将整个结构传递给函数并相应地工作。

#include<iostream>
using namespace std;

struct stud{
	int roll;
	char name[30];
	int marks[5];
};
//function accepts the address of the structure s1 in a pointer type //variable s
void prnt(stud *s) 
{
	cout<<"\nStudent Details are printed below:\n";
	cout<<"Name : "<<s->name;
	cout<<"\nroll : "<<s->roll;
	cout<<"\nMarks for 5 subjects : ";
	for(int i=0;i<5;i++)
	{
		cout<<"\t"<<s->marks[i];
	}
}

int main()
{
	int i;
      stud s1; //structure variable declared
	cout<<"\nEnter student name : ";
	gets(s1.name);
	cout<<"\nEnter roll : ";
	cin>>s1.roll;
	cout<<"\n Enter 5 subject marks : ";
	for(i=0;i<5;i++)
	{
		cin>>s1.marks[i];
	}
	prnt(&s1);   //Address of the structure s1 is passed as parameter
	return 0;
}

了解代码:

  • 在此程序中,我们声明了一个结构" stud",其中包含3个元素-名称,横摇和5个主题的分数。

  • 在main()函数内部,我们首先获取用户输入并将其存储在结构变量s1中,

  • 这样做之后,我们以s1的地址作为参数调用函数prnt()

  • 因此,该函数将地址存储在指针" s"中。
    此外,我们使用该指针访问结构s1的各个元素并打印出来。

请注意,在通过指针s访问s1的元素时,我们使用了'->'运算符。
该运算符用于通过指向特定结构的指针来访问此类元素。

3.将结构数组传递给函数

与将结构变量传递给C++中的函数类似,该语言还允许我们传递结构数组。
以下代码说明了这样做的过程,

#include<iostream>
using namespace std;

struct stud{
	int roll;
	char name[30];
	int marks[3];
};

stud s1[2];  //array of type stud declared with size 2
//function accepts the address of the structure s1 in a pointer type //variable s
void prnt(stud *s)       
{
	cout<<"\nStudent Details are printed below:\n";
	for(int i=0;i<2;i++)
	{
		cout<<"\nName for student "<<i<<" : "<<s[i].name;
		cout<<"\nRoll for student "<<i<<" : "<<s[i].roll;
		cout<<"\nMarks for student "<<i<<" : ";
		for(int j=0;j<3;j++)
		{
			cout<<"\t"<<s[i].marks[j];
		}
	}
}

int main()
{
	int i,j;
	cout<<"Enter Student details here ::::";
	for(i=0;i<2;i++)
	{
		cout<<"\nEnter student name for student "<<i<<" : ";
		fflush(stdin); //used to avoid buffer error for using gets()
		gets(s1[i].name);
		cout<<"\nEnter roll for student "<<i<<" : ";
		cin>>s1[i].roll;
		cout<<"\n Enter 5 subject marks for student "<<i<<" : ";
		for(j=0;j<3;j++)
		{
			cin>>s1[i].marks[j];
		}
	}
	prnt(s1);   //Address of the structure s1 is passed as parameter
	return 0;
}

了解代码,

  • 在此程序中,我们使用了由3个元素组成的相同结构类型" stud",

  • 但是这次我们声明了一个数组,其类型为stud类型,大小为2。
    这次我们将在这个数组中存储2个学生的各种数据并打印出来,

  • 与前面的示例类似,我们使用2个学生的" for"循环获取用户详细信息的用户输入,

  • 完成输入后,我们以s1为参数调用prnt()函数。
    还记得数组的名称也是基地址吗?因此,这里我们使用相同的属性来传递结构数组s1的地址,

  • prnt()函数接收指针s内的数组地址。

  • prnt()函数内部,我们再次使用for循环访问上述元素,从而为两个学生打印学生详细信息。

您是否注意到,这次访问结构的元素时,我们没有使用"->"运算符,而是使用了旧的"。
"。
这是因为" s [i]"不是指针,实际上它是值" *(s + i)"或者" s1 [i]"。

按功能返回结构

像其他类型一样,函数也可以返回结构。
然后,函数的返回类型应与结构的返回类型相同。
例如,如果我们希望函数为上述代码返回" stud"类型的结构,则必须将函数声明为:

stud func( stud s1, stud s2 )
{
  stud s3;
  statements...;
  return s3;
}

其中

  • s1和s2均为" stud"类型的结构变量,
  • 其中func()是返回类型为stud的函数。
    它返回最初被称为stud类型的另一个结构s3。