首页 > 其他分享 >函数重载及其匹配顺序

函数重载及其匹配顺序

时间:2023-06-18 23:44:24浏览次数:33  
标签:顺序 匹配 函数 int void fun 重载

1.函数重载

概念:同一个作用域内,同名函数,参数列表不同(参数个数、类型或顺序不同)。

  • 与返回值类型没有关系。如果函数名和参数列表相同,无论返回值类型是否相同,会编译错误(函数重定义)
  • const是有效的重载。
  • 仅默认参数值不同不是有效的重载。例如
int fun(int a = 0);
// void fun(int a = 1); // error: functions that differ only in their return type cannot be overloaded
  • virutal是无效的重载。virtual关键字可有可无,不影响是否是重载函数。

2.函数重载匹配顺序

编译器根据最佳匹配确定调用哪个函数。C++ 编译器遵循以下先后顺序:

  • 先找参数完全匹配的普通函数(非由模板实例化得到的函数)。
  • 再找参数完全匹配的模板函数
  • 再找实参经过自动类型转换后能够匹配的普通函数。
  • 如果上面的都找不到,则报错。
template <class T>
void fun(T x, T y) { cout << "fun1" << endl; }

template <class T1, class T2>
void fun(T1 x, T2 y) { cout << "fun2" << endl; }

void fun(int x, int y, int z = 0) { cout << "fun3" << endl; }
void fun(char x, char y) { cout << "fun4" << endl; }

int main()
{
    int i1=2, i2=3, i3=5;
    char c1='a', c2='c', c3='d';
    double f1=2.45, f2=5.68;

    fun(i1, i2);     // fun3
    fun(f1, f2);     // fun1
    fun(i1, f1);     // fun2
    fun(i1, i2, i3); // fun3
    fun(c1, c2);     // fun4
}

当使用具有默认形参值的函数重载形式时,需要注意防止二义性,例如:

void fun(int x, int y, int z = 0) { cout << "fun1" << endl; }
int  fun(int x, int y)            { cout << "fun2" << endl; return 0; } // 不报错,但是函数调用容易导致二义性
//int fun(int x, int y, int z) { return 0; } // 报错,不是有效的重载(即使返回值和第3个参数不同)

int main()
{
    int i1=2, i2=3, i3=5;

    fun(i1, i2, i3); // fun1
//    fun(i1, i2);     // 报错,二义性。无法确定调用哪个函数
}

标签:顺序,匹配,函数,int,void,fun,重载
From: https://www.cnblogs.com/devin1024/p/17490036.html

相关文章

  • KMP字符串匹配
    kmp算法是优化字符串匹配效率://KMP字符串匹配://模板:#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+10;chars1[N],s2[N];intn,m,ne[N];intmain(){cin>>s1+1>>s2+1;n=strlen(s1+1),m=strlen(s2+1);for(inti=2,j=0;i<=m;i++){......
  • NOI / 1.9编程基础之顺序 09:直方图
    描述给定一个非负整数数组,统计里面每一个数的出现次数。我们只统计到数组里最大的数。假设Fmax(Fmax<10000)是数组里最大的数,那么我们只统计{0,1,2.....Fmax}里每个数出现的次数。输入第一行n是数组的大小。1<=n<=10000。紧接着一行是数组的n个元素。输出按顺序输......
  • 运算符重载知识点总结
    #运算符重载在数学上,两个复数可以直接进行+、-等运算。但在C++中,直接将+或-用于复数对象是不允许的。•有时会希望,让对象也能通过运算符进行运算。这样代码更简洁,容易理解。•例如:complex_a和complex_b是两个复数对象;求两个复数的和,希望能直接写:complex_a+complex_b在数学上......
  • 正则表达式匹配:元字符、分组匹配、数量匹配
    数量匹配: ......
  • opencv 模板匹配
    -逐个比较像素点之间差异importcv2importnumpyasnpimg=cv2.imread('C:/Users/59925/Desktop/pytest/pics/minions-s.jpg',0)#把图片读取成灰度图template=cv2.imread('C:/Users/59925/Desktop/pytest/pics/eye.jpg',0)#把图片读取成灰度图method='cv2.TM_SQDIFF_NORMED&......
  • 单模字符串匹配算法(KMP, exKMP, manacher)
    约定:本文字符串均从\(1\)开始。模式串\(T\)的长度为\(n\),匹配串\(S\)的长度为\(m\)。1.KMP1.1前缀函数给定一个长度为\(n\)的字符串\(S\),其前缀函数被定义为一个长度为\(n\)的数组\(\pi\)。其中\(\pi_i\)被定义为:若子串\(S[1\cdotsi]\)有一对相等的真前......
  • 字符串的模式匹配算法
    一.模式匹配字符串的模式匹配算法是用来查找一个字符串中是否存在另一个指定的字符串(即模式)的算法。常见的模式匹配算法包括暴力匹配算法、KMP算法、Boyer-Moore算法和Rabin-Karp算法。暴力匹配算法:暴力匹配算法也称为朴素匹配算法,是最简单的一种字符串匹配算法。它从主串的第一个......
  • 【初识C++】(缺省参数和函数重载)
    @TOC一、缺省参数1.缺省参数定义缺省参数是在函数的声明中给定参数一个指定的值。如果传参没有给定参数,那就按照声明中默认的缺省值,如果给定了参数,那就按照给定的参数值。比如:usingnamespacestd;voidFunc(inta=0){ cout<<a<<endl;}intmain(){ Func(); //......
  • NOIP2020 T2 字符串匹配【题解】
    NOIP2020T2字符串匹配首先声明这篇题解存在大多数让我这种人看懂的废话,如果想要速通,请另寻他解题目简化定义字符串乘法为\(AB\)为把两个字符串拼起来,定义阶乘\(A^i\)表示\(\prod_{1}^iA\)再定义\(F(S)\)为\(S\)中出现奇数次字符的数量现给定一个字符串\(S\),求......
  • 正则表达式 匹配字符串中的所有 图片片路径
    getImgPath(str){//匹配图片(g表示匹配所有结果i表示区分大小写)constimgReg=/<img.*?(?:>|\/>)/gi//匹配src属性constsrcReg=/src=[\'\"]?([^\'\"]*)[\'\"]?/iconstarr=str.match(imgReg)for(leti=0;i<ar......