乐趣区

C语言程序设计基础课程笔记03

本文将介绍 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++ 须要留神的就是参数传递和函数申明。

退出移动版