C++ 函数基础
外观
C++函数基础[编辑 | 编辑源代码]
函数是C++程序中的基本构建块,它是一段可重复使用的代码,用于执行特定任务。函数可以接受输入参数,并可能返回一个值。使用函数可以提高代码的可读性、可维护性和复用性。
函数的基本结构[编辑 | 编辑源代码]
一个C++函数的基本语法如下:
返回类型 函数名(参数列表) {
// 函数体
return 返回值; // 如果返回类型不是void
}
组成部分详解[编辑 | 编辑源代码]
- 返回类型:函数返回的数据类型(如int、float等),如果函数不返回值,则使用void
- 函数名:函数的标识符,遵循C++命名规则
- 参数列表:传递给函数的输入,可以有零个或多个参数
- 函数体:包含实际执行的代码
- return语句:将控制权返回给调用者,可能带有返回值
简单的函数示例[编辑 | 编辑源代码]
下面是一个计算两个数之和的简单函数:
#include <iostream>
// 函数声明
int addNumbers(int a, int b);
int main() {
int num1 = 5;
int num2 = 7;
// 函数调用
int result = addNumbers(num1, num2);
std::cout << "The sum is: " << result << std::endl;
return 0;
}
// 函数定义
int addNumbers(int a, int b) {
return a + b;
}
输出:
The sum is: 12
函数参数传递方式[编辑 | 编辑源代码]
C++中有三种主要的参数传递方式:
1. 按值传递[编辑 | 编辑源代码]
函数接收参数的副本,原始值不会被修改。
void increment(int x) {
x++;
}
2. 按引用传递[编辑 | 编辑源代码]
函数接收参数的引用,可以修改原始值。
void increment(int &x) {
x++;
}
3. 按指针传递[编辑 | 编辑源代码]
函数接收参数的指针,可以修改原始值。
void increment(int *x) {
(*x)++;
}
函数重载[编辑 | 编辑源代码]
C++允许在同一作用域内定义多个同名函数,只要它们的参数列表不同(参数类型、数量或顺序不同)。
#include <iostream>
// 重载函数示例
void print(int i) {
std::cout << "整数: " << i << std::endl;
}
void print(double f) {
std::cout << "浮点数: " << f << std::endl;
}
void print(const char* s) {
std::cout << "字符串: " << s << std::endl;
}
int main() {
print(5);
print(3.14);
print("Hello");
return 0;
}
输出:
整数: 5 浮点数: 3.14 字符串: Hello
默认参数[编辑 | 编辑源代码]
C++允许为函数参数指定默认值,当调用函数时省略该参数时使用默认值。
#include <iostream>
void display(int a, int b = 20) {
std::cout << "a = " << a << ", b = " << b << std::endl;
}
int main() {
display(10); // 使用b的默认值
display(10, 30); // 覆盖b的默认值
return 0;
}
输出:
a = 10, b = 20 a = 10, b = 30
递归函数[编辑 | 编辑源代码]
函数可以调用自身,这种技术称为递归。
#include <iostream>
int factorial(int n) {
if (n <= 1)
return 1;
else
return n * factorial(n - 1);
}
int main() {
int num = 5;
std::cout << "Factorial of " << num << " is " << factorial(num) << std::endl;
return 0;
}
输出:
Factorial of 5 is 120
内联函数[编辑 | 编辑源代码]
使用inline关键字可以建议编译器将函数内联展开,以减少函数调用的开销。
#include <iostream>
inline int max(int a, int b) {
return (a > b) ? a : b;
}
int main() {
std::cout << "最大值是: " << max(10, 20) << std::endl;
return 0;
}
输出:
最大值是: 20
函数指针[编辑 | 编辑源代码]
C++允许使用指针来指向函数,这为回调函数和动态函数调用提供了可能。
#include <iostream>
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int main() {
// 声明函数指针
int (*operation)(int, int);
operation = add;
std::cout << "10 + 5 = " << operation(10, 5) << std::endl;
operation = subtract;
std::cout << "10 - 5 = " << operation(10, 5) << std::endl;
return 0;
}
输出:
10 + 5 = 15 10 - 5 = 5
实际应用案例[编辑 | 编辑源代码]
考虑一个简单的银行账户管理系统,使用函数来封装各种操作:
#include <iostream>
#include <string>
struct Account {
std::string name;
double balance;
};
// 显示账户信息
void displayAccount(const Account &acc) {
std::cout << "账户名: " << acc.name << "\n余额: $" << acc.balance << std::endl;
}
// 存款
void deposit(Account &acc, double amount) {
if (amount > 0) {
acc.balance += amount;
std::cout << "存款成功! 新余额: $" << acc.balance << std::endl;
} else {
std::cout << "无效的存款金额!" << std::endl;
}
}
// 取款
void withdraw(Account &acc, double amount) {
if (amount > 0 && amount <= acc.balance) {
acc.balance -= amount;
std::cout << "取款成功! 新余额: $" << acc.balance << std::endl;
} else {
std::cout << "无效的取款金额或余额不足!" << std::endl;
}
}
int main() {
Account myAccount {"张三", 1000.0};
displayAccount(myAccount);
deposit(myAccount, 500.0);
withdraw(myAccount, 200.0);
withdraw(myAccount, 2000.0); // 这个会失败
return 0;
}
输出:
账户名: 张三 余额: $1000 存款成功! 新余额: $1500 取款成功! 新余额: $1300 无效的取款金额或余额不足!
函数调用流程[编辑 | 编辑源代码]
数学函数示例[编辑 | 编辑源代码]
C++标准库提供了许多数学函数,例如:
#include <iostream>
#include <cmath>
int main() {
double x = 2.0;
std::cout << "平方根: " << sqrt(x) << std::endl;
std::cout << "2的3次方: " << pow(2, 3) << std::endl;
std::cout << "e的2次方: " << exp(2) << std::endl;
std::cout << "自然对数: " << log(x) << std::endl;
std::cout << "正弦值: " << sin(x) << std::endl;
return 0;
}
输出:
平方根: 1.41421 2的3次方: 8 e的2次方: 7.38906 自然对数: 0.693147 正弦值: 0.909297
总结[编辑 | 编辑源代码]
- 函数是C++程序的基本构建块
- 函数可以提高代码的复用性和可维护性
- C++支持多种参数传递方式:值传递、引用传递和指针传递
- 函数可以重载,允许同名函数有不同的参数列表
- 递归函数可以解决某些特定类型的问题
- 内联函数可以减少函数调用的开销
- 函数指针提供了动态调用函数的能力
掌握函数的使用是成为高效C++程序员的关键步骤。通过合理设计和使用函数,可以创建结构清晰、易于维护的程序。