目录
函数默认参数
在C++中,函数默认参数允许在定义函数时为形参列表中的参数提供默认值。当调用函数时没有提供相应的参数值时,将使用默认参数。
语法
返回值类型 函数名 (参数= 默认值){}
示例
#include <iostream>
// 定义一个带有默认参数的函数
void greet(std::string name = "World") {
std::cout << "Hello, " << name << "!" << std::endl;
}
int main() {
greet(); // 输出: Hello, World!
greet("Alice"); // 输出: Hello, Alice!
greet("Bob"); // 输出: Hello, Bob!
return 0;
}
在上面的示例中,
greet
函数拥有一个默认参数name
,其默认值为"World"
。当调用greet
函数时,如果没有提供name
的实际参数值,则使用默认值。
注意
某个位置参数有默认值,那么从这个位置往后都要有默认值
默认参数只能从右向左进行设置,即非默认参数必须位于默认参数的左侧
// 错误的示例
void foo(int a = 0, int b) {
// 函数体
}
函数声明有默认值,函数实现的时候就不能有默认参数
int func2(int a = 10, int b = 10);
int func2(int a, int b) {
return a + b;
}
如果需要指定某个参数的实际值而跳过后面的默认参数,可以使用参数名的方式进行调用。
void bar(int a, int b = 0, int c = 0) {
// 函数体
}
int main() {
bar(1); // 使用默认值 0,等价于 bar(1, 0, 0)
bar(2, 3); // 使用默认值 0,等价于 bar(2, 3, 0)
bar(4, c: 5); // 指定 c 的值为 5,等价于 bar(4, 0, 5)
return 0;
}
函数占位参数
定义
函数占位参数(placeholder parameter)是指在函数声明或定义中使用的没有具体类型和名称的参数。它们通常用于定义泛型函数,以允许在函数调用时指定具体的参数类型。
语法
返回值类型 函数名 (数据类型){}
示例
//函数占位参数 ,占位参数也可以有默认参数
void func(int a, int) {
cout << "this is func" << endl;
}
int main() {
func(10,10); //占位参数必须填补
system("pause");
return 0;
}
注意
函数占位参数 ,占位参数也可以有默认参数
占位参数必须填补
函数重载
定义
函数重载(function overloading)是指在同一个作用域内,定义多个具有相同名称但参数列表不同的函数。通过使用函数重载,我们可以使用相同的函数名来执行不同的操作,根据传递给函数的参数的类型和数量进行区分。
条件
同一个作用域下
函数名称相同
函数参数 的类型、个数、 顺序不同 (函数返回类型不同不行)
作用
提高可读性和易用性:通过使用相同的函数名,但具有不同的参数列表,使函数的调用更加直观和自然。程序员可以根据需要选择合适的函数重载,而无需记忆多个不同的函数名。
简化代码结构:通过函数重载,可以将执行类似操作但对不同类型的数据进行处理的代码组织在一起。这样可以减少代码的重复性,并使程序结构更加清晰和模块化。
灵活处理不同类型的数据:函数重载允许针对不同类型的数据提供特定的操作。例如,在一个名为
sum
的函数中,可以通过函数重载实现对整数、浮点数、字符串等不同类型的数据进行求和操作。避免函数命名冲突:当我们需要定义多个功能相似但参数不同的函数时,使用函数重载可以避免函数命名冲突的问题,同时还提高了函数名复用性。如果不使用函数重载,我们需要为每个函数分配一个唯一的函数名,这可能导致函数名冗长和命名困难。
示例
#include <iostream>
// 函数重载示例:计算两个整数的和、差、积、商
// 计算两个整数的和
int calculate(int a, int b) {
return a + b;
}
// 计算两个整数的差
int calculate(int a, int b, int c) {
return a - b - c;
}
// 计算两个整数的积
int calculate(int a, int b, int c, int d) {
return a * b * c * d;
}
// 计算两个整数的商
double calculate(double a, double b) {
if (b != 0) {
return a / b;
} else {
std::cout << "除数不能为零" << std::endl;
return 0;
}
}
int main() {
int x = 5;
int y = 3;
int z = 2;
double m = 10.0;
double n = 2.5;
// 调用不同的函数重载来进行计算
int sum = calculate(x, y);
int difference = calculate(x, y, z);
int product = calculate(x, y, z, z);
double quotient = calculate(m, n);
std::cout << "和:" << sum << std::endl; // 输出: 和:8
std::cout << "差:" << difference << std::endl; // 输出: 差:0
std::cout << "积:" << product << std::endl; // 输出: 积:60
std::cout << "商:" << quotient << std::endl; // 输出: 商:4
return 0;
}
在上述示例中,我们定义了一个名为
calculate
的函数,并使用不同的参数列表进行重载。首先,我们定义了一个函数用于计算两个整数的和;接着,我们定义了一个函数用于计算三个整数的差;然后,我们定义了一个函数用于计算四个整数的积;最后,我们定义了一个函数用于计算两个浮点数的商。
注意
引用作为重载条件
在函数重载时,引用作为参数类型可能会引发歧义。请注意,编译器无法通过参数是否为引用来区分函数,因为实参既可以是引用也可以是非引用类型。因此,在使用引用作为参数类型进行函数重载时,要特别小心,以避免出现歧义或错误的重载解析。
函数重载碰到函数默认参数
在函数重载中,函数的默认参数值可能会导致代码的二义性。如果两个函数在参数数量和类型上完全相同,但其中一个函数有默认参数值,编译器将无法确定应该调用哪个函数,因为调用时没有提供所有参数。为了避免这种情况,可以通过函数重载来消除二义性,或者通过重构代码来避免使用默认参数。