函数(function)
函数(function)就是一个一块整块代码。这个概念在基础知识那一篇里有大概提到一下。但是没有给出定义。
参考的c++ textbook 虽然简洁,但是还真简洁到连function的定义都不给一个。如果真没学过编程的人看谁知道function是什么东西,下边给个我自己写的定义
函数(Function) 是一段可以重复使用的代码,它执行特定的任务。你给它做这个任务需要的信息(输入),在完成这个任务后,它可能会给你一个结果(输出)。
定义函数(Declaring functions)
看下边这个例子
long func(int, double);
这个定义中有几个东西:
- long:这个是这个函数的输出类型(type),这里定义函数的返回值
- func:这个是函数的名字
- (int, double):这个是这个函数的输入类型
比如说,下边是math libary中的一些函数的定义
double sin (double); // Sine
double cos (double); // Cosine
double tan (double); // Tangent
double atan (double); // Arc tangent
double cosh (double); // Hyperbolic Cosine
double sqrt (double); // Square Root
double pow (double, double); // Power
double exp (double); // Exponential Function
double log (double); // Natural Logarithm
double log10 (double); // Base-ten Logarithm
定义的作用是让编译器知道这个函数的存在,所以除了一开始就已经写在编译器的keyword,c++程序里的每一个函数都需要先定义。
注意,我们在定义的时候,可以把输入的名字加到定义中,但是这个编译器并不会用,只会把名字当成注释。
以 double pow (double, double); 这个函数为例, 写成这样也是可以的:
double pow(double base, double exponent);
另一点需要注意的是,如果一个函数已经在用的标准库(standard library)中出现过了,这个函数就并不需要定义。可以直接用。比如上边出现在math那个库里的函数,我们只需要加入#include <cmath> 就能直接使用里边的所有函数。
函数调用(function calls)
函数调用就是把这个函数需要的输入给他,他就会给回我们返回值的过程
比如 y = pow( x, 3.0); 这个会计算x这个变量的三次方的结果。然后把返回值赋值给y这个变量。
函数本身计算结果因为也表示一个值,所以这个值也是可以直接用的。比如
cout << 2.0 + pow( 5.0, x);
另一个需要注意的点是给这个函数的数据类型,我们这里给 5.0 是因为这个函数的输入值需要是一个double类型。在c++中,如果一个函数的输入是基础类型(primitive),这个基础类型的在函数输入的时候是可以自动转化的。所以这么写也是可以的
y = pow( x, 3);
但是有两点不可以:
1) 输入的数量必须等于定义的输入数量
2)输出的数据类型如果和给的变量不一致。
对于2,如果输出类型的精度大于输入类型的精度,比如我们这里把y用一个float,但是pow函数输出的是double,虽然这么写不会报错,但是编译器会输出一个warning。
完整的例子
这个程序会报错,输出值直接写在了注释里:
// Calculating powers with
// the standard function pow()
#include <iostream> // Declaration of cout
#include <cmath> // Prototype of pow(), thus:
// double pow( double, double);
using namespace std;
int main()
{
double x = 2.5, y;
// By means of a prototype, the compiler generates
// the correct call or an error message!
// Computes x raised to the power 3:
y = pow("x", 3.0); // Error! String is not a number
y = pow(x + 3.0); // Error! Just one argument
y = pow(x, 3.0); // ok!
y = pow(x, 3); // ok! The compiler converts the
// int value 3 to double.
cout << "2.5 raised to 3 yields: " << y << endl;
// Calculating with pow() is possible:
cout << "2 + (5 raised to the power 2.5) yields: " << 2.0 + pow(5.0, x) << endl;
return 0;
}
没有输入或者返回值的函数
有些函数不需要输入值或者返回值,就让他把事情做完就可以了。这种函数可以在定义的时候放空值,或者不用放,或者返回空值(void)
我们来用c++的随机数生成器来当作例子。
用随机数生成器需要用到std里的两个函数
void std::srand(int seed);
int std:rand();
第一个函数, 这个函数就返回一个空值(void)。这个函数会根据设置的seed,每次连续调用rand的时候,生成相同的序列。
比如这个程序,
https://www.programiz.com/online-compiler/5YHh2za5itlT3
// Online C++ compiler to run C++ program online
#include <iostream>
#include <cstdlib> // 包含 srand 和 rand
using namespace std;
int main() {
// Write C++ code here
srand(0);
cout << rand() << " " << rand() << " " << rand();
return 0;
}
每次的输出都是一样的:
1804289383 846930886 1681692777
=== Code Execution Successful ===
在这个例子里,srand并不需要任何输出。只需要一个输入值seed,这就是一个返回空值的函数。
而rand函数,他不需要输入值,可以根据已经用srand设置好的seed,每次都返回一个int作为它的输出值。
1151

被折叠的 条评论
为什么被折叠?



