【c++】入门2

函数重载

函数重载:是函数的一种特殊情况,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.hqwc.cn/news/299871.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cesium.js三维地图的实现(依托天地图CDN文件)

零、技术选型&#xff1a; Vue2、VueCli5、天地图、Cesium.js 一、通过天地图官网案例实现 需要引入天地图官方提供的CDN链接访问Cesium.js相关文件 相关文件&#xff1a; https://api.tianditu.gov.cn/cdn/demo/sanwei/static/cesium/Cesium.js https://api.tianditu.gov.cn/…

短视频矩阵系统的崛起和影响

近年来&#xff0c;短视频矩阵系统已经成为了社交媒体中的一股新势力。这个新兴的社交媒体形式以其独特的魅力和吸引力&#xff0c;迅速吸引了大量的用户。这个系统简单来说就是将海量短视频整合在一个平台上&#xff0c;使用户可以方便地观看和分享好玩有趣的短视频。 短视频…

给零基础朋友的编程课07 - 代码

给零基础朋友的编程课07-初识色彩、初识变量、案例3讲解_哔哩哔哩_bilibili Code: // // 案例3 // //// -设定画面- // size(1000, 1000); // 设置画面大小 background(7, 119, 132); // 设置背景颜色// - 绘画 - //// 1 绘制垂线 // 设定线条风格 …

等级保护安全的管理机构与管理制度

目录 安全管理机构的控制点 岗位设置 人员配备 授权和审批 沟通和合作 审核和检查 安全管理制度的控制点 安全管理制度 指定和发布 评审和修订 安全管理机构的控制点 岗位设置 人员配备 授权和审批 沟通和合作 审核和检查 安全管理制度的控制点 安全管理制度 指定…

VMware17Pro虚拟机安装Linux CentOS 7.9(龙蜥)教程(超详细)

目录 1. 前言2. 下载所需文件3. 安装VMware3.1 安装3.2 启动并查看版本信息3.3 虚拟机默认位置配置 4. 安装Linux4.1 新建虚拟机4.2 安装操作系统4.2.1 选择 ISO 映像文件4.2.2 开启虚拟机4.2.3 选择语言4.2.4 软件选择4.2.5 禁用KDUMP4.2.6 安装位置配置4.2.7 网络和主机名配置…

小白入门之安装IDEA

重生之我在大四学JAVA 第二章 安装IDEA开发工具 文章以IDEA2019版本为例&#xff0c;新版本激活方式不同 勾选创建桌面图标&#xff0c;接着install就可以了 选择这个文件 存在这个表示安装Po解插件了 然后打开IDEA 一定要勾选&#xff0c;不勾选不能自动激活 到…

基于SSM+Vue的教材信息管理系统(Java毕业设计)

点击咨询源码 大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的…

SpaceDesk如何连接平板/PC(生产力副屏)

1、下载安装 分为安卓端和PC端&#xff0c;两个设备都需要安装对应的软件。 SpaceDesk官网 https://link.zhihu.com/?targethttp%3A//spacedesk.net/ 需要魔法上网。安装过程比较简单&#xff0c;无脑下一步即可。 我已经把安装包准备好了&#xff0c;如果不想自己找&#…

C++ 比 C语言的新增的特性 1

1. C是C的增强 1.1 C是静态类型的语言&#xff0c;具有严格的数据类型检查 1.1.1 c 因为const修饰的变量不允许修改&#xff0c;但是只给了警告&#xff0c;不严谨 const int a10;a20; //报错int *p&a;*p20;//a的值&#xff1f; test1.c:6:9: warning: initialization dis…

解决Qt“报无法定位程序输入点xxx于动态连接库“问题

今天&#xff0c;在使用QtVS2019编译工程时&#xff0c;弹出"无法定位程序输入点xxx于动态链接库"问题&#xff0c;如图(1)所示&#xff1a; 图(1) 报"无法定位程序输入点xxx于动态链接库"问题 出现这种问题的原因有很多&#xff1a; (1) 工程Release/Deb…

[2023-年度总结]凡是过往,皆为序章

原创/朱季谦 2023年12月初&#xff0c;傍晚&#xff0c;在深圳的小南山看了一场落日。 那晚我们坐在山顶的草地上&#xff0c;拍下了这张照片——仿佛在秋天的枝头上&#xff0c;结出一颗红透的夕阳。 这一天很快就会随着夜幕的降临&#xff0c;化作记忆的碎片&#xff0c;然…

pci_enable_device()

前言 在 PCI 总线下&#xff0c;当 PCIe 设备和 PCIe 驱动匹配后&#xff0c;就会执行驱动的 probe() 函数来初始化设备&#xff0c;以让设备正常运行。 在 probe() 函数中&#xff0c;最先做的事情就是执行 pci_enable_device() 来使能设备。如果设备都无法使能的话&#xff…