C++| C++ 入门教程(六) 函数

6 函数 6.1 概述
作用:将一段经常使用的代码封装起来,减少重置的代码
一个较大的程序,一般可以分为很多的程序块,每个模块都可以封装起来作为一个函数功能。
6.2 函数的定义
定义函数:

  1. 返回值类型
  2. 函数名
  3. 参数列表
  4. 函数体
  5. return 表达式
6.3 函数的调用
语法:functionName( peremeterList )
函数中的参数,我们成为形式参数,简称形参。
而我们调用参数的时候传入的参数为实际参数,简称实参。
调用函数的时候,实参的值会传递给形参,这种值传递也成为传值。
6.4 值传递
函数调用时,会将实参的值传入函数的形参,这个过程称为值传递,又称为传值。
因此,传值时,如果形参发生改变,不会影响实参本身的值。只有传址或者传引用可以改变实参的值。
6.5 函数的声明
作用:告诉编译器函数名称以及如何调用函数,函数的实际主体可以在后面单独定义。
函数可以声明很多次,但是只能定义一次。
函数声明本身对于开发者的意义更多是提前就能知道这个程序中的部分函数是怎么运行的,然后可以直接去看主函数。而对于编译器来说,实际就相当于把函数的定义直接写在了声明的地方了。编译器发现函数声明之后,就会直接去寻找相对应的函数定义,并且把函数编译进来。
不过函数声明有一个优点。当函数需要调用另一个函数的时候,函数的定义是有先后的。必须要先定义被调用的函数,再定义调用函数的函数。但是如果在文件头一起声明的话,就不会有这个问题了。而且声明是不需要注意顺序的。
6.6 函数的分文件编写
作用:让函数结构更加清晰
步骤:
  1. 创建后缀名为.h的头文件
  2. 创建后缀名为.cpp的源文件
  3. 在头文件中写函数的声明
  4. 在源文件中写函数的定义
做一个简单的交换两个数的函数,把函数单独放在程序中。
先写函数本身的源文件
//swap.cpp #include"swap.h" void swap(int& a, int& b) { int space; space = a; a = b; b = space; }

然后写这个函数的声明,放在一个头文件中
#pragma once void swap(int&, int&);

其中#pragma once作用和下面的代码差不多:
#ifndef A_H #define A_H …… #endif

pragma 是编译附注,这句话表示这个头文件只能被编译一次。整个编译过程中只能打开文件一次。
拓展:
方法一:pragma once
方法二:ifndef A_H
这两个方法没有太大的区别。细节上说,方法二的可移植性更高,有些编译器不支持方法一。另一方面,方法一是物理层面上一个文件不会被编译两次。但是如果一个文件有多份拷贝,就会都打开。
而方法二注重的则是文件名。只要文件一样,多少拷贝都只会编译一次。但是如果多个头文件是一个名字的话,也有可能导致剩下的几个不被编译了。
最后我们编写主函数:
//main.cpp #include #include"swap.h" using namespace std; int main() { int a = 10, b = 20; cout << "交换前:" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; swap(a, b); cout << "交换后:" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; }

【C++| C++ 入门教程(六) 函数】注意一下:自己编写的头文件包含用双引号"",而系统提供的头文件则用尖括号<>。

    推荐阅读