C++学习笔记——函数

来源:互联网 发布:淘宝客服号怎么登陆 编辑:程序博客网 时间:2024/06/12 00:44

函数

1. 函数的定义与调用

①函数定义

函数:定义好的可重用的功能模块

定义函数:将一个模块用C++语言描述

函数的参数:计算所需的数据和条件

函数的返回值:需要返回的计算结果,可以没有

函数定义的语法形式:

类型标识符 函数名 (形式参数表)

{

语句序列

[return 计算结果]

}

/* 形式参数表: name1, name2, …

无返回值时类型标识符为 void */

② 函数调用

调用函数前需要对函数进行声明

函数原型声明:

类型标识符 函数名 (带类型的形参表)

函数调用:

函数名(实参表)

嵌套调用:一个函数中调用另一个函数

递归调用:函数自身调用自身

double power(double x, int n){  double val = 1.0;  while (n--)    var *= x;  return val;}

调试方法:单步执行进入函数体、在函数内设置断点看调用堆栈

例:π 的计算:

π=16arctan(15)4arctan(1239)

arctanx 用级数来估计.

// 定义计算arctan的函数(实际C++有库函数)double arctan(double x){  double sqr = x * x;  double e = x;  double r = 0;  int i = 1;  while(e / i > 1e-15){    double f = e / i;    r = (i % 4 == 1) ? r + f : r - f;    e = e * sqr;    i += 2;  }  return r;}int main(){  // 特别注意这里不能用整数除法,即不能写为1/5  double a = 16.0 * arctan(1/5.0);  double b = 4.0 * arctan(1/239.0);  cout << "PI is " << a - b << endl;  return 0;}

随机函数:

#include <cstdlib>srand(seed);   // 随机数种子r = rand();    // 产生随机数

③ 函数的嵌套调用

image1

函数调用时用栈存储了调用点的地址,可以精准返回暂停位置。

// 求平方和的函数int fun2(int m){  return m * m;}int fun1(int x, int y){  return fun2(x) + fun2(y);}

④ 函数的递归调用

函数直接或间接地调用自身,实际中很多问题本身就是递归的。

递归算法的两个阶段:递推 => 回归

例:阶乘的求解

unsigned fac(unsigned n){  unsigned f;  if (n == 0)    f = 1;  else    f = fac(n - 1) * n;  return f;}

⑤ 函数的参数传递

  • 实参可以是常量、变量或表达式
  • 实参类型必须与形参类型相同,不同时编译器会检查是否可以安全地隐含类型转化
  • 需要多个返回值时,可以采用双向传递,使用传递引用来实现(传递引用开销小)

⑥ 引用类型

引用&是标识符的别名,定义引用必须初始化

int &ri = i;

一旦一个引用被初始化后,就不能再改变其指向对象

直接传参数,仅是值的传递,一旦传入实参与形参的联系将被切断,不会改变实参 => 解决办法:引用传递

void swap(int& a, int& b){  int t = a;  a = b;  b = t;}

⑦ 含可变参数的函数

  • 含有的实参类型相同,传递initializer_list
  • 实参类型不同,可以编写可变参数模板
  • 对象中的元素永远是常量值
  • 含有该形参时同时可以使用其他形式形参

这里写图片描述

initializer_list<string> ls;initializer_list<int> li;

2. 内联函数

内联函数在调用简单函数时可以提高效率。

内联函数的声明用inline,是一个建议性命令,由编译器处理

  • 不能有循环和开关语句
  • 函数定义必须在第一次调用之前
  • 不能进行异常接口声明
const double PI = 3.114159265358979;inline double calArea(double radius){  return PI * radius * radius;  }

使用内联函数可以实现代码复用,但不会有转子函数再返回的开销。

3. constexpr函数

C++11的新功能,用于初始化常量表达式

所有参数都是constexpr(常量表达式)时则一定返回constexpr.

constexpr int get_size(){return 20;}constexpr int foo = get_size();

编译期间可计算的函数

4. 带默认参数值的函数

int add(int x = 5, int y = 6){  return x + y;}

默认参数值的说明次序:

  • 有默认值参数的形参必须列在形参列表的最右边
  • 调用时实参与形参的结合次序是从左向右
  • 函数体在调用之后或其他文件,则应在声明中给出默认值,若在调用前定义函数体,则可直接指定,但不能同时在定义和声明中指定

5. 函数重载

C++多态性的实现,在编译时实现的静态多态性。

C++允许功能相近的函数在相同的作用域内以相同的函数名声明函数实现函数的重载

  • 形参类型不同
  • 形参个数不同
  • 编译器不以形参名来区分,不能实现重载
  • 返回值也不能用于区分函数的重载
  • 功能不同的函数不要声明为重载函数
in sumOfSquare(int a, int b){  return a*a + b*b;}in sumOfSquare(double a, double b){  return a*a + b*b;}

6. C++系统函数

使用系统函数需要包含相应的头文件。

例如数学函数包含在 cmath 中,注意该包中的三角函数接收的参数均为弧度制。

原创粉丝点击