写程序最怕的就是一段代码到处复制粘贴。函数就是用来解决这个问题的:把一段常用逻辑打包起来,起个名字,想用的时候喊一声就行。这篇文章带你把 C++ 函数的几个核心用法一次搞清楚。
定义并调用一个最简单的函数
一个函数由返回值类型、函数名、参数列表和函数体组成:
#include <iostream>
using namespace std;
void sayHello() {
cout << "Hello, C++!" << endl;
}
int main() {
sayHello(); // 输出:Hello, C++!
sayHello(); // 再调用一次,就再输出一次
return 0;
}
void 表示这个函数不返回任何值。函数定义好之后不会立刻执行,只有被调用时才会跑里面的代码。
带参数的函数
参数让函数变得灵活——同一套逻辑可以处理不同的数据:
#include <iostream>
using namespace std;
void greet(string name, int times) {
for (int i = 0; i < times; i++) {
cout << "你好, " << name << "!" << endl;
}
}
int main() {
greet("小明", 2);
// 输出:
// 你好, 小明!
// 你好, 小明!
greet("小红", 1); // 输出:你好, 小红!
return 0;
}
调用时传的值叫实参,函数定义里的 name、times 叫形参。实参按位置一一对应传给形参。
有返回值的函数
想让函数算出一个结果交还给调用者,就给它定一个返回值类型:
#include <iostream>
using namespace std;
int add(int a, int b) {
return a + b;
}
double circleArea(double r) {
return 3.14159 * r * r;
}
int main() {
int sum = add(3, 5);
cout << sum << endl; // 输出:8
cout << circleArea(2.0) << endl; // 输出:12.5664
return 0;
}
return 会立刻结束函数,并把后面的值送回去。返回值类型是 int,就返回一个整数;是 double 就返回小数,类型要对得上。
函数重载:同名不同活
C++ 允许多个函数共用一个名字,只要参数列表不一样,这叫函数重载:
#include <iostream>
using namespace std;
int maxValue(int a, int b) {
return a > b ? a : b;
}
double maxValue(double a, double b) {
return a > b ? a : b;
}
int main() {
cout << maxValue(3, 7) << endl; // 输出:7
cout << maxValue(2.5, 1.8) << endl; // 输出:2.5
return 0;
}
编译器会根据你传的实参类型自动挑合适的版本。注意:只有返回值类型不同、参数完全一样,不算重载,编译器会直接报错。
先声明后使用
如果把函数写在 main 后面,编译器读到调用处还不认识它。这时可以先给一个函数声明,也叫函数原型:
#include <iostream>
using namespace std;
int square(int x); // 函数声明,末尾有分号
int main() {
cout << square(5) << endl; // 输出:25
return 0;
}
int square(int x) { // 函数定义可以放在后面
return x * x;
}
小结
- 函数把常用逻辑打包复用,
void表示不返回值 - 形参在定义里占位,实参在调用时传入,按位置一一对应
return结束函数并送回结果,返回类型要匹配- 参数列表不同的同名函数构成重载,编译器按实参类型挑版本
- 函数定义放在调用之后时,记得先写声明
函数是组织代码的基本单元,把这篇吃透,后面学类、模板都会顺很多。