当前位置: 首页 > article >正文

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(),原因:离开作用域需要被销毁

注:竞赛中对于结构体来说很少使用成员函数,更多应该是针对结构变量的运算符重载


http://www.kler.cn/a/525496.html

相关文章:

  • 从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础图形库实现)
  • 最新-CentOS 7 基于1 Panel面板安装 JumpServer 堡垒机
  • 解码,蓝桥杯2020G
  • IME关于输入法横屏全屏显示问题-Android14
  • Vue.js组件开发-实现下载时暂停恢复下载
  • 【深度学习】 UNet详解
  • springboot 简化 spring开发
  • 智能家居能源管理系统:Python与AI的完美结合
  • QT设置应用程序图标
  • LeetCode:56.合并区间
  • 工业相机常用词语解释
  • Vue.js 使用 Vuex 管理组件间的共享状态
  • 【GStreamer】GstBuffer的简单分析
  • 10.7 获得程序版本信息
  • 【DeepSeek】LLM强化学习GRPO Trainer详解
  • Baklib在知识管理效率提升中的独特价值与其他产品的比较探析
  • RocketMQ 中如何实现消息的可靠传递?
  • C++,STL 简介:历史、组成、优势
  • 9.1 LangChain深度解析:大模型应用开发的“万能胶水”与核心架构设计
  • 数论问题77一一3x+1问题
  • 【deepseek实战】绿色好用,不断网
  • UE5制作视差图
  • 热更新杂乱记
  • Android车机DIY开发之学习篇(七)NDK交叉工具构建
  • 数据结构---哈希表
  • Linux - 常用的I/O 多路复用技术 select, poll, epoll