12.函数重载

12.函数-函数重载


12.1 知识点

基本概念

重载概念

在同一语句块(class或者struct)中,函数(方法)名相同,参数的数量不同或者参数的数量相同但类型或顺序不同,即为函数重载。

作用

  • 命名一组功能相似的函数,减少函数名的数量,避免命名空间的污染。
  • 提升程序可读性。

函数重载实例

注意

  • 重载和返回值类型无关,只和参数类型、个数、顺序有关。
  • 程序会根据传入的参数类型自动判断使用哪一个重载。

主函数外 class语句块内

求和函数函数重载例子
// 参数数量相同 类型也相同 只是含有参数默认值的函数 不算函数重载 会报错
// static int CalcSum(int a, int b=1)
// {
//     return a + b;
// }

// 参数数量不同 的求和函数重载
static int CalcSum(int a, int b, int c)
{
    return a + b + c;
}

// 参数数量相同 参数类型不同 的求和函数重载
static float CalcSum(float a, float b)
{
    return a + b;
}

// 参数数量相同 参数类型不同 的求和函数重载
static float CalcSum(int a, float f)
{
    return a + f;
}

// 参数数量相同 参数顺序不同 的求和函数重载
static float CalcSum(float f, int a)
{
    return f + a;
}

// 参数含有ref和out修饰符 的求和函数重载
// ref和out 可以理解成 他们也是一种变量类型 所以可以用在重载中 但是 ref和out不能同时修饰

// 参数含有ref修饰符 的求和函数重载
static float CalcSum(ref float f, int a)
{
    return f + a;
}

// 存在有ref修饰符 的求和函数重载 在相同参数将ref修饰符改成out修饰符 会报错
// static float CalcSum(out float f, int a)
// {
//     return f + a;
// }

// 参数含有out修饰符 的求和函数重载 out修饰的参数不同 不会报错
static float CalcSum(float f, out int a)
{
    a = 0;
    return f + a;
}

// 参数含有变长参数 的求和函数重载
static float CalcSum(int a, int b, params int[] arr)
{
    return 1;
}

主函数内

// 求和函数
CalcSum(1, 2);

// 参数数量不同 的求和函数重载
CalcSum(1, 2, 3);

// 参数数量相同 参数类型不同 的求和函数重载
CalcSum(1.1f, 1.1f);

// 参数数量相同 参数类型不同 的求和函数重载
CalcSum(2, 1.1f);

// 参数数量相同 参数顺序不同 的求和函数重载
CalcSum(1.1f, 2);

// 参数含有ref和out修饰符 的求和函数重载
float floatVal = 1.1f;
CalcSum(ref floatVal, 2); // 参数含有ref修饰符 的求和函数重载

int intVal = 2;
CalcSum(1.1f, out intVal); // 参数含有out修饰符 的求和函数重载

// 参数含有变长参数 的求和函数重载
CalcSum(1, 2, 3, 4);

总结

  • 概念: 同一个语句块中,函数名相同,参数数量、类型、顺序不同的函数就称为重载函数。
  • 注意: 重载和返回值无关。
  • 作用: 一般用来处理不同参数的同一类型的逻辑处理。

12.2 知识点代码

using System;

namespace Lesson10_函数重载
{
    class Program
    {
        #region 知识点一 基本概念
        //重载概念
        //在同一语句块(class或者struct)中
        //函数(方法)名相同
        //参数的数量不同 
        //或者
        //参数的数量相同,但参数的类型或顺序不同

        //作用:
        //1.命名一组功能相似的函数,减少函数名的数量,避免命名空间的污染
        //2.提升程序可读性
        #endregion

        #region 知识点二 函数重载实例

        //注意:
        //1.重载和返回值类型无关,只和参数类型,个数,顺序有关
        //2.调用时 程序会自己根据传入的参数类型判断使用哪一个重载

        //主函数外 class语句块内

        //求和函数函数重载例子

        //求和函数
        static int CalcSum(int a, int b)
        {
            return a + b;
        }

        //参数数量相同 类型也相同 只是含有参数默认值的函数 不算函数重载 会报错
        //static int CalcSum(int a, int b=1)
        //{
        //    return a + b;
        //}

        //参数数量不同 的求和函数重载
        static int CalcSum(int a, int b, int c)
        {
            return a + b + c;
        }

        //参数数量相同 参数类型不同 的求和函数重载
        static float CalcSum(float a, float b)
        {
            return a + b;
        }

        //参数数量相同 参数类型不同 的求和函数重载
        static float CalcSum(int a, float f)
        {
            return a + f;
        }

        //参数数量相同 参数顺序不同 的求和函数重载
        static float CalcSum(float f, int a)
        {
            return f + a;
        }


        //参数含有ref和out修饰符 的求和函数重载

        //ref和out 可以理解成 他们也是一种变量类型 所以可以用在重载中 但是 ref和out不能同时修饰

        //参数含有ref修饰符 的求和函数重载
        static float CalcSum(ref float f, int a)
        {
            return f + a;
        }

        //存在有ref修饰符 的求和函数重载 在相同参数将ref修饰符改成out修饰符 会报错
        //static float CalcSum(out float f, int a)
        //{
        //    return f + a;
        //}

        //参数含有out修饰符 的求和函数重载 out修饰的参数不同 不会报错
        static float CalcSum(float f,out int a)
        {
            a = 0;
            return f + a;
        }

        //参数含有变长参数 的求和函数重载
        static float CalcSum(int a, int b, params int[] arr)
        {
            return 1;
        }


        #endregion


        //总结
        //概念:同一个语句块中,函数名相同,参数数量、类型、顺序不同的函数 就称为我们的重载函数
        //注意:和返回值无关
        //作用:一般用来处理不同参数的同一类型的逻辑处理

        static void Main(string[] args)
        {
            Console.WriteLine("函数重载");

            #region 知识点二 函数重载实例
            //主函数内

            CalcSum(1, 2);//求和函数

            CalcSum(1, 2, 3);//参数数量不同 的求和函数重载
            CalcSum(1.1f,1.1f);//参数数量相同 参数类型不同 的求和函数重载
            CalcSum(2, 1.1f);//参数数量相同 参数类型不同 的求和函数重载
            CalcSum(1.1f, 2);//参数数量相同 参数顺序不同 的求和函数重载

            //参数含有ref和out修饰符 的求和函数重载
            float floatVal = 1.1f;
            CalcSum(ref floatVal, 2);//参数含有ref修饰符 的求和函数重载
            int intVal = 2;
            CalcSum(1.1f, out intVal);//参数含有out修饰符 的求和函数重载

            CalcSum(1, 2, 3,4);//参数含有变长参数 的求和函数重载
            #endregion
        }
    }
}

12.3 练习题

请重载一个函数,让其可以比较两个 int 或两个 float 或两个 double 的大小,并返回较大的那个值

主函数外 class 语句块内

static int GetMax(int a, int b)
{
    return a > b ? a : b;
}

static float GetMax(float a, float b)
{
    return a > b ? a : b;
}

static double GetMax(double a, double b)
{
    return a > b ? a : b;
}

主函数内

Console.WriteLine(GetMax(1, 2));           // 输出:2
Console.WriteLine(GetMax(1.1f, 2.2f));     // 输出:2.2
Console.WriteLine(GetMax(10.2, 20.3));     // 输出:20.3

请重载一个函数,让其可以比较 n 个 int 或 n 个 float 或 n 个 double 的大小,并返回最大的那个值(用 params 可变参数来完成)

主函数外 class 语句块内

static int GetMax(params int[] arr)
{
    if (arr.Length == 0)
    {
        Console.WriteLine("没有传入任何参数");
        return -1;
    }
    int max = arr[0];
    for (int i = 1; i < arr.Length; i++)
    {
        if (max < arr[i])
        {
            max = arr[i];
        }
    }
    return max;
}

static float GetMax(params float[] arr)
{
    if (arr.Length == 0)
    {
        Console.WriteLine("没有传入任何参数");
        return -1;
    }
    float max = arr[0];
    for (int i = 1; i < arr.Length; i++)
    {
        if (max < arr[i])
        {
            max = arr[i];
        }
    }
    return max;
}

static double GetMax(params double[] arr)
{
    if (arr.Length == 0)
    {
        Console.WriteLine("没有传入任何参数");
        return -1;
    }
    double max = arr[0];
    for (int i = 1; i < arr.Length; i++)
    {
        if (max < arr[i])
        {
            max = arr[i];
        }
    }
    return max;
}

主函数内

Console.WriteLine(GetMax(1, 2, 3, 4, 5, 6));       // 输出:6
Console.WriteLine(GetMax(1.1f, 2.2f, 3, 4, 5, 6)); // 输出:6
Console.WriteLine(GetMax(1.1, 2, 3, 4, 5, 6));      // 输出:6

12.4 练习题代码

using System;

namespace Lesson10_练习题
{
    class Program
    {
        #region 练习题一
        //请重载一个函数
        //让其可以比较两个int或两个float或两个double的大小
        //并返回较大的那个值

        //主函数外 class语句块内
        static int GetMax(int a, int b)
        {
            return a > b ? a : b;
        }

        static float GetMax(float a, float b)
        {
            return a > b ? a : b;
        }

        static double GetMax(double a, double b)
        {
            return a > b ? a : b;
        }

        #endregion

        #region 练习题二
        //请重载一个函数
        //让其可以比较n个int或n个float或n个double的大小
        //并返回最大的那个值。(用params可变参数来完成)

        //主函数外 class语句块内
        static int GetMax(params int[] arr)
        {
            if( arr.Length == 0 )
            {
                Console.WriteLine("没有传入任何参数");
                return -1;
            }
            //因为默认认为第一个数就是最大值了 所以没有必要和第一个数比较
            int max = arr[0];
            //所以直接从i=1开始遍历
            for (int i = 1; i < arr.Length; i++)
            {
                if( max < arr[i] )
                {
                    max = arr[i];
                }
            }
            return max;
        }

        static float GetMax(params float[] arr)
        {
            if (arr.Length == 0)
            {
                Console.WriteLine("没有传入任何参数");
                return -1;
            }
            //因为默认认为第一个数就是最大值了 所以没有必要和第一个数比较
            float max = arr[0];
            //所以直接从i=1开始遍历
            for (int i = 1; i < arr.Length; i++)
            {
                if (max < arr[i])
                {
                    max = arr[i];
                }
            }
            return max;
        }

        static double GetMax(params double[] arr)
        {
            if (arr.Length == 0)
            {
                Console.WriteLine("没有传入任何参数");
                return -1;
            }
            //因为默认认为第一个数就是最大值了 所以没有必要和第一个数比较
            double max = arr[0];
            //所以直接从i=1开始遍历
            for (int i = 1; i < arr.Length; i++)
            {
                if (max < arr[i])
                {
                    max = arr[i];
                }
            }
            return max;
        }

        #endregion

        static void Main(string[] args)
        {
            Console.WriteLine("函数重载练习题");

            #region 练习题一
            //主函数内
            Console.WriteLine(GetMax(1, 2));//2
            Console.WriteLine(GetMax(1.1f, 2.2f));//2.2
            Console.WriteLine(GetMax(10.2, 20.3));//20.3
            #endregion

            #region 练习题二
            //主函数内
            Console.WriteLine(GetMax(1, 2, 3, 4, 5, 6));//6
            Console.WriteLine(GetMax(1.1f, 2.2f, 3, 4, 5, 6));//6
            Console.WriteLine(GetMax(1.1, 2, 3, 4, 5, 6));//6
            #endregion
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏