跟我从零开始学C++(C++代码基础)5

引言

  小伙伴们,在经过一些基础定义和指针,数组,函数的洗礼后,我相信大家肯定都已经对C++编程有了新的认知,同时呢,坚持下来的小伙伴们肯定都是好样的,大家都是很棒的,现在我们来学一学有关C++的最后一章,这章的难度比起指针和函数,还有数组,都还算简单,不过都是一些新概念,所以小伙伴们在学习的时候也要写好笔记,同时呢也要切身实地的亲手在VS上敲一敲,这样才能对知识有个消化吸收的过程。

  好了,仍然是废话不多说,跟着小杨的节奏~冲冲冲!!!!!

自定义类型

引言
  很多时候,我们在写程序的时候一个变量里有很多小的变量,比如成绩里分为语文,数学,英语等,我们需要一个一个的把变量初始化,并每次调用的时候都需要找到正确的位置和函数。这对于看重计算速度的程序员们来说,很不方便,那有什么方式可以让我们可以更好的管理吗。
  由此,在C++中,除了一些基本类型,我们在这引入一个新的可以有用户定义的数据类型。它就是“结构体”(struct),它允许你将多个不同或相同类型的数据项组合成一个单一的实体。这可以帮助你组织数据,使其更加模块化和易于管理。

结构类型

相关知识点:

  • 结构类型也称结构体,可以使用结构变量来保存复杂数据。
  • 结构变量的初始化分为顺序初始化,指定成员初始化。
  • 可以通过“.”来访问结构变量中的成员
  • 结构类型允许使用嵌套,结构类型中可以使用其他的结构类型
  • 结构指针可以使用->直接使用其指向的结构变量的成员。
      
  • 结构变量的定义和使用
#include <iostream>

using namespace std;


//	定义结构类型
struct Student
{
	int no; // 学号
	char gender; // 性别
	float score; // 成绩
} s3; // 定义结构的同时,定义结构变量

void info(Student s);

int main()
{
	//	定义结构变量
	Student s1, s2;

	//	指定成员初始化
	s1.gender = 'f';
	s1.no = 10000;
	s1.score = 99.1;

	info(s1);
	//	顺序初始化
	s2 = { 10001, 'm', 91.1};
	s3 = { 10002, 'm', 92.1 };
	
	info(s2);
	info(s3);

	return 0;
}

void info(Student s)
{
	cout << "学号: " << s.no << " 性别: " << s.gender << " 成绩:" << s.score << endl;
}
  • 结构类型嵌套
#include <iostream>

using namespace std;

//	结构类型嵌套

struct Date
{
	int year;
	int month;
	int day;
};

struct Student
{
	int no; // 学号
	char gender; // 性别
	float score; // 成绩
	Date birth; // 生日
	//	不允许使用结构体本身 Student s;
}; 

void info(Student s);

int main()
{
	//	定义结构变量
	Student s1, s2;

	//	指定成员初始化
	s1.gender = 'f';
	s1.no = 10000;
	s1.score = 99.1;
	s1.birth.month = 10;
	s1.birth.year = 2000;
	s1.birth.day = 1;
	info(s1);
	//	顺序初始化
	s2 = { 10001, 'm', 91.1, {2000, 1, 1} };
	
	info(s2);
	
	return 0;
}

void info(Student s)
{
	cout << "学号: " << s.no << " 性别: " << s.gender << " 成绩:" << s.score ;
	cout << " 出生日期:" << s.birth.year << "-" << s.birth.month << "-" << s.birth.day << endl;
}
  • 简洁名称
#include <iostream>

using namespace std;

//	使用typedef定义结构类型的简洁名称
typedef struct Student
{
	int no; // 学号
	char gender; // 性别
	float score; // 成绩
} stu1, stu2; //	定义结构变量的同时定义简洁名称

void info(Student s)
{
	cout << "学号: " << s.no << " 性别: " << s.gender << " 成绩:" << s.score << endl;
}  
//	定义带参函数info(s),参数是结构体类型,返回值是void型;


//	声明结构类型时使用typedef定义简洁名称
typedef struct Dog
{
	int age;
	int type;

}D;
void info2(Dog g)
{
	cout <<"小狗的年龄是"<< g.age<<"岁。   小狗的种类是" << g.type << endl;
}


int main()
{
	stu1 s1 = {1000, 'f', 99.9};
	stu2 s2 = { 1001, 'm', 99.0 };
	info(s1);
	info(s2);
	D d1 = { 1,23};
	info2(d1);
	
}



  • 结构数组
#include <iostream>

using namespace std;

struct Student
{
	int no; // 学号
	char gender; // 性别
	float score; // 成绩
};

void info(Student s)
{
	cout << "学号: " << s.no << " 性别: " << s.gender << " 成绩:" << s.score << endl;
}

int main()
{
	//	定义结构数组
	Student s[5] = {
		{1000, 'f', 80.1},
		{1001, 'm', 89.1},
		{1002, 'f', 99.1},
		{1003, 'm', 70.1},
		{1004, 'f', 92.1},
	};

	//	获取成绩最高的同学的学号
	Student s1 = s[0];
	cout << "&s1" << &s1 << endl;

	for (int i = 0; i < 5; i++)
	{
		if (s[i].score > s1.score)
		{
			s1 = s[i];
			cout << "&s1" << &s1 << endl;
		}
	}
	info(s1);

}


  • 结构指针
#include <iostream>

using namespace std;

struct Student
{
	int no; // 学号
	char gender; // 性别
	float score; // 成绩	
};

void info(Student s)
{
	cout << "学号: " << s.no << " 性别: " << s.gender << " 成绩:" << s.score << endl;
}

float average(Student* p, int n);

int main()
{
	//	定义结构数组
	Student s[5] = {
		{1000, 'f', 80.1},
		{1001, 'm', 89.1},
		{1002, 'f', 99.1},
		{1003, 'm', 70.1},
		{1004, 'f', 92.1},
	};

	//	获取成绩最高的同学的学号
	Student* s1 = s;
	
	for (int i = 0; i < 5; i++)
	{
		//	结构指针可以使用->直接访问其指向的结构变量的成员
		if (s[i].score > s1->score)
		{
			//	&s[i] : &(*(s + i))
			s1 = (s + i); // 通过指针算数运算符获取地址
			
		}
	}
	info(*s1);
	cout << average(s, 5) << endl;
	cout << "sizeof(Student): " << sizeof(Student) << endl;
	return 0;
}

float average(Student* p, int n)
{
	float sum = 0;
	for (int i = 0; i < n; i++)
	{
		sum += (p + i) -> score;
	}
	return sum / n;
}

联合类型

  • 联合可以使几个不同变量占用同一内存空间。联合类型也称共同体
#include <iostream>

using namespace std;

//	定义联合类型
//	联合类型就是所有元素都指向一个变量,变量改变一个,其他的都跟着变
union my_data
{
	int i;	
	char c;
	float f;
};

int main()
{
	cout << "sizeof(my_data): " << sizeof(my_data) << endl;
	//	定义联合类型变量
	my_data m;
	//	使用联合类型变量
	m.i = 97;
	cout << "m.c: " << m.c << endl;
	cout << "m.f: " << m.f << endl;
	m.c = 'b';
	cout << "m.i: " << m.i << endl;
	cout << "m.f: " << m.f << endl;
}

结构和联合的区别

  • 结构类型:多个变量有独立的存储空间,一个变量改变了,其他变量不跟着改变。
  • 联合类型:多个变量共享存储空间,一个变量改变了,其他变量也跟着改变。

枚举

  • 枚举是用标识符表示的整数型常量的集合。
#include <iostream>

using namespace std;

//	定义枚举类型
enum weekdays {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; // 枚据类型默认从0开始, 0, 1, 2, 3, 4, 5, 6

/*
	枚据类型各元素不能同名。
	如果不指定枚举类型元素的值,将自动从0开始为各个元素设置初值,后面的元素依次递增1.
	如果指定某个元素的值,则下一个元素如果没有指定值,就是上一个元素值加1。

enum weekdays { Sun , Mon, Tue = 7, Wed = 10, Thu, Fri, Sat };
*/

int main()
{
	cout << "Sun: " << Sun << endl;
	cout << "Mon: " << Mon << endl;
	cout << "Tue: " << Tue << endl;
	cout << "Wed: " << Wed << endl;
	cout << "Thu: " << Thu << endl;
	cout << "Fri: " << Fri << endl;
	cout << "Sat: " << Sat << endl;
	
	int day = 1;
	switch (day)
	{
	case Sun:
		cout << "星期日" << endl;
		break;
	case Mon:
		cout << "星期一" << endl;
		break;
	default:
		break;
	}

	return 0;
}

命名空间

  随着程序规模不断扩大,处理名称冲突问题就越来越麻烦,为此C++引入一个新的机制,即命名空间(也叫名称空间)。

  • 命名空间只能在全局范围内定义,命名空间允许嵌套。
  • 一个命名空间可以用另一个命名空间作为别名。
  • 使用域运算符::获取命名空间中的元素
  • using namespace 命名空间,使用命名空间中所有的元素。
#include <iostream>

//	using namespace 使用命名空间中所有的元素
using namespace std;

//	定义命名空间
namespace NS1
{
	int a = 10;

	void f1()
	{
		cout << "NS1::f1()" << endl;
	}
	//	命名空间允许嵌套
	namespace NS2
	{
		int b = 10;
		void f2()
		{
			cout << "NS2::f2()" << endl;
		}
	}
}

namespace NS3
{
	int a = 30;
	void f1()
	{
		cout << "NS3::f1()" << endl;
	}
}



//	一个命名空间可以用另一个命名空间作为别名  
namespace ns2 = NS1::NS2;

//	使用一个命名空间中所有的成员  
using namespace NS3;


int main()
{
	//	使用域运算符::获取命名空间中的元素
	cout << NS1::a << endl;
	NS1::f1();
	NS1::NS2::f2();
	cout << ns2::b << endl;

	cout << a << endl;
	f1();

	return 0;
}

多文件组织

引言
  随着我们写的代码越来越多,程序越来越复杂,当我们面对大型复杂项目时,我们往往会把代码模块化分开,让小组内成员分工合作完成一个整体,而作为一个总程序,我们只有一个main函数,所以一些功能函数,还有一些其他变量我们会分在其他文件里写,再根据法则去链接整个文件组织,使其成为一个整体。这就是为什么我们看到的一些项目都是大包小包的原因,现在我们也来学习一下,如何利用多文件组织。

相关知识点:

  • 头文件(.h),一般存放数据结构定义,函数声明,全局常量,类声明等。
  • 源文件(.cpp),源文件存放函数实现,类方法实现,等各种功能的实现。
  • 编译预处理指令
    • 文件包含,#include<文件名>或#include “文件名”
    • 宏定义,#define 标识符 字符串,如 #define PI 3.1415926等
    • 条件编译, #ifndef #else #endif

示例展示:
在这里插入图片描述

代码示例:
我们先创建一个cpp源文件,并写下如下代码

Main.cpp

#include <iostream>

#include "Point.h"
#include "Rectangle.h"
#include "Circle.h"

using namespace std;

int main()
{
	Point point1 = { 1, 1 };
	Rectangle r = { point1, 2, 3 };
	cout << area(r) << endl;
	cout << perimeter(r) << endl;
	
	Circle c = { point1, 3 };
	cout << area(c) << endl;
	cout << perimeter(c) << endl;

	return 0;
}

Circle.cpp

#include "Circle.h"

const float PI = 3.1415926;

int area(Circle c)
{
	return PI * c.radius * c.radius;
}

int perimeter(Circle c)
{
	return 2 * PI * c.radius;
}

Rectangle.cpp

#include "Rectangle.h"

int area(Rectangle r)
{
	return r.length * r.width;
}

int perimeter(Rectangle r)
{
	return (r.length + r.width) * 2;
}

Circle.h

#ifndef CIRCLE_H
#define CIRCLE_H
#include "Point.h"
struct Circle
{
	Point center;
	int radius;
};

int area(Circle c);
int perimeter(Circle c);
#endif

Point.h

/*
	编译预处理指令,条件编译。
	#ifndef 标识符
		程序段1
	#else
		程序段2
	#endif	
*/

#ifndef POINT_H
#define POINT_H
struct Point
{
	int x;
	int y;
};
#endif

Rectangle.h

#ifndef Rectangle_H
#define Rectangle_H

#include "Point.h"
struct Rectangle
{
	Point center;
	int length;
	int width;
};

//	声明计算矩形面积函数
int area(Rectangle r);

//	声明计算周长的函数
int perimeter(Rectangle r);

#endif

  小伙伴们有关多文件组织的内容,可能只看代码和讲解并不能第一时间看懂,建议大家在学习的时候也看看视频资料,这方面小杨也在准备了,相信不久大家就可以相关链接。

结语

  哇~,小伙伴们终于在半个多月的时间内,大家把有关C++的基础课学完了哟,撒花❀❀❀!!!小伙伴们一定要及时复习把最近学到的内容学到炉火纯青哟,稍后,小杨会给大家带来C++的进阶课程,面向对象编程,这是C++的又一大难点,如果大家的基础好的话,会在后边的课程中才能学的轻松,不然后边的内容就会磕磕绊绊。

  好了,不管怎么说,大家都很棒,为自己鼓鼓掌!!!接下来也要加油呀!!!冲冲冲!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/746518.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(二)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

Leetcode Hot100之矩阵

1. 矩阵置零 题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 解题思路 题目要求进行原地更改&#xff0c;也就是不能使用额外的空间&#xff0c;因此我们可以使用第一行的元素来记录对应的…

【软件下载】Folx详细安装教程视频-Folx软件最新版下载

根据大数据调查表明Acceleration PRO下载&#xff1a;抽出多达10个流的故障能够显着提高下载速度。根据行业数据显示与iTunes PRO集成&#xff1a;通过将Folx集成到iTunes来下载歌曲和视频&#xff0c;能够在下载后立即自动添加到iTunes库。实际上我们可以这样讲通过代理下载&a…

Git 冲突处理指南:恢复 Git Reset

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

10个AI高考上岸朋友圈文案设计

高考是人生中的一个重要时刻&#xff0c;上岸后分享朋友圈的文案可以既表达喜悦&#xff0c;也可以展现对未来的期待。以下是10个不同风格的高考上岸朋友圈文案&#xff0c;供你参考&#xff1a; 1. **梦想成真版**&#xff1a; "十年磨一剑&#xff0c;今朝试锋芒。高…

After Effects 2024 mac/win版:创意视效,梦想起航

After Effects 2024是一款引领视效革命的专业软件&#xff0c;汇聚了创意与技术的精华。作为Adobe推出的全新版本&#xff0c;它以其强大的视频处理和动画创作能力&#xff0c;成为从事设计和视频特技的机构&#xff0c;如电视台、动画制作公司、个人后期制作工作室以及多媒体工…

【Linux】进程信号_2

文章目录 八、进程信号1. 信号 未完待续 八、进程信号 1. 信号 除了可以使用 kill 命令和键盘来生成信号&#xff0c;我们也可以使用系统调用来生成信号。 kill函数可以对指定进程发送指定信号。 使用方法&#xff1a; int main(int argc, char *argv[]) {if (argc ! 3) {c…

利用viztracer进行性能分析和优化

上一篇文章&#xff0c;我们详细讲解了scalene这个性能分析和优化工具的使用流程&#xff1b;今天&#xff0c;我们将深入探讨另一个性能分析和优化工具——viztracer。 什么是viztracer&#xff1f; viztracer是一个非常强大的分析器&#xff0c;可以生成详细的性能报告和可…

信号与系统实验-实验五 离散时间系统的时域分析

一、实验目的 1、理解离散信号的定义与时域特征&#xff0c;掌握在时域求解信号的各种变换运算&#xff1b; 2、掌握离散系统的单位响应及其 MATLAB 实现的方法&#xff1b; 3、掌握离散时间序列卷积及其 MATLAB 实现的方法&#xff1b; 4、掌握利用 MATLAB 求解微分方程&a…

国内有哪些比较优秀的wordpress主题?

WordPress作为全球最受欢迎的开源内容管理系统之一&#xff0c;拥有众多优质的主题供用户选择。那么国内有哪些比较优秀的wordpress主题呢&#xff1f;下面小编就和大家分享国内功能比较完善比较受欢迎的wordpress主题。 wordpress主题合集&#xff1a;WP主题-办公人导航https:…

力扣1541. 平衡括号字符串的最少插入次数

Problem: 1541. 平衡括号字符串的最少插入次数 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 Problem: 力扣921. 使括号有效的最少添加 类似于上述题目&#xff0c;不过此时一个左括号要和两个右括号配对 1.同理上述题目&#xff0c;遍历字符串时若遇见一个左括…

探索小众爱好:打造个人韧性与特色之路

在这个信息爆炸的时代&#xff0c;我们很容易陷入“千篇一律”的漩涡中&#xff0c;无论是生活方式还是兴趣爱好&#xff0c;似乎都趋向于某种“流行”或“热门”。然而&#xff0c;真正的个性与魅力&#xff0c;往往来源于那些不为大众所知的小众爱好。今天&#xff0c;我想和…

电脑硬盘数据恢复,4个方法,轻松恢复数据

在数字化时代的浪潮中&#xff0c;电脑硬盘不仅是存储数据的仓库&#xff0c;更是我们生活、工作、学习的记忆宫殿。然而&#xff0c;当这个宫殿中的一部分珍贵记忆突然消失&#xff0c;仿佛历史的片段被无情地抹去&#xff0c;我们不禁会感到焦虑和恐慌。此时&#xff0c;电脑…

环球赛乐科技有限公司与北京城市学院共建实习“绿色通道”

环球赛乐&#xff08;北京&#xff09;科技有限公司&#xff08;简称“赛氪网”&#xff09;与北京城市学院近日宣布&#xff0c;双方将合作开通顶岗实习“绿色通道”&#xff0c;旨在为实习生提供高质量的实践机会和就业平台。此次合作不仅体现了校企合作的深度融合&#xff0…

【数据结构】带头双向循环链表的实现及链表顺序表的区别

目录 一、带头双向循环链表接口实现 连接关系&#xff1a; 创建哨兵位&#xff08;表头&#xff09;&#xff1a; 头插——头删&#xff1a; 尾插——尾删&#xff1a; 查找——打印&#xff1a; 指定位置pos前插入&#xff0c;删除pos位置&#xff1a; 链表销毁&#x…

39 - 电影评分(高频 SQL 50 题基础版)

39 - 电影评分 (selectu.name as results fromMovieRating m left join Users u on m.user_idu.user_id GROUP BYm.user_id order by count(*) desc,u.name asc limit 1) union all (selectm1.title as results fromMovieRating m left join Movies m1 on m.movie_idm1.movie…

SQL实现UUIDv7

当我们选择数据库的主键类型时&#xff0c;通常会考虑自增数字或者 UUID。但是这两种类型都有优缺点&#xff0c;自增字段简单有序&#xff0c;性能良好&#xff0c;最大的问题是无法保证全局唯一性&#xff0c;分布式场景受限&#xff1b;UUID 具有全局唯一性&#xff0c;适合…

fastadmin框架修改前端时间戳格式的时区

一、上传文件 将 moment-timezone-with-data.js 和 moment-timezone-with-data.min.js 文件上传到项目的 \public\assets\libs\moment\ 文件夹中。 二、配置中引入文件 在 \public\assets\js\require-backend.js 文件中增加所引入文件的配置: moment-timezone-with-data: …

ITSG、COST-G、Tongji和WHU Level-2数据产品读取绘图(Matlab)

数据介绍&#xff1a; ICGEM International Center for Global Gravity Field Models (gfz-potsdam.de) ITSG 2018&#xff1a;Institute of Geodesy at Graz University of Technolog&#xff08;格拉茨理工大学大地测量研究所&#xff09; 2018版本&#xff0c;最高60阶球谐…

深度之眼(二十六)——神经网络基础知识(一)

文章目录 一、前言二、神经网络与多层感知机2.1 人工神经元2.2 人工神经网络2.3 多层感知机2.4 激活函数 一、前言 看了下课程安排&#xff0c;自己还是没安排好&#xff0c;刚刚捋清了一下思路。 基础&#xff1a;python、数理 认识&#xff1a;神经网络基础、opencv基础、py…