C++菜鸟学习笔记系列(17)——函数基础

简介: C++菜鸟学习笔记系列(17)——函数基础

C++菜鸟学习笔记系列(17)

本期主题:函数基础

(在接下来的几篇文章中我们会详细的介绍一下C++语言中关于函数的详细使用方法,今天就先简单介绍一下函数的定义和声明,包括参数如何传入函数以及函数如何返回结果。为后面的叙述作为基础)


我们可以把函数理解为一个命名了的代码块,我们通过调用函数执行相应的代码。函数的使用比较灵活,可以有0个参数也可以有多个参数,可以有返回值也可以没有返回值。


在介绍之前我们先了解几个基本定义:


形参:函数名字后面括号中定义的在函数体作用域中使用的参数

实参:实参是形参的初始值,在调用函数时,第一个实参对应第一个形参,第二个实参初始化第二个形参,这样一一对应。

返回值:函数一般是有返回值作为执行函数之后的结果,当然我们还可以通过其他方式来实现同样的功能,如通过使用指针形参、引用形参等

1.函数声明

和其他名字一样,函数的名字在使用之前也需要声明。类似于变量,函数只能定义一次但是可以声明多次。


函数的声明和定义非常类似,只是函数的声明没有函数体,用一个分号";"代替。(因为函数声明部分没有函数体,所以我们没有必要定义形参的名字,但是我们最好还是加上,便于我们理解函数的功能和使用)。

函数的定义又被称为函数原型,在函数的定义中包括函数三要素:返回类型、函数名、形参类型这三个要素描述了函数的接口,说明在调用此函数时所需要的全部信息。

下面我们来看一下函数声明的基本形式:

double func(double a, double b, int c);
返回值类型 函数名(形参类型1 形参1,形参类型1 形参2,形参类型2 形参3);

我们在之前的博客(C++菜鸟学习笔记系列(5)——自定义数据结构)中曾经介绍过关于我们自定义的数据结构把声明放在头文件中,把定义放在源文件中,类似的,我们也常常在头文件中进行函数声明,我们只要把含有函数声明的头文件包含到定义函数的源文件中就可以了。

2.函数定义

一个典型的函数应该包括以下部分:返回类型、函数名字、形参列表、函数体。其中前三个为函数的三要素,我们在函数的声明部分已经介绍过,下面我们就来看一下关于函数定义最主要的部分函数体

函数定义的基本形式如下所示:

返回值类型 函数名(形参类型1 形参1,形参类型1 形参2,形参类型2 形参3)
{
  函数体;
}

我们来看一个具体的小例子:

int factorial (int n)
{
  int ans = 1;
  for (int i = 1; i != n+1; ++i)
  {
    ans *= i;
  }
  return ans;
}

3.函数调用

要调用我们刚才定义的函数需要为factorial函数提供一个整数值,由于其返回值类型也为int,所以调用得到的结果也是一个整数。

函数调用时需要完成两个步骤:一是用实参初始化函数对应的形参,二是将控制权转移到被调用的函数。这时主函数的执行被暂时中断,被调用函数开始执行。

调用函执行数完成之后也要完成两个步骤:一是返回return语句中的值(如果有的话,void类型则没有。),二是将控制权从被调函数转移回主函数。之后继续完成主函数中的剩余部分。

下面我们来看一下整个函数的使用过程:

/*
author:wxc_1998
date:2018/10/28
*/
#include <iostream>
using namespace std;
int factorial (int n);
int main()
{
  int n = 0, ans = 0;
  cout << "please input a integer:" << endl;
  cin >> n;
  ans = factorial(n);
  cout << n <<"! = " << ans;
  cout << endl << "press any key to continue!";
    cin.clear();
    cin.sync();
    cin.get();
}
int factorial (int n)
{
  int ans = 1;
  for (int i = 1; i != n+1; ++i)
  {
    ans *= i;
  }
  return ans;
}

4.分离式编译

随着程序越来越复杂,我们希望把程序的各个部分分别存储在不同的文件中。

例如我们可以把函数的声明放在头文件中,把函数的定义放在一个源文件中,把主函数及函数的调用放在另外一个源文件中。

我们对于上述代码进行改变使用多个文件分离存储如下所示:


头文件factorial.h

#include <iostream>
int factorial (int n);

源文件factorial.cpp

#include <iostream>
#include "factorial.h"
int factorial (int n)
{
  int ans = 1;
  for (int i = 1; i != n+1; ++i)
  {
    ans *= i;
  }
  return ans;
}

源文件main.cpp

/*
author:wxc_1998
date:2018/10/28
*/
#include <iostream>
#include "factorial.h"
using namespace std;
int main()
{
  int n = 0, ans = 0;
  cout << "please input a integer:" << endl;
  cin >> n;
  ans = factorial(n);
  cout << n <<"! = " << ans;
  cout << endl << "press any key to continue!";
    cin.clear();
    cin.sync();
    cin.get();
}

我们要注意在存储factorial函数定义的源文件factorial.cpp中,我们要注意也要引用头文件factorial.h。

好了,这次我们就写到这里了,下次再见!

注:虽然这篇博客的内容十分简单,但是大家若有转载还请标明出处!

目录
打赏
0
0
0
0
3
分享
相关文章
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
160 6
|
4月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
62 0
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
46 3
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
45 3
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
707 1
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
67 1
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
92 0
C++入门6——模板(泛型编程、函数模板、类模板)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(二)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(三)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等