什么是函数重载?-程序员宅基地

技术标签: C/C++  

前言

函数重载是 C++ 编程的一个特性,它允许我们有多个具有相同名称但不同参数列表的函数,当我说参数列表时,它表示参数的数据类型和顺序,例如函数myfuncn(int a, float b)的参数列表是(int, float),它与函数myfuncn(float a, int b)参数列表(float, int)不同。函数重载是编译时多态。

重载规则

现在我们知道什么是参数列表,让我们看一下重载规则:我们可以在同一范围内拥有以下函数。

print(int num1, int num2)
print(int num1, int num2, int num3)
print(int num1, double num2)

记住这条规则的最简单方法是参数应符合以下任何一个或多个条件,它们应具有不同的类型,数量或顺序的参数。

例如:

这两个函数有不同的参数类型:

print(int num1, int num2)
print(double num1, double num2)

这两个的参数数量不同:

print(int num1, int num2)
print(int num1, int num2, int num3)

这两个有不同的参数顺序:

print(int num1, double num2)
print(double num1, int num2)

以上三种情况都是有效的重载情况。我们可以有任意数量的函数,只需记住参数列表应该是不同的。例如:

int print(int, int)
double print(int, int)

由于参数列表相同,因此不允许这样做。尽管它们具有不同的返回类型,但它无效。

函数重载例1

函数重载指的是一个作用域内的几个函数名字相同但是形参列表不同。

#include <iostream>
#include <string>
using namespace std;

class Test
{
    
public:
	void print(int i)
	{
    
		cout <<"int: "<<i<<endl;
	}

	void print(double f)
	{
    
		cout <<"float: "<<f<<endl;
	}

	void print(string s)
	{
    
		cout <<"string: "<<s<<endl;
	}
	
};

int main(int argc, char const *argv[])
{
    
	
	Test test;
	test.print(50);
	test.print(89.5);
	test.print("minger");

	return 0;
}

编译结果:
在这里插入图片描述

函数重载例2

正如我在本指南开头所提到的,具有不同返回类型和相同参数列表的函数不能重载。但是,如果函数具有不同的参数列表,则它们可以具有相同或不同的返回类型,以便有资格进行重载。简而言之,函数的返回类型在函数重载中不起任何作用。重要的是函数的参数列表。

#include <iostream>
using namespace std;

class DemoClass {
    
	
public:
    int print(int i) {
    
        return i;
    }
    double print(double d) {
    
        return d;
    }
	
};

int main(int argc, char const *argv[]) {
    
	
    DemoClass obj;
    cout<<obj.print(100)<<endl;
    cout<<obj.print(5005.516)<<endl;
	
   return 0;
}

编译输出:

在这里插入图片描述

C++的重载函数与转换构造函数

当我们调用重载的函数时,从多个数类型转换中进行选择将变得更复杂。如果两个或者多个类型转换都提供了同一种可行匹配,则这些类型转换一样好。
举个例子,当几个重载函数的参数分属不同的类类型时,如果这些类恰好定义了同样的转换构造函数,则二义性问题将进一步提升:

#include <iostream>
using namespace std;

struct TEST1
{
    
	int a;
	int b;
	
};

struct TEST2
{
    
	int c;
};

void print(const TEST1&)
{
    
	cout <<"TEST1"<<endl;
}

void print(const TEST2&)
{
    
	cout <<"TEST2"<<endl;
}

int main(int argc, char const *argv[])
{
    
	TEST1 test1;
	TEST1 test2;

	print(test1);
	return 0;
}

在这里插入图片描述

如果在调用重载函数时候,我们需要使用构造函数或者强制类型转换来改变实参类型。避免二义性发生。

C++ 有哪些函数不能重载

析构函数不能重载 ,因为析构函数只能有一个,且不能带参数。析构函数是系统自动调用的,是没有参数表的 。

main函数不能重载

这是在C++ 11标准中说明的:

A program shall contain a global function called main, which is the designated start of the program....
This function shall not be overloaded.

试想如果作为用户程序入口函数的main函数被重载了,那么加载的时候该以哪个为入口呢?

重载函数返回值不同、形参名不同都是不能重载的

double print(const A&);
int print(const A&); 

编译会出错,仅有返回值不同是不可以重载的

int print(const A&test1);
int print(const A&test2); 

编译会出错,仅仅是形参名不同,不可以重载。同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。

总结

函数重载是在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。不能仅通过返回类型的不同来重载函数。

在这里插入图片描述

欢迎关注公众号【程序猿编码】,添加本人微信号(17865354792),回复:领取学习资料,网盘资料有如下:

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chen1415886044/article/details/100941004

智能推荐

CountdownEvent-程序员宅基地

文章浏览阅读131次。 CountdownEvent lets you wait on more than one thread. The class is new to Framework 4.0 and has an efficient, fully managed implementation. To use the class, instantiate it with the number of threads..._using (var countdown = new countdownevent(

利用MTCNN和facenet实现人脸检测和人脸识别-程序员宅基地

文章浏览阅读8.7k次,点赞8次,收藏78次。利用MTCNN和facenet实现人脸检测和人脸识别 人脸检测和人脸识别技术算是目前人工智能方面应用最成熟的技术了。本博客将利用mtcnn和faceNet搭建一个实现人脸检测和人脸识别的系统。基本思路也很简单,先利用mtcnn的进行人脸检测,当然也可以使用其他的人脸检测方法,如Dilb,OpenCV,OpenFace人脸检测等等,然后再利用faceNet进行人脸识别,f......_mtcnn和facenet

Android 中判断网络连接和GPS是否可用及HTTPCLIENT使用-程序员宅基地

文章浏览阅读140次。大家知道Google支持和发布的Android移动操作系统,主要是为了使其迅速占领移动互联网的市场份额,所谓移动互联网当然也是互联网了,凡是涉及互联网的任何软件任何程序都少不了联网模块的开发,诚然Android联网开发也是我们开发中至关重要的一部分,那么Android是怎么样进行联网操作的呢?这篇博客就简单的介绍一下Android常用的联网方式、判断网络连接状态以及volle..._android public void onresponse(bitmap bitmap

Python基础语法——对象与类_python __isub__用法-程序员宅基地

文章浏览阅读1.1k次。1.面向对象相关概念简介类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 方法:类中定义的函数。 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。 局部变量:定义在方法中._python __isub__用法

Hive(总)看完这篇,别说你不会Hive!-程序员宅基地

文章浏览阅读7w次,点赞360次,收藏3.4k次。文章目录1.Hive入门1.1什么是Hive1.2 Hive的优缺点1.2.1 优点1.2.2 缺点1.3Hive架构原理2.Hive安装2.1Hive安装2.2HiveJDBC访问2.2.1启动hiveserver2服务2.2.2连接hiveserver2服务2.2.3注意2.3Hive常用交互命令2.4Hive其他命令操作2.5Hive常见属性配置2.5.1数据仓库位置配置2.5.2查询后信息显示配置2.5.3运行日志信息配置3.Hive数据类型3.1基本数据类型3.2集合数据类型3.3类型转化4.DD

dataframe合并与去重两个方法_dataframe merge去重-程序员宅基地

文章浏览阅读8k次。(一)用mergehttps://blog.csdn.net/sinat_38068807/article/details/90577105(二)用concathttps://blog.csdn.net/sinat_38068807/article/details/90515142_dataframe merge去重

随便推点

解密:古人八拜之交指的是哪八拜?_举杯对饮,八拜之交代表故事是什么生肖故事-程序员宅基地

文章浏览阅读3.7k次。_举杯对饮,八拜之交代表故事是什么生肖故事

CTF 学习笔记_ctf笔记-程序员宅基地

文章浏览阅读4.3k次,点赞7次,收藏60次。CTF起源于1996年DEFCON全球黑客大会,以替代之前黑客们通过互相发起真实攻击进行技术比拼的方式。WordPress是利用PHP开发的博客平台,用户可以在支持PHP和MySQL数据库的服务上架设属于自己的网站。也可以把WordPress当做一个内容管理系统(CMS)来使用。WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用户可以在支持PHP和MySQL数据库的服务器上使用自己的博客。_ctf笔记

python+OpenCV笔记(二十七):反投影图像-程序员宅基地

本文介绍了Python和OpenCV中的反投影图像的概念、工作原理和代码编写。同时提到了直方图和直方图均衡化的相关知识。

(iView)View UI框架中的Modal对话框阻止点击确定按钮时关闭_iview modal关闭事件-程序员宅基地

文章浏览阅读898次。使用官方的代码,value(可用v-model双向绑定)控制modal框的显示隐藏,会出现只要点击了确定按钮,v-model绑定的值自动变为false,关闭modal框,想要的效果:点击确定按钮判断条件决定modal框是否关闭。_iview modal关闭事件

nginx: [warn] duplicate extension xxxx解决方案_nginx: [warn] duplicate extension "js", content ty-程序员宅基地

文章浏览阅读4k次。完整报错如下:nginx: [warn] duplicate extension "html", content type: "text/html", previous content type: "text/html" in /etc/nginx/mime.types:3nginx: [warn] duplicate extension "htm", content type: "text..._nginx: [warn] duplicate extension "js", content type: "text/javascript", pre

VUE中的img的:src动态加载图片的问题,require也不能随便用_require img-程序员宅基地

文章浏览阅读7.8k次,点赞6次,收藏19次。问题描述:写的一个系统,用户登录后会使用数据库的数据作为用户头像,需要显示在页面上,那头像链接就需要用变量表示,那就用到了:src做动态绑定,直接加变量问题解决:1、使用require由于我们在写代码用的链接是编译前的,编译后图片文件,require中直接写死是没有错误的(里面全是字符串的话),但是如果只用一个变量,就会报错2、使用require的小技巧查找到了一篇有用的教程——前端es6 require动态引入图片报错Error: Cannot find module,“因为require它_require img