本文将介绍 C++ 中 函数的通常用法。函数又称为方法,是一段程序代码。由三部分组成,函数声明,函数定义 和 函数体。python
例如:ios
// 函数声明 int add(int a, int b); // 返回值, 函数名, 形参列表 int add(int a, int b) { // 函数体 return a + b; }
调用是能够被调用的, 调用时须要提供实际参数(实参)列表。c++
这里常量“cpp” 就是实参, name 就是形参算法
#include <iostream> #include <string> using namespace std; int hi(string name) { cout << "hi" << name << endl; } int main() { cout << "1" << endl; hi("cpp"); cout << "2" << endl; }
语句按照顺序执行,遇到函数先执行函数内部,返回以后继续执行。编程
和大多数程序同样,函数能够嵌套,函数中又能够调用其余的函数。函数
而函数调用自身,称为递归,编写算法的时候常常使用递归。优化
unsigned fib(unsigned int n) { if (n == 1) { return 1; } if (n == 2) { return 1; } return fib(n - 2) + fib(n - 1); }
一般递归须要退出条件。spa
下面介绍一些要点 和特性, 实参形参和引用、constexpr、默认参数、函数重载code
关于形参和实参,实参就是调用的时候填写的参数,当执行调用的时候,会发生实形结合。实形结合,就是形参会被分配内存空间,而且实参的值会传递给形参。定义的时候形参不占用内存空间。递归
参数传递有两种:
引用 不是变量,是变量的别名,不占用内存空间,写法以下:
# 类型& 是一个引用类型 void swap(int& a, int& b) { int tmp = a; a = b; b = tmp; } int main() { int x = 1; int y = 2; swap(x, y); cout << "x = " << x << ",y = " << y << endl; }
那么 a 是一个引用类型 和 实参x的数据进行绑定,是x 的别名,经过双向传递,能够改变实参的值。
constexpr 是 c++ 中的一个关键字,能够添加到函数的定义或者声明开头,这个语法是一个比 const 更严格的语法
有什么用呢,总结来讲,就是 constexp r要求编译时不可变(而 const 只是运行时不可变,编译时有可能值尚未肯定,仍是变量),即在编译时能够推导出来,这样严格约束,一方面描述这是一个常量表达式, 另一方面能够在编译时进行优化。
默认参数,这个在python中是支持的,C++ 的写法相似,容许设置默认的参数,这样在调用时能够不提供某些实参,可是默认参数须要从右到左提供,不用都提供。例如:
int test1(int a , int b = 1, int c = 2); // ok int test2(int a = 1, int b ) // error
若是函数声明中已经写了默认参数,函数定义中就不用写默认参数了。
函数重载(overload),是指一个相同名称的函数,经过参数数量和参数类型的不一样,有多个版本的功能。例如:
int add(int a , int b); double add(double a, double b);
须要注意的,重载是不支持返回值类型不一样的。(由于隐式类型转换的存在,可能引发歧义)。虽说好处的是能够用同一个方法名,反复使用,而不用使用addInt addDouble这样的名称。对于使用函数的人来讲,须要注意的是,因为使用的参数不一样,须要肯定其实是调用哪一个方法。
总之,函数是编程中随处可见的操做,C++ 须要注意的就是参数传递和函数声明。