C++语言程序设计——07 函数
从一开始我们学习的 C++ 基础框架中,我们知道主函数其实就是一个函数,它是一个特殊函数,也是程序的开始点。int main() // 主函数,返回类型是int,函数名是main,参数列表是()// 函数体return 0;//main的返回值在 int main() 这里,其返回类型是int,函数名是main,参数列表是()。总的来说,函数包括的内容有返回类型函数名称参数和函数体。
一、函数的定义
从一开始我们学习的 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;
}
运行结果如下:
更多推荐
所有评论(0)