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

news2024/11/24 0:56:42

引言

  小伙伴们,在经过一些基础定义和指针,数组,函数的洗礼后,我相信大家肯定都已经对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++的又一大难点,如果大家的基础好的话,会在后边的课程中才能学的轻松,不然后边的内容就会磕磕绊绊。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亚马逊运营专词(二)

1. A页面&#xff1a;亚马逊A页面即图文版商品详情页面&#xff0c;可以通过A页面使用不同的方式来描述商品特征&#xff0c;例如在页面中添加品牌故事、产品图片、产品文字介绍等&#xff0c;进一步完善页面。但目前A页面只对在亚马逊上注册了品牌的商家开放。 2. 跟卖&#x…

python操作服务器

一&#xff1a;使用 paramiko 进行SSH连接 首先确保已安装paramiko库&#xff1a;pip install paramiko 代码示例 在这里插入代码片import paramikohostname hostname username user password passwdclient paramiko.SSHClient() client.set_missing_host_key_policy(par…

突破内存限制:Jamba模型的高效文本处理能力

在当今信息爆炸的时代&#xff0c;处理和理解海量文本数据的需求日益增长。自然语言处理&#xff08;NLP&#xff09;领域的研究者们一直在探索如何构建更高效、更强大且更灵活的语言模型来应对这一挑战。然而&#xff0c;现有的大型语言模型&#xff0c;尤其是基于Transformer…

物联网“此用户无权修改接入点名称设置”解决方案

根本原因apns-conf.xml里面没有 符合 物理网卡 的配置 可以先加一个APN试一下&#xff0c;看看默认的MCC和MNC是什么 然后在”命令行“查询一下 adb shell sqlite3 /data/user_de/0/com.android.providers.telephony/databases/telephony.db "select * from carriers wh…

基于Java技术的在线学习平台系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术&#xff0c;基于SpringBoot框架 工具&#xff1a;Eclipse、Navicat、M…

Arduino - 按钮 - 长按短按

Arduino - Button - Long Press Short Press Arduino - 按钮 - 长按短按 Arduino - Button - Long Press Short Press We will learn: 我们将学习&#xff1a; How to detect the button’s short press 如何检测按钮的短按How to detect the button’s long press 如何检测…

Redis-集群-环境搭建

文章目录 1、清空主从复制和哨兵模式留下的一些文件1.1、删除以rdb后缀名的文件1.2、删除主从复制的配置文件1.3、删除哨兵模式的配置文件 2、appendonly修改回no3、开启daemonize yes4、protect-mode no5、注释掉bind6、制作六个实例的配置文件6.1、制作配置文件redis6379.con…

boss直聘招聘数据可视化分析

boss直聘招聘数据可视化分析 一、数据预处理二、数据可视化三、完整代码一、数据预处理 在 上一篇博客中,笔者已经详细介绍了使用selenium爬取南昌市web前端工程师的招聘岗位数据,数据格式如下: 这里主要对薪水列进行处理,为方便处理,将日薪和周薪的数据删除,将带有13薪…

迁移学习——CycleGAN

CycleGAN 1.导入需要的包2.数据加载&#xff08;1&#xff09;to_img 函数&#xff08;2&#xff09;数据加载&#xff08;3&#xff09;图像转换 3.随机读取图像进行预处理&#xff08;1&#xff09;函数参数&#xff08;2&#xff09;数据路径&#xff08;3&#xff09;读取文…

数据结构——带头双向循环链表(c语言实现)

目录 1.单链表和双向链表对比 2.双向链表实现 2.1 创建新节点 2.2 链表初始化 2.3 尾插 2.4 头插 2.5 尾删 2.6 头删 2.7 查找 2.8 指定位置后插入数据 2.9 删除指定节点 2.10 销毁链表 2.11 打印链表 前言&#xff1a; 我们在前几期详细地讲解了不带头单…

EthernetIP IO从站设备数据 转opc ua项目案例

1 案例说明 设置网关采集EthernetIP IO设备数据把采集的数据转成opc ua协议转发给其他系统。 2 VFBOX网关工作原理 VFBOX网关是协议转换网关&#xff0c;是把一种协议转换成另外一种协议。网关可以采集西门子&#xff0c;欧姆龙&#xff0c;三菱&#xff0c;AB PLC&#xff0…

day41--Redis(三)高级篇之最佳实践

Redis高级篇之最佳实践 今日内容 Redis键值设计批处理优化服务端优化集群最佳实践 1、Redis键值设计 1.1、优雅的key结构 Redis的Key虽然可以自定义&#xff0c;但最好遵循下面的几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id]长度不超过…

STM32音频应用开发:DMA与定时器的高效协作

摘要: 本文章将深入浅出地介绍如何使用STM32单片机实现音频播放功能。文章将从音频基础知识入手&#xff0c;逐步讲解音频解码、DAC转换、音频放大等关键环节&#xff0c;并结合STM32 HAL库给出具体的代码实现和电路设计方案。最后&#xff0c;我们将通过一个实例演示如何播放W…

FPGA SATA高速存储设计

今天来讲一篇如何在fpga上实现sata ip&#xff0c;然后利用sata ip实现读写sata 盘的目的&#xff0c;如果需要再速度和容量上增加&#xff0c;那么仅仅需要增加sata ip个数就能够实现增加sata盘&#xff0c;如果仅仅实现data的读写整体来说sata ip设计比较简单&#xff0c;下面…

大模型产品的“命名经济学”:名字越简单,产品越火爆?

文 | 智能相对论 作者 | 陈泊丞 古人云&#xff1a;赐子千金&#xff0c;不如教子一艺&#xff1b;教子一艺&#xff0c;不如赐子一名。 命名之妙&#xff0c;玄之又玄。 早两年&#xff0c;大模型爆火&#xff0c;本土厂商在大模型产品命名上可谓下足了功夫&#xff0c;引…

小公司选择高水平LabVIEW团队外包

小公司选择高水平LabVIEW团队外包的优点可以从多个方面进行详细说明&#xff0c;包括专业技能、成本效益、时间效率、技术支持、风险管理和灵活性等。以下是具体的优点分析&#xff1a; 1. 专业技能和经验 优点&#xff1a; 高水平专业技能&#xff1a;高水平的LabVIEW团队通…

力扣316.去除重复字母

力扣316.去除重复字母 从左到右遍历每个字母 若当前字母比栈顶字母小 并且右边仍然后栈顶字母出现弹出栈顶字母 最后加入当前字母 class Solution {public:string removeDuplicateLetters(string s) {//记录每个字母出现次数;当前字符串中字母是否出现vector<int> lef…

单目标应用:基于吸血水蛭优化器(Blood-Sucking Leech Optimizer,BSLO)的微电网优化(MATLAB代码)

一、微电网模型介绍 微电网多目标优化调度模型简介_vmgpqv-CSDN博客 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、吸血水蛭优化器求解微电网 2.1算法简介 吸血水蛭优化器&#xff08;B…

AI技术与艺术的融合:开创性的用户界面与产品体验

引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;的飞速发展改变了我们的生活和工作方式。AI技术不仅在算力和模型上取得了重大进步&#xff0c;更在用户界面和产品体验方面迎来了突破。近日&#xff0c;科技博客 Stratechery 的文章以及硅谷投资基金 AI Grant 的两…

platform 设备驱动实验

platform 设备驱动实验 Linux 驱动的分离与分层 代码的重用性非常重要&#xff0c;否则的话就会在 Linux 内核中存在大量无意义的重复代码。尤其是驱动程序&#xff0c;因为驱动程序占用了 Linux内核代码量的大头&#xff0c;如果不对驱动程序加以管理&#xff0c;任由重复的…