# 二. 函数

函数原型:由函数首部+分号组成 (如:int Sum (int x,int y);

# 1.带默认参数的函数

int Sum (int a=3,int b=10);

当进行函数调用时,编译器按从左向右的顺序将实参与形参结合

  • 若没有声明函数原型,参数的默认值可在函数定义的头部进行设置。

    如果在函数声明中设置了默认值,则函数定义中不能再为这些参数设置不同的默认值,否则,编译器会报错。

    不过建议在声明中进行设置,这样就不用为了看哪些参数有默认值而去看函数的具体实现。

  • 在一个指定了默认值的参数的右边,不能出现没有指定默认值的参数,即默认值只能从右到左设置

  • 设置默认值时可以用表达式,但表达式中不能用局部变量,如:int Sum (int a=3,int b=a); 错的

# 2.函数的参数传递

  • 值传递

  • 指针传递

    如:void swap (int *x,int *y){...}

    swap (&a,&b);

  • 传引用,如:

void swap(int &x,int &y)//x,y相当于a,b别名,其地址与a,b相同,最后能实现交换,swap结束后,x,y,t均被释放
{
    int t;
    t=x;
    x=y;
    y=t;
}
int main()
{
    int a=3,b=4;
    swap(a,b);//调用
    cout<<a<<b<<endl;
}
//最后a,b的值被互换
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 3.内联函数

使用inline关键字声明一个函数,也成为内嵌函数

引入内联函数的目的是为了消除函数调用时的系统开销,以提高运行速度

格式:inline <返回值类型> <函数名> (<形参列表>)

{<函数体>}

如:

#include <iostream>
using namespace std;

double circle(double r);//声明时不加inline,在使用的地方后面定义,则需在使用的地方前面声明

int main()
{
    for(int i=1;i<=3;i++)
        cout<<"r="<<i<<"area="<<circle(i)<<endl;
                                //此处的circle(i)相当于换成了函数体内容,就不用在主函数内外来回切换
    return 0;
}
inline double circle(double r)
{
    return 3.14*r*r;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

注意:

  1. 递归函数不能被定义为内联函数
  2. 内联函数一般适合于不含有switch和while等复杂的结构只有1-5条语句的小函数,否则编译系统将视为普通函数
  3. 内联函数只能先定义后使用,否则编译系统将视为普通函数
  4. 对内联函数不能进行异常接口声明
  5. inline只是建议编译器将函数嵌入到调用处,如果函数长度、复杂度不符合,编译器不会把它作为内联函数

# 4.重载函数

编译系统将根据函数参数的类型和个数来判断使用哪一个函数

重载函数需具有:

  • 相同的函数名
  • 不同的 参数个数 或 数据类型 或 类型对应顺序

注意:

  1. 若两个函数除了返回类型不同外,其他均相同,则是非法的
  2. 重载与带缺省值的函数一起使用时,有可能引起二义性

错误案例:

void A(int r=0,int b=0);
void A(int r);

A(20);//该语句对于上面两个函数均可调用,造成了二义性
1
2
3
4
上次更新时间:: 2/9/2025, 9:12:58 PM