一、函数的定义

从一开始我们学习的 C++ 基础框架中,我们知道主函数其实就是一个函数,它是一个特殊函数,也是程序的开始点。

#include <iostream>
using namespace std;

int main()    // 主函数,返回类型是int,函数名是main,参数列表是()
{
    // 函数体
    return 0; //main的返回值
}

在 int main() 这里,其返回类型是int,函数名是main,参数列表是()。总的来说,函数包括的内容有 返回类型函数名称参数函数体

二、return 返回

我们以前所学的 return 0 是告诉计算机,该程序成功执行完毕。而非零返回值(如 return 1、return -1 等)通常表示程序异常退出,可以自己定义。另外,若函数定义为 void 型,则返回值不存在,return 语句也不存在。

例如,计算加法的函数应返回实际结果(如 return a + b),让两个数a和b相加进行返回。

函数中可以有多个return语句,但执行完第一个return后,本次调用结束。例如,下面代码是创建一个函数 fun 来判断判断一个数是否为偶数,是则返回0,否则返回1。

#include <iostream>
using namespace std;

// 判断一个数是否为偶数,是则返回0,否则返回1
int fun(int num) 
{
    if (num % 2 == 0) 
        return 0;  // 是偶数,返回0
    else
        return 1;  // 不是偶数,返回1
}

int main()   // 程序的主函数,所有 C++ 程序从这里开始执行
{
    int n,result;
    cin >> n;
    result = fun(n);  // 调用fun函数,将返回值保存到result变量
    if (result == 0) 
        cout << n << " 是偶数";
    else 
        cout << n << " 不是偶数";
    return result;    // 将判断结果作为程序的返回值
}

运行结果如下:
在这里插入图片描述
也可以不用返回值,例如,函数的返回类型改为 void,表示不返回任何值,同时,函数参数为 int& result(&表示引用),引用即为变量的 “别名”,如下代码:

#include <iostream>
using namespace std;

void fun(int num, int& result) // 使用引用参数int& result
{  
    if (num % 2 == 0) 
        result = 0;  // 直接给引用变量赋值,会同步修改外部变量
    else
        result = 1;
}

int main() 
{
    int n;
    int result;  
    cin >> n;
    fun(n, result);    // 调用函数时直接传递变量
    if (result == 0)
        cout << n << " 是偶数";
    else
        cout << n << " 不是偶数";
    return result;
}

三、函数参数

(一)形参实参

形参:形式参数,定义函数时括号中的表达式。

形参、定义在函数内部的变量称为局部变量,它的作用域仅限于函数内部。

实参:实际参数,调用函数时括号中的表达式。

(二)参数默认值

下面函数 fun 有三个参数,其中形参 b、c 有参数默认值。之后在 main 函数中进行两次调用,fun(“xiaoming”):只提供了第一个参数,后两个参数使用默认值,而fun(“xiaohong”,“女”,20):提供了所有三个参数,覆盖默认值。

#include <iostream>
#include <string>
using namespace std;

void fun(string a , string b="男" , int c=18) 
{
    cout<< a << " " << b << " " << c << endl; 
}

int main() 
{
    fun("xiaoming");
    fun("xiaohong","女",20);
    return 0;
}

运行结果如下:
在这里插入图片描述

三、函数调用方式

(一)传值调用

函数参数的传值调用是传递变量副本,函数内修改不影响原变量,无论函数里怎么改,外面的原始数据都不会变。

#include <iostream>
using namespace std;

// 传值调用:函数接收的是实参的副本
void fun1(int num) //变量 num 就是形参,专门用来接收外界传进来的值
{
    num = 100;  // 这里修改的是副本,不影响原变量值
    cout << "传值调用中修改后的值: " << num << endl;
}

int main() 
{
    int x = 10;
    cout << "初始值: " << x << endl ;
    fun1(x);    // 变量 x 就是实参,传值调用
    cout << "传值调用后x的值: " << x;  // x的值仍为10
    return 0;
}

运行结果如下,虽然传值调用 fun 函数,但是 x 的值没有改变,改变的只是副本:
在这里插入图片描述

(二)指针调用

函数参数的指针调用是传递变量地址,可通过*解引用修改原变量,调用时要加&进行取地址。

通过解引用操作(*num)可以修改原变量
需要显式使用取地址符(&x)传递参数

#include <iostream>
using namespace std;

// 指针调用:函数接收的是实参的地址
void fun2(int* num) //函数接收一个整型指针参数
{
    *num = 200;  //解引用指针,直接修改指针所指向的内存位置的值,修改的是原变量 x 的值,不是副本
    cout << "指针调用中修改后的值: " << *num << endl;
}

int main() 
{
    int x = 10;
    cout << "初始值: " << x << endl;
    fun2(&x);  // 显式使用 & 获取变量 x 的地址并传递给函数
    cout << "指针调用后x的值: " << x;  // x的值变为200
    return 0;
}

运行结果如下,通过指针在函数内部修改外部变量的值,x 的值变为200:
在这里插入图片描述

(三)引用调用

函数参数的引用调用是传递变量别名,直接修改即可影响原变量,调用方式与传值相同。

#include <iostream>
using namespace std;

// 引用调用:函数接收的是实参的引用(别名)
void fun3(int& num) 
{
    num = 300;  // 直接修改原变量的值,因为num是原变量的别名
    cout << "引用调用中修改后的值: " << num << endl;
}

int main() 
{
    int x = 10;
    cout << "初始值: " << x << endl;
    fun3(x);  // 引用调用
    cout << "引用调用后x的值: " << x;  // x的值变为300
    return 0;
}

运行结果如下:
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐