C++基础9:函数2

本文详细介绍了C++中的函数特性,包括默认参数、函数重载、函数模板及其特例化、函数指针、函数引用以及递归函数的使用。默认参数使得函数调用更为便捷,函数重载允许同名函数通过不同的参数列表区分。函数模板则实现了泛型编程,而模板特例化针对特殊情况定制。函数指针用于回调和实现灵活的调用,函数引用则提供了一种别名方式。最后,递归函数通过自我调用来解决复杂问题,但也需要注意其可能导致的栈溢出和效率问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.默认参数(C++):让函数调用更加方便

2.函数重载(C++)

3.函数模板

4.模板特例化

5.函数指针

6.函数引用

7.递归函数(难):自己调自己


1.默认参数(C++):让函数调用更加方便

在函数声明里面给一些参数赋值

float norm(float x, float y, float z);
float norm(float x, float y, float z = 0);//,默认参数只能从尾部开始定义
float norm(float x, float y = 0, float z);//上面定义过z,这里可以直接定义y,且默认参数不可重定义,只能设一次
int main()
{	
    cout << norm(3.0f) << endl;
    cout << norm(3.0f, 4.0f) << endl;
    cout << norm(3.0f, 4.0f, 5.0f) << endl;
    return 0;
}

float norm(float x, float y, float z)//L2范数
{
    return sqrt(x * x + y * y + z * z);
}

2.函数重载(C++)

C99对浮点数四舍五入

<math.h>
double      round  (double x);
float       roundf (float x);
long double roundl (long double x);

C++11

<cmath>
double      round (double x);
float       round (float x);
long double round (long double x);

函数名一样,参数列表不同

C++里面,相同的函数,函数名和参数列表相同,被认为同一个函数,当函数名相同,参数列表不同,被认为不同函数。

但是返回值不计入

3.函数模板

int sum(int x, int y)
{
    cout << "sum(int, int) is called" << endl;
    return x + y;
}
float sum(float x, float y)
{
    cout << "sum(float, float) is called" << endl;
    return x + y;
}
double sum(double x, double y)
{
    cout << "sum(double, double) is called" << endl;
    return x + y;
}
//函数名相同,参数列表和返回值不同
template<typename T>//定义一个泛型T
T sum(T x, T y)
{
    cout << "The input type is " << typeid(T).name() << endl;// typeid(T).name()返回一个字符串,输入T的类型是什么
    return x + y;
}
//编译器看到这段代码,不会生成真正可执行代码,他不知道加法操作怎么做(类型不知道)
//显式实例化
// instantiates sum<double>(double, double)
template double sum<double>(double, double);//定义完模板,告诉编译器类型
// instantiates sum<char>(char, char), template argument deduced
template char sum<>(char, char); 可简化
// instantiates sum<int>(int, int), template argument deduced
template int sum(int, int); 简化
//
template<typename T>
T product(T x, T y)
{
    cout << "The input type is " << typeid(T).name() << endl;
    return x * y;
}
// Implicitly instantiates product<int>(int, int)
cout << "product = " << product<int>(2.2f, 3.0f) << endl;//猜测是int
// Implicitly instantiates product<float>(float, float)
cout << "product = " << product(2.2f, 3.0f) << endl;

4.模板特例化

如果是一个结构体类型的上面的函数模板不知道怎么运算

struct Point
{
    int x;
    int y;
};
template<>//<>表示特例化
Point sum<Point>(Point pt1, Point pt2)
{
    cout << "The input type is " << typeid(pt1).name() << endl;
    Point pt;
    pt.x = pt1.x + pt2.x;
    pt.y = pt1.y + pt2.y;
    return pt;
}

5.函数指针

指向指令区地址

float norm_l1(float x, float y);
float norm_l2(float x, float y); 
float (*norm_ptr)(float x, float y); 

float (*norm_ptr)函数变量是一个指针,指针的名字叫norm_ptr,指向函数的指针,指向的函数要求,指向的函数类型和指针完全匹配,指向的函数有两个参数,都是float,返回值也是float

norm_ptr = norm_l1; //Pointer norm_ptr is pointing to norm_l1
norm_ptr = &norm_l2; //Pointer norm_ptr is pointing to norm_l2
float len1 = norm_ptr(-3.0f, 4.0f); //function invoked 
float len2 = (*norm_ptr)(-3.0f, 4.0f); //function invoked上下等价

作用:回调函数(函数指针的调用,即是一个通过函数指针调用的函数)

<stdlib.h>
//快速排序(数组)
//对一下类型排序困难
struct Point
struct Person

void qsort( void *ptr, size_t count, size_t size,
            int (*comp)(const void *, const void *) );

int (*comp)(const void *, const void *)//外面自己写的函数用于比较

6.函数引用

float norm_l1(float x, float y); //declaration
float norm_l2(float x, float y); //declaration
float (&norm_ref)(float x, float y) = norm_l1; //norm_ref is a function reference必须初始化

7.递归函数(难):自己调自己

int main()
{
    div2(1024.); // call the recursive function
    return 0;
}

void div2(double val)
{
    cout << "Entering val = " << val << endl;
    if (val > 1.0)//停止条件
        div2( val / 2); // function calls itself
    else
        cout << "--------------------------" << endl;
    cout << "Leaving val = " << val << endl;
}

优点:

I)算法:对数的遍历,数的操作,用很少的代码写很复杂的代码

缺点:

i)不小心写错容易爆栈

ii)会消耗更多的栈的内存

iii)可能慢

iiii)困难debug

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值