c++学习 之 函数重载注意事项

文章目录

  • 引用作为函数重载的条件
  • 函数重载遇到默认参数

引用作为函数重载的条件

#include 
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 
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) 或者通过类型转换来指定调用哪个函数。

你可能感兴趣的:(c++,c++,学习,算法)