函数

函数与参数传递

假设我们要生产一个无人机。

无人机需要电池。

我们是否需要自己去生产这个电池?其实我们现在很多企业,在生产某件东西的时候,其实它不需要什么都自己生产。这样我们的社会是分工合作的。每个公司每个人都专注自己擅长的东西。

生产无人机的需要电池,那么它只需要去采购电池厂家的电池就可以了。

生产手机公司它需要电池,那么它也需要去采购电池就可以了。

比如我们的苹果手机。

屏幕来自 三星或者京东方。

电池来自惠州。

我们要生产一个榨油机。那么如果需要动力。那么只需要创建一个动力函数。那么当我们需要动力的地方 只需要去调用。

假设我们现在要交换两个数。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)

随机数 我们以后 可能开发项目都会面对。比如抽奖 。

Previous:
Next:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注