重载

重载定义:同一标识符在不同的上下文中有不同的意义。

重载函数定义: 用同一个函数名定义不同的函数,函数名和不同函数参数搭配时函数有不同的含义。

#include <stdio.h>
#include <string.h>

int func(int x)
{
    return x;
}

int func(int a, int b)
{
    return a + b;
}

int func(const char* s)
{
    return strlen(s);
}

int main(int argc, char *argv[])
{
    printf("%d
", func(3));               // 3
    printf("%d
", func(4, 5));            // 9
    printf("%d
", func("D.T.Software"));  // 12
    
    return 0;
}

函数重载条件:(至少满足下面一个条件)

    1.参数个数不同

    2.参数类型不同

    3.参数顺序不同

//函数重载遇上函数默认参数
#include <stdio.h>

int func(int a, int b, int c = 0)
{
    return a * b * c;
}

int func(int a, int b)
{
    return a + b;
}


int main(int argc, char *argv[])
{
    int c = func(1, 2);    // 编译出错 func(int,int)目标函数不明确
    
    return 0;
}
// C++引入太多特性,而特性又是冲突的

函数重载准则:

      1.将所有的同名函数作为候选函数,在候选函数进行参数匹配

      2.匹配成功:可以精确匹配每个参数

            通过默认参数可以匹配参数

            通过类型转换可以匹配参数

      3.匹配失败:可以同时匹配多个函数。

            无法匹配任何一个函数。

注意:

   1. 重载函数本质上时不同的函数,有不同的内粗地址。

   2. 重载函数的函数类型不同。

   3. 函数返回值不可以作为重载判断条件。

   4. 重载用函数名和参数列表决定。

#include <stdio.h>

int add(int a, int b)  // int(int, int)
{
    return a + b;
}

int add(int a, int b, int c) // int(int, int, int)
{
    return a + b + c;
}

int main()
{
    printf("%p
", (int(*)(int, int))add);        //address1
    printf("%p
", (int(*)(int, int, int))add);   //address2

    return 0;
}

函数重载与函数指针

    将函数指针赋值给函数重载时:

    1. 选函数指针参数与候选者函数参数列表一样。

    2. 选函数指针返回值与候选者函数参数返回值一样(函数类型一样)。

#include <stdio.h>
#include <string.h>

int func(int x)
{
    return x;
}

int func(int a, int b)
{
    return a + b;
}

int func(const char* s)
{
    return strlen(s);
}

typedef int(*PFUNC)(int a);

int main(int argc, char *argv[])
{
    int c = 0;
    PFUNC p = func;      
    c = p(1);      
    printf("c = %d
", c);
    return 0;
}

注意:

  1. 函数重载必须发送在同一作用域(全局作用域,类作用域)。

  2. 无法通过函数名得到重载函数入口地址,函数名和参数列表共同决定函数入口地址。

原文地址:https://www.cnblogs.com/zsy12138/p/10685090.html