📅  最后修改于: 2023-12-03 15:22:37.528000             🧑  作者: Mango
在 C++ 中,函数重载和函数用 C++ 重写是两种重要的技术,它们有着不同的应用场景和优劣势。本文将介绍它们的概念、用法、优缺点和一些实例。
函数重载(Function Overloading)是指在同一作用域中定义多个同名的函数,但它们的参数列表不同。当调用这个函数时,编译器会根据实参的类型和数量匹配不同的重载函数,从而实现不同的功能。
函数重载有以下特点:
下面是一个求和函数的重载示例:
// int 类型求和
int add(int a, int b) {
return a + b;
}
// double 类型求和
double add(double a, double b) {
return a + b;
}
// main 函数
int main() {
cout << add(1, 2) << endl; // 输出 3
cout << add(2.3, 4.5) << endl; // 输出 6.8
return 0;
}
我们可以发现,add 函数被重载了两次,分别对应 int 类型和 double 类型。在 main 函数中,分别传入不同类型的参数进行调用,程序能够根据参数类型匹配不同的重载函数,最终得到正确的结果。
函数重载的优点有:
函数重载的缺点有:
函数用 C++ 重写(Function Rewriting)是指将原来用其他语言实现的函数,重新使用 C++ 语言实现。相较于函数重载,函数用 C++ 重写更加灵活,可以实现更多的功能,同时也可以完全掌控该函数的实现。
下面是一个把两个数组合并的函数重写的示例:
// 原来的 C 语言实现
void merge(int* array1, int* array2, int* result, int size1, int size2) {
memcpy(result, array1, size1 * sizeof(int));
memcpy(result + size1, array2, size2 * sizeof(int));
}
// 使用 C++ 重写
void merge(vector<int>& array1, vector<int>& array2, vector<int>& result) {
result.insert(result.end(), array1.begin(), array1.end());
result.insert(result.end(), array2.begin(), array2.end());
}
// main 函数
int main() {
int array1[3] = {1, 2, 3};
int array2[2] = {4, 5};
int result[5];
merge(array1, array2, result, 3, 2); // 使用原来的函数
vector<int> vec1{1, 2, 3};
vector<int> vec2{4, 5};
vector<int> vec_result;
merge(vec1, vec2, vec_result); // 使用新的函数
return 0;
}
我们可以看到,原来使用 C 语言实现的 merge 函数,需要手动使用 memcpy 函数完成数组的合并。而使用 C++ 重写后的 merge 函数,直接使用 STL 容器 vector 完成,不仅代码更加简洁,还可以避免出现内存泄漏等问题。
函数用 C++ 重写的优点有:
函数用 C++ 重写的缺点有:
函数重载和函数用 C++ 重写,是两种不同的函数实现方式,各自有其应用场景和优劣势。程序员需要根据实际需求,在两者中进行选择。在实际开发中,我们也可以将二者结合使用,根据具体情况灵活选取。