函数
C++函数相关
1. 为什么使用函数?
①.通过使用函数,,可以将程序模块化,将程序设计的简单直观。
②.通过将一些会被重复多次使用的代码写为函数,可以极大的减轻程序员的代码工作量,降低复杂性,避免重复代码。
③.提高了程序的可读性和可维护性。
#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;
}
2. 为什么要用函数重载
通过运用函数重载,便不用为了对不同的参数类型或参数个数定义多个函数。多个函数用同一个名字,,但参数的类型和个数不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用相应的函数。这样可以避免对名字空间的污染,有利于程序的可读性。
#include <iostream>
using namespace std;
class printData
{
public:
void print(int i)
{ cout << "整数为: " << i << endl;
}
void print(double f)
{
cout << "浮点数为: " << f << endl;
}
void print(char c[])
{
cout << "字符串为: " << c << endl;
}
};
int main(void)
{
printData pd;
输出浮点数 pd.print(500.263);
char c[] = "Hello C++";
pd.print(c);
return 0;
}
3. 什么是值传递
值传递是指只将要使用的值传入函数,而不改变值本身.就是指将一个实参传递给一个形参。
5 6 7 8 9 10 11 12 |
#include<iostream.h> void fun(int a) { a=10; //修改参数 } int main() { int x=20; fun(x); //调用fun函数 cout<<x<<endl; //输出变量,变量的值没改变 return 0; } |
通过调用,将实参x的值赋给了函数中的形参a,函数又给a赋值,但x的值并未改变。
4. 什么是地址传递
按地址传递就是当调用一个过程时,是把实参变量的内存地址传递给被调用过程的形参,也就是说形参与实参使用相同地址的内存单元。因此当在被调用过程中改变形参的值,就等于改变了实参的值。
#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 = y;
x */ y = temp;
return;
}
该函数通过传递实参的地址,进而使其值发生了改变
5. 递归函数
(1)什么是递归函数:函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。递归函数不能定义为内联函数。
(2)递归函数的作用
举例:计算阶乘n!
#不使用递归的方法:
n=4 #求4的阶乘
result=1
i=1
while i<=4:
result=result*i
i+=1
print(result)
#使用递归的方法:
def test1(n):#定义函数来计算数字n的阶乘
if n==1:
return 1
return n * test1(n-1)
print(test1(5))
#1在函数的内部调用自己本身
#2递归函数本质是一个方法的循环调用,注意:有可能出现死循环
#3一定要定义递归的边界(什么时候退出循环)
输出结果为:
24
120
[Finished in 0.4s]
从上面两中方法的对比可以看出,递归函数的作用和循环的方法效果一样,即递归函数本质上是一个方法的循环调用,注意:有可能会出现死循环。因此,使用递归函数时,一定要定义递归的边界(即什么时候退出循环)。
递归函数的另一个案例是斐波纳契数列。
斐波纳契数列:1,1,2,3,5,8,13。。。(该数列中,有n个数字,从第三个数字开始:数值 =前一个数字 + 前面一个数字)
即,n=(n-2)+(n-1)
def get_num(n):
if n==1 or n==2:
return 1
return get_num(n-1) + get_num(n-2)
nums=[]
for i in range(1,21):
nums.append(get_num(i))
print(nums)
输出结果为:
1 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]2 [Finished in 0.4s]
以上两个案例是递归函数的经典案例,需要记住其使用方法。注意:在实际使用中,递归函数由于消耗时间比较长(相比for循环和while循环),所以很少使用。