C++ 对 C 的函数进行了多方面的扩展,提供了更强大的功能、更好的类型安全性以及面向对象的特性。这些扩展使得函数在 C++ 中更加灵活和强大,同时保持对 C 函数的兼容性。
以下是 C++ 对 C 函数的主要扩展:
1. 函数重载(Function Overloading)
C++ 支持函数重载,而 C 不支持。函数重载允许在同一个作用域内定义多个具有相同名字但参数列表不同的函数。
示例:
#include <iostream>
using namespace std;
void print(int x) {
cout << "Integer: " << x << endl;
}
void print(double x) {
cout << "Double: " << x << endl;
}
void print(const char* x) {
cout << "String: " << x << endl;
}
int main() {
print(10); // 调用 print(int)
print(3.14); // 调用 print(double)
print("Hello"); // 调用 print(const char*)
return 0;
}
特点:
- 重载的函数必须具有不同的参数列表(类型或数量)。
- 编译器根据调用时的参数自动选择最匹配的函数。
2. 默认参数(Default Arguments)
C++ 支持在函数声明中为参数提供默认值,而 C 不支持。
示例:
#include <iostream>
using namespace std;
void greet(const char* name = "Guest") {
cout << "Hello, " << name << "!" << endl;
}
int main() {
greet("Alice"); // 输出:Hello, Alice!
greet(); // 输出:Hello, Guest!
return 0;
}
特点:
- 默认参数必须从右向左连续定义。
- 如果函数有多个参数,可以部分省略,未提供的参数使用默认值。
3. 内联函数(Inline Functions)
C++ 提供 inline
关键字,用于建议编译器将函数的调用替换为函数体的代码。这是对 C 宏的一种安全替代。
示例:
#include <iostream>
using namespace std;
inline int square(int x) {
return x * x;
}
int main() {
cout << square(5) << endl; // 输出 25
return 0;
}
优点:
- 避免函数调用的开销。
- 比 C 宏更安全,因为有类型检查。
- 适合小型、频繁调用的函数。
4. 引用参数(Reference Parameters)
C++ 引入了引用,可以直接通过引用参数对实参进行修改,而不需要像 C 一样使用指针。
示例:
#include <iostream>
using namespace std;
void increment(int& x) {
x += 1;
}
int main() {
int a = 10;
increment(a);
cout << a << endl; // 输出 11
return 0;
}
优点:
- 代码更简洁,不需要解引用操作。
- 更符合直观的语义。
5. 函数模板(Function Templates)
C++ 提供了模板机制,使得函数可以适用于多种数据类型,而无需为每种类型编写单独的函数。
示例:
#include <iostream>
using namespace std;
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
cout << add(1, 2) << endl; // 输出 3 (int)
cout << add(1.1, 2.2) << endl; // 输出 3.3 (double)
return 0;
}
优点:
- 支持类型泛化,减少代码重复。
- 编译器根据参数类型生成具体的函数代码。
6. 函数返回值(支持引用和右值引用)
C++ 支持函数返回引用或右值引用,提供更高效的资源管理和操作。
示例:
#include <iostream>
using namespace std;
int& getValue(int& x) {
return x;
}
int main() {
int a = 10;
getValue(a) = 20; // 修改 a 的值
cout << a << endl; // 输出 20
return 0;
}
右值引用(C++11):
#include <iostream>
using namespace std;
int&& getTempValue() {
return 10; // 返回右值引用
}
int main() {
int&& val = getTempValue();
cout << val << endl; // 输出 10
return 0;
}
7. 函数指针和多态函数
C++ 的函数指针支持绑定到普通函数或成员函数,并且可以结合多态实现动态行为。
普通函数指针:
#include <iostream>
using namespace std;
void greet() {
cout << "Hello!" << endl;
}
int main() {
void (*funcPtr)() = greet;
funcPtr(); // 调用 greet
return 0;
}
成员函数指针:
#include <iostream>
using namespace std;
class MyClass {
public:
void sayHello() {
cout << "Hello from MyClass!" << endl;
}
};
int main() {
MyClass obj;
void (MyClass::*funcPtr)() = &MyClass::sayHello;
(obj.*funcPtr)(); // 调用成员函数
return 0;
}
8. Lambda 表达式(C++11)
C++ 引入了 Lambda 表达式,使得函数可以在定义时作为内联表达式传递。
示例:
#include <iostream>
using namespace std;
int main() {
auto add = [](int a, int b) -> int {
return a + b;
};
cout << add(3, 4) << endl; // 输出 7
return 0;
}
特点:
- 可以捕获外部变量。
- 适用于短小的内联函数。
9. 函数声明的增强(函数声明后可选尾随返回类型)
C++11 引入了尾随返回类型,用于复杂类型的函数声明。
示例:
#include <iostream>
using namespace std;
auto add(int a, int b) -> int {
return a + b;
}
int main() {
cout << add(2, 3) << endl; // 输出 5
return 0;
}
总结
C++ 对 C 函数的扩展增强了函数的灵活性和安全性,同时支持了更多现代编程特性,包括:
- 函数重载:同名函数可以根据参数列表重载。
- 默认参数:可以省略部分参数。
- 内联函数:替代宏,提高效率。
- 模板函数:泛型编程,减少代码重复。
- 右值引用:支持高效的移动语义。
- Lambda 表达式:简化内联函数定义。
如果你有具体的需求或想了解某个扩展的细节,随时告诉我