本文将介绍 C++ 中 函数的一般用法。函数又称为方法,是一段程序代码。由三部分组成,函数声明,函数定义 和 函数体。

  • 函数定义包含函数返回值,函数名 和 形式参数(形参)列表
  • 函数体中是一些语句。
  • 函数声明, 写法和函数定义差不多,但是没有函数体。通常可以缺省,但是如果被调用,但函数定义还没有出现,需要在调用之前书写函数声明

例如:

// 函数声明
int add(int a, int b);

// 返回值, 函数名, 形参列表
int add(int a, int b) {
// 函数体
    return a + b;
}

调用是可以被调用的, 调用时需要提供实际参数(实参)列表。

这里常量“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);
}

通常递归需要退出条件。

下面介绍一些要点 和特性, 实参形参和引用、constexpr、默认参数、函数重载

关于形参和实参,实参就是调用的时候填写的参数,当执行调用的时候,会发生实形结合。实形结合,就是形参会被分配内存空间,并且实参的值会传递给形参。定义的时候形参不占用内存空间。

参数传递有两种:

  • 单项传递,也就是传值,这样函数内如果需要改变实参,就不行的,因为不在一个内存空间。那么需要通过双向传递来实现,
  • 双向传递,就是传引用,需要把形参的类型设置为引用类型,那么实形结合的时候,会把形参的引用和实参的数据绑定,这个绑定关系不会改变,并且形参不占用内存空间。

引用 不是变量,是变量的别名,不占用内存空间,写法如下:

#  类型& 是一个引用类型

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 更严格的语法

  • 要求函数体的所有参数是 constexpr 时,返回值也是 constexpr
  • 函数中只能有return语句

有什么用呢,总结来说,就是 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++ 需要注意的就是参数传递和函数声明。


程序员杰诺斯
15 声望1 粉丝