写在前面:学习结构体,应当充分理解它和类的关系,在声明上,关键字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是一个结构体类型,未实例化