【c++】入门2

news2024/9/24 23:26:48

函数重载

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题。

c++区分重载函数是根据参数的不同,个数的不同,类型的不同,顺序的不同。

1.参数的类型不同

int Add(int left, int right)
{
 cout << "int Add(int left, int right)" << endl;
 return left + right;
}
double Add(double left, double right)
{
 cout << "double Add(double left, double right)" << endl;
 return left + right;
}

2.参数的个数不同

void f()
{
 cout << "f()" << endl;
}
void f(int a)

{
 cout << "f(int a)" << endl;
}

3.参数的顺序不同

void f(int a, char b)
{
 cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
 cout << "f(char b, int a)" << endl;
}

注意:同类型的参数不属于函数重载

void f(int a, int b)
{
 cout << "f(int a,int b)" << endl;
}
void f(int b, int a)
{
 cout << "f(int b, int a)" << endl;
}

上述代码不属于函数重载

不同的命名空间不算重载

#include <iostream>

using namespace std; 
namespace zjw
{
	int  add(int a, int b)
	{
		return a + b;
	
	
	}
}
namespace ggw
{
	double  add(double a, double b)
	{
		return a + b;


	}
}



int main()
{
	zjw::add(1, 2);
	ggw::add(1.1, 2.2);

}

上述不属于函数重载。
那么c++在处理重载函数的时候,会不会变慢,因为要区分重载函数?
不会,处理重载函数是在编译时候完成,而速度是运行决定的。

编译识别函数

在vs中编译识别重载函数有些复杂
当只有声明,没有定义时,会出现报错。
在这里插入图片描述

==我们可以在linux下来验证是否会修饰重载函数。==由于vim有些地方需要配置,所以这里以后再加。

步骤1.vim test.c (test.c是创建好的)
步骤2. gcc -o tc test.c(使用gcc编译器编译test.c),会生成一个tc的文件
步骤3.objdump -S tc (查看对应的汇编指令)
同理:1.g++ -o tcpp test.c (会编译生成一个tcpp的文件)
2.objdump -S tcpp (查看对应的汇编指令)

同名函数的区分
修饰以后的函数名,windows和linux修饰规则不一样。
比方说下面这个函数在linux下

void add(int a,int b)

修饰后

_Z3addii()

3代表函数名长度,add为函数名,i,i 分别是两个变量的类型简写

返回值不同无法构成重载,不是因为修饰规则中没有,而是在调用处无法区分。调用处一般不写返回类型。

引用

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间。

int main()
{
	int a = 7;
	int& b = a;
	printf("0x%x\n", &a);
	printf("0x%x\n", &b);



}

在这里插入图片描述

地址相同说明共用一个内存空间。
举个例子

void swap(int  a, int b)
{
	int tmp = a;
	a = b;
	b = tmp;


}

int main()
{
	int a = 4;
	int b = 5;
	swap(a, b);

}

上述代码只能将实参的值拷贝给形参,当swap()完成后形参被销毁,不能完成主函数中的a,b的交换。我们学习c语言之后我们会传地址过去,用指针接收完成主函数a,b的交换。

void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;


}

int main()
{
	int a = 4;
	int b = 5;
	swap(&a, &b);

}

当我们学了引用之后,我们可以这样做

void swap(int& c, int& d)
{
	int tmp = c;
	c = d;
	d= tmp;


}

int main()
{
	int a = 4;
	int b = 5;
	swap(a, b);

}

这种相当于用了引用,引用相当于起别名,形参用自己的别名接收,实际上就是修改自己本身。


同时也可以给指针加引用


int main()
{
	int i = 7;
	int* p = &i;
	int* &rp = p;
	printf("0x%x\n", &p);
	printf("0x%x", &rp);

}

在这里插入图片描述
在这里插入图片描述

我们学完单链表,比方说单链表的尾插;

单链表的尾插代码

void pushback(info** pphead, int x)//尾插
{
	info* newnode = BuySListNode(x);//将创建好的新结点的地址保存在newnode变量中
	

	if (*pphead == NULL)//链表无结点
	{
		*pphead = newnode;// 将创建好的头节点的地址给给*pphead,作为新头节点的地址
	}
	else
	{
		info* tail = *pphead;//定义一个指针,先指向头结点的地址
		while (tail->next != NULL)//循环遍历找尾结点
		{
			tail = tail->next;//指针指向下一个结点

		}
		tail->next = newnode;//找到尾结点,将尾结点的next存放新接结点的地址

	}

}

当我们在主函数中定义了一个结点head,我们要实现在head后面实现尾插,要改变head->next,如果直接用一级指针接收的话,只是head结点数据的拷贝,尾插是给拷贝的结点尾插,况且puchback完会释放,所以我们传二级指针,为的就是尾插在head后面,当用二级指针时,我们会感到理解困难,当学了引用后

void pushback(info* &pphead, int x)//尾插

此时pphead就是head的别名,修改pphead就是修改head,方便多了

此外我们还可以连续起别名

int main()
{
	int i = 7;
	int& a = i;
	int& b = a;
	int& c = i;
	printf("a=%d b=%d c=%d", a, b, c);




}

在这里插入图片描述

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

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

相关文章

golang的jwt学习笔记

文章目录 初始化项目加密一步一步编写程序另一个参数--加密方式关于StandardClaims 解密解析出来的怎么用关于`MapClaims`上面使用结构体的全代码实战项目关于验证这个项目的前端初始化项目 自然第一步是暗转jwt-go的依赖啦 #go get github.com/golang-jwt/jwt/v5 go get githu…

AAAI 2024录用论文合集,包含图神经网络、时间序列、多模态、异常检测等热门研究方向

AAAI是国际顶级人工智能学术会议&#xff0c;属于CCF A类&#xff0c;在人工智能领域享有盛誉。今年的AAAI 会议投稿量突破了历史记录&#xff0c;共有12100篇投稿&#xff08;主赛道&#xff09;&#xff0c;最终录用2342篇&#xff0c;录用率为23.75%。对比前几年有了很大的提…

人工智能_机器学习073_SVM支持向量机_人脸识别模型建模_预测可视化_网格搜索交叉验证最优化参数对比---人工智能工作笔记0113

接着上一节来说,可以看到我们已经找到了合适的参数,然后 我们可以看一下这里 gc.best_params_ 就可以打印出最合适的参数 然后我们把最合适串按说填入到代码中,然后进行计算,看看得分 可以看到得分,训练数据是1.0 然后测试数据得分是0.7857...对吧

unity HoloLens2开发,使用Vuforia识别实体 触发交互(二)(有dome)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、打包到HoloLens二、Vuforia相关1.配置识别框2.制作一个半透明识别框&#xff1a;3.设置如下4.问题 四 HoloLens2 问题总结 前言 我使用的utniy 版本&#xff1a;Unity 2021.3…

Day70力扣打卡

打卡记录 收集足够苹果的最小花园周长&#xff08;找规律 二分&#xff09; 链接 class Solution:def minimumPerimeter(self, neededApples: int) -> int:l, r 1, 10 ** 5while l < r:mid (l r) >> 1if 2 * (2 * (mid ** 3) 3 * (mid ** 2) mid) > nee…

防止synplify优化ILA模块或信号

摘要&#xff1a;synplify综合的时候会优化掉没有用到的信号或者模块&#xff0c;为防止synplify优化ILA或信号特记录此方法&#xff1b; 我使用的是synplify_pro compile完成之后&#xff0c;可以打开synplify图形化的网表 1.防止synplify优化wire信号 在vivado里面一般可以…

【各种**问题系列】Java 数组集合之间的相互转换

&#x1f4cc; 问题点&#xff1a; 在 Coding 过程中经常会遇到数组、List、Set、Map 之间的相互转换......这里记录一下转换的几种方式。&#x1f636;&#x1f636;&#x1f636; 目录 &#x1f4cc; 集合转换 1.数组 转 List&#xff1a; 2.List 转 数组&#xff1a; 3…

2024年软考电子商务设计师如何备考?考什么?

一、电子商务设计师概述&#xff1f; 电子商务设计师属于软考中级资格考试&#xff0c;软考是由国家人力资源和社会保障部&#xff08;原人事部&#xff09;、工业和信息化部&#xff08;原信息产业部&#xff09;领导的国家级考试&#xff0c;其目的是&#xff0c;科学、公正…

Python中Pandas详解之数据结构

文章目录 Pandas 数据分析Pandas 简介Pandas 安装Series 类型数据Series的创建Series的访问Series 中向量化操作与布尔索引Series的切片Series的缺失值Series的增与删Series的name DataFrame 数据类型DataFrame的创建DataFrame的访问DataFrame的删除DataFrame的添加添加行添加列…

【WPF.NET开发】数据绑定应用场景

目录 1、实现属性更改通知 示例 2、双向绑定​​​更新源 示例 3、对分层数据使用主-从模式 示例 4、对分层 XML 数据使用主-从模式 示例 5、绑定两个控件的属性 示例 6、创建和绑定到 ObservableCollection 示例 7、使用 XMLDataProvider 和 XPath 查询绑定到 XML…

Nginx快速入门:return、rewrite重定向、重写详解(六)

0. 引言 我们在日常的生产过程中&#xff0c;常常有需要重定向转发的需求&#xff0c;比如企业更换了域名&#xff0c;但又要保证之前的域名能访问&#xff0c;这就需要做重定向的跳转。 我们在之前的章节中学习了Nginx的负载均衡、各类转发代理配置&#xff0c;今天继续来补…

本地部署Jellyfin影音服务器并实现远程访问内网影音库

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

Python基础入门第六节课笔记

while循环 for循环用于针对序列中的每个元素的一个代码块。 while循环是不断的运行&#xff0c;直到指定的条件不满足为止。 while 条件&#xff1a; 条件成立重复执行的代码1 条件成立重复执行的代码2 …….. 当条件成立时&#xff0c;执行下方缩…

Nature | 大型语言模型(LLM)能够产生和发现新知识吗?

大型语言模型&#xff08;LLM&#xff09;是基于大量数据进行预训练的超大型深度学习模型。底层转换器是一组神经网络&#xff0c;这些神经网络由具有自注意力功能的编码器和解码器组成。编码器和解码器从一系列文本中提取含义&#xff0c;并理解其中的单词和短语之间的关系。通…

制作TikTok获客脚本必备源代码!

在这个数字时代&#xff0c;TikTok已成为全球最受欢迎的社交媒体平台之一&#xff0c;无数的品牌和企业都试图通过这个平台吸引潜在客户。 但是&#xff0c;要想在TikTok上获得更多关注和粉丝&#xff0c;除了制作有趣、有创意的内容外&#xff0c;还需要借助一些自动化工具来…

vmware虚拟机不显示网络图标没有网络解决办法

1、虚拟机终端执行命令 sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start即可出现网络图标并正常连接到网络 2、设置网络适配器为NAT 先移除网络适配器再添加网络适配器网络连接选择NAT模式

洛谷 CSP-J2020 优秀的拆分 + 直播获奖

第一道题目&#xff1a;优秀的拆分&#xff1a; 样例以及数据范围&#xff1a; 这道题目我个人一开始是并未做出来的&#xff0c;因为一开始我并没有去学习位运算&#xff0c;然后请教了一下他人&#xff0c;接下来我将对这道题的思路进行解答&#xff1a;首先我们看到n的范围是…

安捷伦Agilent 8720ES矢量网络分析仪

Agilent安捷伦8720ES S-参数矢量网络分析仪 50MHz至20GHz 100 dB 的动态范围 优异的测量精度 2个测量通道 4个显示通道 频率和功率扫描 快扫描和数据传输速度 通过/失败测试&#xff0c;强大的标记功能 电校准&#xff08;ECal&#xff09; 内部使用测试序列的自动化 可选时域…

【网络编程】基于UDP数据报实现回显服务器程序

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 前言 我们如果…

自媒体短视频音效、配乐素材哪里找?

找短视频音乐、音效素材就上这5个网站&#xff0c;免费下载&#xff0c;建议收藏。 1、潮点视频 https://shipin520.com/shipin-yy/?from_code2510 一个专门分享高质量视频的网站&#xff0c;站内还有非常丰富的配乐素材&#xff0c;全部都有详细的分类&#xff0c;可以选择…