C++函数

本文仅讨论C++中新增的函数功能,已默认具有C语言基础。

函数的默认参数

函数的形参支持在定义函数时设置默认参数。

默认参数优先级低于实参。若此参数无实参,其将使用位于形参处设置的默认参数;若此参数有实参,则将使用实参值。

默认参数必须在形参表从右至左进行设置,不能跳跃参数设置。

通过默认参数,可以不同数量的实参调用相同函数。

例:

void fun(int a,int b=10,int c=20);
//调用:
fun(10);//a=10,b=10,c=20
fun(10,20);//a=10,b=20,c=20
fun(10,20,30);//a=10,b=20,c=30

函数重载(函数多态)

多态即一个对象可以具有多种形式,是C++的面向对象重要内容。函数的多态——函数重载,指对函数名进行重载,允许创建多个形参表不同的同名函数,它们构成了同名函数族。

形参表不同:若两个函数的形参数目或数据类型不同,则认为其形参表不同。注意,引用和非引用视为相同数据类型。

调用具有重载的函数时,编译器会首先检查实参的数据类型与哪个函数形参的数据类型相匹配;若没有严格匹配项,编译器将会自动尝试进行强制类型转换以匹配,但若经过强制类型转换后能与多个函数的形参数据类型匹配,则会产生错误。

注意,函数重载仅检查函数形参表是否不同,不检查函数返回值类型是否不同。即若函数形参表相同,但函数返回值不同,则无法进行重载。

通过函数重载,可以使用多个同名且形参表不同的函数。

例:以下print函数将支持多种数据类型的传入

void print(int a);
void print(float a);
void print(string a);
void print(int[] a);

函数模板

泛型编程,是指并不关心数据类型,将数据类型抽象出来(可近似理解为抽象数据类型,ADT),从而建立更通用化的程序。泛型是实现C++面向对象特性的重要组成部分。模板(Template)是泛型编程的重要内容,分为函数模板与类模板。

通过函数模板引入泛型函数,可在定义函数形参时并不关心实际数据类型,从而建立通用函数。编译器根据传入的实参进行自动类型推导,从而生成对应数据类型版本的函数实例。

  • 先声明后定义:

    template<typename 泛型名1,typename 泛型名2,...>
    
  • 边声明边定义:

    template<typename 泛型名1,typename 泛型名2,...>
    返回值类型 函数名(形参表){
        //语句
    }
    

<>中的内容称为模板参数,其中typename为关键字,也可替换为class,泛型在定义后即可像常规数据类型使用,但定义的所有泛型必须全部使用。

例:

template<typename T>
T sum(T a,T b){
    return a+b;
}

//调用:
add(2,3);//自动创建int版本的sum
add(1.1,1.2);//自动创建double版本的sum
posted @ 2025-03-28 12:46  椰萝Yerosius  阅读(33)  评论(0)    收藏  举报