c++之结构体

写在前面:学习结构体,应当充分理解它和类的关系,在声明上,关键字struct相当于class,结构体名相当于类名,结构体内部相当于类体,定义的最后都要加分号,只不过结构体可以在定义完成之后可以在括号后面紧跟着就实现,以及类内部默认为private,而结构体是public,和类一样,结构体也可以有成员函数(在c中不可以有函数,只可以有函数指针)、构造函数、析构函数、复制构造函数,和类及其相似,只是类的一个前生。

一、结构体的定义:

struct S1//关键字加结构体名,与类相似
{
	int a;
	char b;
	flot c;
	……
};//分号不能丢

这样就定义了一个结构体,其形式和类的定义几乎没有区别,可以类比记忆。

在定义结构体的同时也能直接初始化结构体:

#include <iostream>
using namespace std; 
struct S1//这里采用在函数外定义,所有函数都可以调用,如果在函数内定义,则只能在函数内调用 
{
	int a; 
} s,ss;
int main()
{
	s.a = 1;
	ss.a = 2;
	cout<<s.a<<"   "<<ss.a<<endl;
return 0;
}
#include <iostream>
using namespace std; 
struct 
{
	int a; 
} s,ss;
int main()
{
	s.a = 1;
	ss.a = 2;
	cout<<s.a<<"   "<<ss.a<<endl;
return 0;	
}

另外,c++中结构体声明是可以没有结构体名

#include <iostream>
using namespace std; 
struct//这里采用在函数外定义,所有函数都可以调用,如果在函数内定义,则只能在函数内调用 
{
	int a; 
} s,ss;
int main()
{
	s.a = 1;
	ss.a = 2;
	cout<<s.a<<"   "<<ss.a<<endl;
return 0;	
}
但是这样就只能在结构体定义的时候实现结构体,由于没有结构体名,之后并不能在用结构体名来实现结构体。

二、利用结构体名实现结构体

S1 s;
struct S1 ss;

在实现结构体的时候,可以省略关键词struct,使其更接近类。

三、结构体成员的访问

s.a = 1;
s.b = 'a';
同类似类的方法,直接用点操作符,不同于类的是,结构体里都是公开的,使用起来不用考虑私有的问题(只是因为其默认为公开,当然也可以将结构体成员设置为私有,方法和类相同)

四、结构体成员的初始化

1、通过点操作符初始

2、通过构造函数初始化

3、通过初始化列表初始化

五、结构体做函数参数,做函数返回值

六、结构体数组

如果想要同时声明多个实现结构体,可以选择结构体数组;

声明方法:

S1 s[3];
初始化:
1、可以选择声明后再一个个初始化;
2、也可以选择在声明的时候统一初始化:

s1 s[3]=
{
	{1,'a',1.1},
	{2,'b',2.2},
	{3,'c',3.3},
};
附完整测试代码:

#include <iostream>
#include <string>
using namespace std;

int main() {
	struct Example
	{
		int i_a;//定义一个整型成员 
		char c_b;//定义一个字符型成员 
		float f_c;//定义一个浮点型成员 
		string s_d;//定义一个字符串(已包含头文件)
		 
		void change(){i_a = 1;}//定义一个成员函数 
		
		Example(){cout<<"实现了一个Example结构体"<<'\n';}//默认构造函数 
		Example(int a,char b,float c,string d)
		{i_a = a;c_b = b;f_c = c;s_d = d;
		cout<<"实现了一个Example结构体"<<'\n'; 
		}//构造函数
		
		~Example(){cout<<"析构了一个Example结构体";}
		private://声明私有变量 
		int i_aa; 
	};
	
	Example ex1;//或者写成   struct Example ex1;    struct可以省略,更像对象的定义 
	Example ex2(1,'a',2.2,"xiaoming");//利用非默认构造函数初始化一个结构体 
	cout<<ex2.i_a<<'\n'<<ex2.c_b<<'\n'<<ex2.f_c<<'\n'<<ex2.s_d<<endl; //打印结构体变量,测试初始化
	
	cout<<"测试结构体函数"<<endl; 
	ex2.change();//调用结构体函数
	cout<<ex2.i_a<<endl;//测试结构体函数是否成功调用 
	
	//ex2.i_aa = 1;//访问结构体私有成员,程序报错 
}

拓展阅读:

typedef在结构体中的作用

形式一:

struct Student
{
	int a;
};//结构体类型是Student
//声明变量的时候可以写
Student s1;//——c++写法
struct Student s2;//——c语言写法
形式二:
typedef struct Student
{
	int a;
}stu;//stu相当于struct Student的一个别名
//声明变量时可写
Stu stu1;
struct stu2;
struct Student stu3;
对于c++,不论用不用typedef,都可以直接Student stu1,struct可以省略,使用typedef后,声明结构体变量时,类型名和别名有一个即可,均可以用来声明变量。但是对于c语言加了typedef后就可以用别名,可以避免使用struct;

另外,对于c++,用不用typedef也有区别:

形式一:

struct Student
{
	int a;
}stu1;//stu1是一个结构体变量,已实例化 
形式二:
typedef struct Student
{
	int a;
}stu2;//stu2是一个结构体类型,未实例化






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章