C24.【C++ Cont】结构体
目录
1.知识回顾:C语言的结构体
2.C++的结构体
格式
结构体变量的创建
结构体变量可以是全局变量也可以是局部变量
结构体的整体操作
代码
运行结果
成员函数
自定义成员函数代码示例
运行结果
默认成员函数
构造函数
示例代码
析构函数
示例代码
注:C++的结构体和C语言的结构体有所不同,本文讲不同点
1.知识回顾:C语言的结构体
20.【C语言】初识结构体(重要)
48.【C语言】结构体补充
63.【C语言】再议结构体(上)
64.【C语言】再议结构体(下)
2.C++的结构体
格式
//声明结构体的类型(相当于图纸,不占内存空间)
struct tag
{
成员变量列表; //成员变量可以有1个,也可以有多个
成员函数列表; //成员函数可以有,也可以没有
}结构体变量列表; //在声明结构体类型的同时,创建结构体变量,可以有多个,中间使用逗号隔开
注:成员函数列表是C++才引入的
结构体变量的创建
和C语言不同的是,struct前缀可以省略
struct tag
{
int i;
char c;
float f;
};
struct tag t1;
tag t2;
tag t3[10];//可以放10个tag结构体的信息
注:创建结构体变量时,结构体变量的名字不能和结构体类型的名字相同
因此下面这样写是错误的
struct tag
{
int i;
char c;
float f;
};
struct tag tag;//错误
结构体变量可以是全局变量也可以是局部变量
struct tag
{
int i;
char c;
float f;
}t1;
tag t2;
int main()
{
tag t3;
return 0;
}
t1和t2是全局变量,t3是局部变量
结构体的整体操作
结构体变量可以直接进行赋值操作
代码
#include <iostream>
using namespace std;
int main()
{
struct tag
{
int i;
char c;
float f;
};
tag t1={1,'c',3.14};
tag copy_t1=t1;
cout<<copy_t1.i<<' '<<copy_t1.c<<' '<<copy_t1.f;
return 0;
}
运行结果
成员函数
分类:① 默认的成员函数 ②自定义的成员函数
默认的成员函数:C++编译器自带的成员函数(如构造函数和析构函数),它们自动被调用
调用方法:和成员变量一样,使用 . 操作符
特点:成员函数可以直接访问成员变量
自定义成员函数代码示例
#include <iostream>
using namespace std;
int main()
{
struct s
{
int i;
char c;
float f;
void Init_s()
{
//可以直接访问成员,不需要 . 操作符
i=1;
c='c';
f=3.14;
}
void Print_s()
{
cout<<i<<' '<<c<<' '<<f;//可以直接访问成员,不需要 . 操作符
}
};
s s1;
s1.Init_s();//使用 . 操作符调用成员函数
s1.Print_s();
return 0;
}
运行结果
默认成员函数
构造函数
其实上方代码自定义的Init_s函数可以用构造函数完成
构造函数的特点:①一般用于初始化结构体变量 ②函数名与结构体(类)名相同 ③无返回值 ④可以重载 ⑤如果未显式定义构造函数,那么系统会自动生成默认的构造函数
示例代码
#include <iostream>
using namespace std;
int main()
{
struct s
{
int i;
char c;
float f;
s()//不用写void
{
cout<<"已调用构造函数"<<endl;
i=1;
c='c';
f=3.14;
}
void Print_s()
{
cout<<i<<' '<<c<<' '<<f;//可以直接访问成员,不需要.操作符
}
};
s s1;
//没有手动调用构造函数
s1.Print_s();
return 0;
}
运行结果
VS2022调试以上代码,在s s1;下断点,之后单步执行,会发现立刻执行构造函数s()
析构函数
结构体变量销毁时(即出作用域)C++编译器会自动调用析构函数
析构函数的特点①析构函数名是在结构体(类)名前加上字符 ~ ②无参数无返回值类型 ③一个类只能有一个析构函数 ④如果未显式定义析构函数,那么系统会自动生成默认的析构函数 ⑤析构函数不能重载
示例代码
#include <iostream>
using namespace std;
int main()
{
struct s
{
int i;
char c;
float f;
s()//无返回值类型
{
cout << "已调用构造函数" << endl;
i = 1;
c = 'c';
f = 3.14;
}
~s()//无参数无返回值类型
{
cout << endl << "已调用析构函数";
i = 0;
c = '\0';
f = 0;
}
void Print_s()
{
cout << i << ' ' << c << ' ' << f;//可以直接访问成员,不需要.操作符
}
};
{
s s1;
s1.Print_s();
}//s1被限制在作用域内
return 0;
}
运行结果
VS2022调试以上代码,在 } 下断点,之后单步执行,会发现立刻执行析构函数~s(),原因:离开作用域需要被销毁
注:竞赛中对于结构体来说很少使用成员函数,更多应该是针对结构变量的运算符重载