c++学习 之 函数重载注意事项
文章目录
- 引用作为函数重载的条件
- 函数重载遇到默认参数
引用作为函数重载的条件
#include <iostream>
using namespace std;
void fun(int &a) {cout << "void fun(int & a)" << endl;
}void fun(const int &a) {cout << "void fun(const int & a)" << endl;
}int main() {int a = 10;fun(a); //调用的是第一个函数 可以看作 int &a = a;fun(10); //调用的是第二个函数 可以看作 const int &a = 10;return 0;
}
引用作为重载的条件:
- 在这个示例中,fun 函数被重载了两次,但它们的参数类型是 int & 和 const int &,这可以看作不同的类型,所以可以重载。
- 第一个重载函数使用了非常量的引用,允许修改传递进来的整数。第二个重载函数使用了常量引用,表示它不会修改传递进来的整数。
- 当你在 main 函数中调用 fun(a) 时,编译器会选择匹配非常量引用的函数,因为变量 a 是非常量。当你调用 fun(10) 时,编译器会选择匹配常量引用的函数,因为常量 10 是一个常量表达式。
函数重载碰到默认参数:
函数重载遇到默认参数
#include <iostream>
using namespace std;void func(int a) {cout << "void func(int a)" << endl;
}void func(int a, int b = 10) {cout << "void func(int a, int b = 10)" << endl;
}int main() {func(10);return 0;
}
问题出现在函数的重载上。尽管 func(int a) 和 func(int a, int b = 10) 有不同的参数数量,但是它们在调用时可能会产生二义性。
在这个特定的示例中,当你调用 func(10) 时,编译器无法确定是调用哪个重载函数,因为都匹配。你提供的参数可以被解释为一个整数参数,也可以被解释为第一个整数参数和默认值为 10 的第二个整数参数。
为了避免这种歧义,可以通过提供更多的信息来明确调用哪个重载函数,例如使用 func(10, 20) 或者通过类型转换来指定调用哪个函数。