IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++--函数的重载和变量的引用 -> 正文阅读

[C++知识库]C++--函数的重载和变量的引用

一.重载

1.定义:

函数名返回类型相同(为什么返回类型一定相同,后面会说),但是参数不同(这种不同可以是个数不同or类型不同or顺序不同)的两个函数称为重载函数,它们两个构成重载关系。

2.举例:

#include <iostream>
 void Swap(int* pa, int* pb)
{}
void Swap(float*pa, float* pb)
{}

当我们要实现交换两个数这一操作时,在C语言中我们为了防止命名冲突,我们可以定义:Swap_int(), Swap_float()等等的函数。C++中,引出函数重载目的就是为了避免这种情况。当我要交换不同的两个元素时,我们均可以用Swap()来作为函数名,只不过函数的参数因元素的类型而变,当我们调用Swap函数时,会自动识别你要交换的元素类型,然后调用相匹配的函数来完成操作。(事实上,实现这种参数匹配,也是通过命名空间来实现的)。

3.会什么返回值必须相同,才能叫重载?

如果两个函数名相同,参数也相同,只有返回值不同。当你在调用函数时,接收返回值往往是在函数栈帧结束,所以并不能在调用函数之前识别并选择使用哪个函数,因此会造成歧义。

二.变量的引用

1.何为引用?

当我们用C的方法交换两个数据是,则会采用以下方法:

#include <iostream>
using namespace std;


void Swap(int* pa, int* pb)
{
	int tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	Swap(&a, &b);
	cout << a << endl << b << endl;
	return 0;
}

很显然,我们必须将两个变量的地址作为参数传入Swap,才可以实现目标。

当我们用C++的引用方式时,则可以有如下代码:

#include <iostream>
using namespace std;


void Swap(int& a, int& b)
{
	int tmp = a;
	a = b;
	b = tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	Swap(a, b);
	cout << a << endl << b << endl;
	return 0;
}

?

首先,明确一下引用的方式,int a = 10;

int& b = a;

这两行代码就完成了引用,我们可以认为b是a的别名;

继续看上述代码,当我们把a,b作为参数 传入Swap函数时,并不是说把a,b 简单的copy了一份,而是把a,b确确实实传进了函数;函数是对a,b的两个别名进行了交换,也就是完成了a,b的交换。

2.引用的应用场景:传参数,做返回值

传参数的情况,我们上面已经演示过了。我们可以看到,引用的传参数功能,一定程度上简化了C中的指针。下面着重说一下做返回值的用处。

同理,我们先回顾常见的传值返回。

#include <stdio.h>

int Add(int a, int b)
{
    int c = a + b;
    return c;
}

int main()
{
    int a = 10;
    int b = 20;
    int sum = Add(int a, int b);
    return 0;
}

我们先描述整个加法计算的过程:首先我们将a,b拷贝一份传入Add函数,该函数将拷贝来的数值进行加法计算然后赋给了C,最后函数将C的值进行返回,返回之后该函数销毁,外部用sum来接收到返回值,即得到结果。现在有一个疑问:很显然,C是一个局部变量,当我们返回C以后,这层栈帧就销毁了,那既然销毁了,sum是如何拿到c的值呢?

答案是:c在返回以后,会产生一个临时变量,copy这个c值,而这个临时变量并不会在函数结束之后销毁,所以sum接收这个值,实际上是从这个临时变量copy过来的。

相反,如果我们将这个c定义成一个static的变量,那他就不会销毁,sum接收到的值就是从c拷贝过来的。

那我们思考一下,既然将c定义成static的变量,返回这样的值,都要copy,总归不太好。所以这里我们可以用引用的方式返回,即返回c的别名,那就避免了copy,一定程度上节省了空间,提高了效率。

代码如下:

#include <iostream>

int Add(int a, int b)
{
    static int c = a + b;
    return c;
}

int main()
{
    int a = 10;
    int b = 20;
    int& sum = Add(int a, int b);
    return 0;
}

3.const引用

1.为什么要加const?

在函数调用时,我们在用引用传参时,传入的实际是真真切切的变量,而传入的参数往往是不希望被修改的,因此引入const来修饰传入的参数,可以避免这一情况。

2.权限问题

所谓权限问题,通俗解释是:当我们在使用引用时,权限可以平移,缩小,但不可以放大。

举例:

const int a = 10;
int& b = a;
const int& c = a;

我们可以看到a是一个const修饰的变量,即是一个不可修改的变量;而b并没有const修饰,即b是一个可以修改的变量,而用b来引用a,很明显会使得a的权限变大,所以第二行无疑是错误的;反观第三行,则就是正确的引用,所以c引用a,可以认为是权限的平移,b引用a可以认为是权限的放大。

int a = 10;
const int& b = a;

这两行,我们发现a是可以修改的,用不可修改的b来引用则会使a的权限缩小,这种也是被允许的,所以是正确的引用。

double a = 10.0;
int b = a;
int& c = a;
const int& d = a;

最后一个例子:首先我们定义一个double的a,然后用int的b来对她做类型转换,这种是完全可以的,也就是显式类型转换,但是这里我们要清楚,变量的类型转换是会产生临时变量(不知道的可以自行百度),临时变量是不可以被修改的。所以前两行的操作细节是:将a放入临时变量,然后编译器自动修改适应b的类型,最终赋给b.

而第三行试图用Int&去引用a就是错误的,临时变量是不能修改的,即临时变量本身可以认为就是const修饰的,因而第四行的引用才是正确的。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:08:17  更:2022-09-21 00:10:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:07:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码