函数与参数传递
假设我们要生产一个无人机。
无人机需要电池。
我们是否需要自己去生产这个电池?其实我们现在很多企业,在生产某件东西的时候,其实它不需要什么都自己生产。这样我们的社会是分工合作的。每个公司每个人都专注自己擅长的东西。
生产无人机的需要电池,那么它只需要去采购电池厂家的电池就可以了。
生产手机公司它需要电池,那么它也需要去采购电池就可以了。
比如我们的苹果手机。
屏幕来自 三星或者京东方。
电池来自惠州。
我们要生产一个榨油机。那么如果需要动力。那么只需要创建一个动力函数。那么当我们需要动力的地方 只需要去调用。
假设我们现在要交换两个数。a b 这两个变量。
我们可以创建一个函数。比如叫做
Exchange(int x,int y)
{
// 函数体
}Code language: JavaScript (javascript)
当我们要交换a和b 那么只需要去调用
int a,b;
Exchange(a,b);
int i,j;
Exchange(i,j);
Exchange(i,j);
Exchange(i,j);
Exchange(i,j);
函数是一组一起执行一个任务的语句。
每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。
您可以把代码划分到不同的函数中。
如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。
C++ 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。
函数还有很多叫法,比如方法、子例程或程序,等等。
函数定义
C++ 中的函数定义的一般形式如下:
return_type function_name(parameter list )
{
body of the function
}Code language: PHP (php)
返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
函数主体:函数主体包含一组定义函数执行任务的语句。
// 函数返回两个数中较大的那个数
int max(int num1, int num2)
{
// 局部变量声明
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}Code language: JavaScript (javascript)
我们的例子
#include <iostream>
using namespace std;
int GetMax(int x, int y)
{
if (x > y)
{
return x;
}
else
{
return y;
}
}
int main()
{
int i, j;
cin >> i >> j;
cout << GetMax(i, j) << endl;
int a = 98;
int b = 34;
int c = GetMax(a, b);
cout << c << endl;
return 0;
}Code language: PHP (php)
函数声明
我们前面的例子,我们的自定义函数是放在上面的 而main函数是放在下面的。
那么如果我们把自定义的函数放在下面呢?
编译 返现报错了
这是为什么?
其实就是 编译器 编译的时候 是从上往下编译。 但是 如果我们把自定义函数放在下面。
这时候,当编译到函数调用的地方。发现 这个函数还没有出现。
C++给我们的解决办法就是 声明一下。
函数声明会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
函数声明包括以下几个部分:
return_type function_name( parameter list );Code language: PHP (php)
针对上面定义的函数 max(),以下是函数声明:
int max(int num1, int num2);
在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:
int max(int, int);
我们的代码
#include <iostream>
using namespace std;
//函数声明 不需要函数体 只需要函数的返回值 函数名 函数的参数
//int GetMax(int x, int y);
int GetMax(int, int); //函数声明 可以连变量名都不需要 只需要变量类型就可以了
int main()
{
int i, j;
cin >> i >> j;
cout << GetMax(i, j) << endl;
int a = 98;
int b = 34;
int c = GetMax(a, b);
cout << c << endl;
return 0;
}
int GetMax(int x, int y)
{
if (x > y)
{
return x;
}
else
{
return y;
}
}Code language: PHP (php)
调用函数
创建 C++ 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。
函数创建好之后 我们就可以去调用了。 并且可以多处多个地方去调用。同时调用也没问题。
函数调用 如果函数要求需要参数,则我们调用的时候 就需要传递参数。
就好比 如果你要人家帮你盖房子,如果他要求工具,那么你就要给他工具。给他材料。 那么函数的参数也就是这里的工具 材料。
并且函数会有一个返回值的。就好比盖房子。房子盖好后 房子就交付给你。 那么这个房子就好比 函数的返回类型。
如果我们要写一个盖房子的方法
房子 盖房子(红砖,水泥,钢铁,水 ,泥沙,工人)
{
工人 盖房子
工人打地基
工人砌墙
return 新房子;
}
房子1 = 盖房子(红砖,水泥,钢铁,水 ,泥沙2,工人1);
房子2 = 盖房子(红砖,水泥,钢铁,水 ,泥沙2,工人1);Code language: JavaScript (javascript)
函数的目的就是为了重复利用。函数可以被多个地方调用。调用的时候。各不影响。
#include <iostream>
using namespace std;
// 函数声明
int max(int num1, int num2);
int main ()
{
// 局部变量声明
int a = 100;
int b = 200;
int ret;
// 调用函数来获取最大值
ret = max(a, b);
cout << "Max value is : " << ret << endl;
return 0;
}
// 函数返回两个数中较大的那个数
int max(int num1, int num2)
{
// 局部变量声明
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}Code language: PHP (php)
如果只有函数声明 没有函数定义 会怎么样?
就是函数需要的参数,如果函数是一台机器。那么参数就是给函数的原材料。这些参数可以在函数内部使用。
如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
当调用函数时,有三种向函数传递参数的方式:
默认情况下,C++ 使用传值调用来传递参数。
一般来说,这意味着函数内的代码不能改变用于调用函数的参数。之前提到的实例,调用 max() 函数时,使用了相同的方法。
参数传递方式
传值调用
向函数传递参数的传值调用方法,把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
默认情况下,C++ 使用传值调用方法来传递参数。一般来说,这意味着函数内的代码不会改变用于调用函数的实际参数。
也就是 把值传过去 只是一份复制。 原来的参数是不会受到影响。
例如 看下面例子
#include <iostream>
using namespace std;
// 函数声明
void swap(int x, int y);
int main ()
{
// 局部变量声明
int a = 100;
int b = 200;
cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl;
// 调用函数来交换值
swap(a, b);
cout << "交换后,a 的值:" << a << endl;
cout << "交换后,b 的值:" << b << endl;
return 0;
}
// 函数定义
void swap(int x, int y)
{
int temp;
temp = x; /* 保存 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 x 赋值给 y */
return;
}Code language: PHP (php)
在VS2019会发现值不对
#include <iostream>
using namespace std;
int main()
{
int i, j;
i = 34;
j = 56;
cout << "qian i=" << i << ",j=" << j << endl;
//大家想想 如果现在有两桶水 那么怎么交换水桶 通过第三个桶
int temp = 0;
temp = i; //变量赋值 是会把原来的值替换 而不会叠加
i = j;
j = temp;
cout << "hou i=" << i << ",j=" << j << endl;
return 0;
}Code language: PHP (php)
但是在VS2015下面 就没有问题
我们把交换两个数放在函数里面 封装成一个函数
#include <iostream>
using namespace std;
void Swap(int i,int j) {
int temp = 0;
temp = i; //变量赋值 是会把原来的值替换 而不会叠加
i = j;
j = temp;
}
int main()
{
int i, j;
i = 34;
j = 56;
cout << "qian i=" << i << ",j=" << j << endl;
Swap(i, j);//调用函数 来交换两个数
cout << "hou i=" << i << ",j=" << j << endl;
return 0;
}Code language: PHP (php)
下面是运行后的结果
然后我们发现 并没有交换到。
为什么没有交换到呢?
其实这里原因是值传递的问题。
当我们把i和j调用函数的时候 把他们的值传递给函数的i和j 这只是一份复制。
外面的i和j 和函数里面的i和j是两个不同的变量。内存地址都不一样。
调用的时候 只是把值付给它而已 本质还是两个变量。
所以 改变函数里面的变量 不会影响到函数外面的变量。
函数里面的i j 在调用函数的时候创建 调用完 就销毁。
指针调用
向函数传递参数的指针调用方法,把参数的地址复制给形式参数。
在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
如果是之前的值传递 来实现两个数交换的话?
上节课说了由于i j 函数内外是不同变量 所有修改函数里面的j不会影响函数外的i j
我们思考一下?
能否把i j 的地址(指针)传给函数 那么函数里面拿到i j 的地址 就可以操作i j 指向的变量的值呢?
按指针传递值,参数指针被传递给函数,就像传递其他值给函数一样。因此相应地,
在下面的函数 swap() 中,您需要声明函数参数为指针类型,该函数用于交换参数所指向的两个整数变量的值
// 函数定义
void swap(int *x, int *y)
{
int temp;
temp = *x; /* 保存地址 x 的值 */
*x = *y; /* 把 y 赋值给 x */
*y = temp; /* 把 x 赋值给 y */
return;
}Code language: JavaScript (javascript)
看下面实例
#include <iostream>
using namespace std;
// 函数声明
void swap(int *x, int *y);
int main ()
{
// 局部变量声明
int a = 100;
int b = 200;
cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl;
/* 调用函数来交换值
* &a 表示指向 a 的指针,即变量 a 的地址
* &b 表示指向 b 的指针,即变量 b 的地址
*/
swap(&a, &b);
cout << "交换后,a 的值:" << a << endl;
cout << "交换后,b 的值:" << b << endl;
return 0;
}Code language: PHP (php)
我们的代码
#include <iostream>
using namespace std;
void Swap(int *x,int *y) { //接收就需要指针变量
int temp = 0;
temp = *x; //变量赋值 是会把原来的值替换 而不会叠加
*x = *y; //回顾前 上面参数列表的*x 是指针的定义 然后这里的*x的读取x保存的地址的那个变量(i)的值
*y = temp;
}
int main()
{
int i, j;
i = 34;
j = 56;
cout << "qian i=" << i << ",j=" << j << endl;
Swap(&i, &j);//传i j的地址给函数
cout << "hou i=" << i << ",j=" << j << endl;
return 0;
}Code language: PHP (php)
引用调用
引用相当于 变量的别名,通过别名也可以操作变量。
向函数传递参数的引用调用方法,把引用的地址复制给形式参数。
在函数内,该引用用于访问调用中要用到的实际参数。
这意味着,修改形式参数会影响实际参数。
按引用传递值,参数引用被传递给函数,就像传递其他值给函数一样。
因此相应地,在下面的函数 swap() 中,您需要声明函数参数为引用类型,该函数用于交换参数所指向的两个整数变量的值。
// 函数定义
void swap(int &x, int &y)
{
int temp;
temp = x; /* 保存地址 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 x 赋值给 y */
return;
}Code language: JavaScript (javascript)
#include <iostream>
using namespace std;
// 函数声明
void swap(int &x, int &y);
int main ()
{
// 局部变量声明
int a = 100;
int b = 200;
cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl;
/* 调用函数来交换值 */
swap(a, b);
cout << "交换后,a 的值:" << a << endl;
cout << "交换后,b 的值:" << b << endl;
return 0;
}Code language: PHP (php)
我们 的代码
#include <iostream>
using namespace std;
void Swap(int &x,int &y) { //接收就需要引用
int temp = 0;
temp = x; //x是i的引用 那么x就是i
x = y;
y = temp;
}
int main()
{
int i, j;
i = 34;
j = 56;
cout << "qian i=" << i << ",j=" << j << endl;
Swap(i, j);//传i j传递给一个引用 x y xy是引用 也就是i和x 是同一个变量
cout << "hou i=" << i << ",j=" << j << endl;
return 0;
}Code language: PHP (php)
数字与数学函数
通常,当我们需要用到数字时,我们会使用原始的数据类型,如 int、short、long、float 和 double 等等
#include <iostream>
using namespace std;
int main ()
{
// 数字定义
short s;
int i;
long l;
float f;
double d;
// 数字赋值
s = 10;
i = 1000;
l = 1000000;
f = 230.47;
d = 30949.374;
// 数字输出
cout << "short s :" << s << endl;
cout << "int i :" << i << endl;
cout << "long l :" << l << endl;
cout << "float f :" << f << endl;
cout << "double d :" << d << endl;
return 0;
}Code language: PHP (php)
在 C++ 中,除了可以创建各种函数,还包含了各种有用的函数供您使用。
这些函数写在标准 C 和 C++ 库中,叫做内置函数。您可以在程序中引用这些函数。
C++ 内置了丰富的数学函数,可对各种数字进行运算。下表列出了 C++ 中一些有用的内置的数学函数。
为了利用这些函数,您需要引用数学头文件 <cmath>
#include <iostream>
#include <cmath>
using namespace std;
int main ()
{
// 数字定义
short s = 10;
int i = -1000;
long l = 100000;
float f = 230.47;
double d = 200.374;
// 数学运算
cout << "sin(d) :" << sin(d) << endl;
cout << "abs(i) :" << abs(i) << endl;
cout << "floor(d) :" << floor(d) << endl;
cout << "sqrt(f) :" << sqrt(f) << endl;
cout << "pow( d, 2) :" << pow(d, 2) << endl;
return 0;
}Code language: PHP (php)
C++ 随机数
在许多情况下,需要生成随机数。关于随机数生成器,有两个相关的函数。一个是 rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用 srand() 函数。
我们在自然界 可以得到很多随机数。比如抛银币,但是在计算机里面 却没办法生成真正的随机数。
下面是一个关于生成随机数的简单实例。实例中使用了 time() 函数来获取系统时间的秒数,通过调用 rand() 函数来生成随机数:
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
int main()
{
int j;
srand((unsigned)time(NULL));//设置随机种子
for (int i = 0; i < 50; i++)
{
j = rand();//得到随机数
cout << j << endl;
}
return 0;
}Code language: PHP (php)
随机数 我们以后 可能开发项目都会面对。比如抽奖 。