函数重载的注意事项(必看)

函数重载的注意事项

问题一

#include "iostream"  
using namespace std;  
  
void func(const int& a)  
{  
    cout << "调用func(const int& a)函数" << endl;  
}  
  
void func(int& a)  
{  
    cout << "调用func(int& a)函数" << endl;  
}  
  
int main()  
{  
    int a = 10;  
  
    func(a);  
}  

上面代码中func(a)调用那个重载函数呢?

调用函数的优先级取决于“传入参数的类型与那个重载函数形参最接近”。

函数重载状态一:

void func(const int& a)  // 该函数形参的a为“只读”状态
{  
    cout << "调用func(const int& a)函数" << endl;  
}  

函数重载状态二:

void func(int& a)  // 该函数形参的a为“可读可写”状态
{  
    cout << "调用func(int& a)函数" << endl;  
}  

我们在main函数中给func函数传入的参数是int类型的a,此时的实参a是“可读可写状态”,因此调用的是“函数重载状态二”。

问题二

#include "iostream"  
using namespace std;  
  
void func(const int& a)  
{  
    cout << "调用func(const int& a)函数" << endl;  
}  
  
void func(int& a)  
{  
    cout << "调用func(int& a)函数" << endl;  
}  
  
int main()  
{  
    int a = 10;  
  
    func(a);  
} 

 

上述程序在什么情况下可以调用“函数重载状态一”?

#include "iostream"  
using namespace std;  
  
void func(const int& a)  
{  
    cout << "调用func(const int& a)函数" << endl;  
}  
  
void func(int& a)  
{  
    cout << "调用func(int& a)函数" << endl;  
}  
  
int main()  
{  
    func(10);  
}  

此时可以调用“函数重载状态一”,因为传入形参是“常量”,与“函数重载状态一的传入形参——const常量”相符合。我们反观函数重载状态一的形参,函数重载状态一的形参是“含有“可以访问的有效内存空间”的变量”,显然常量10不符合要求。

问题三

#include "iostream"  
using namespace std;  
  
void func(const int& a)  
{  
    cout << "调用func(const int& a)函数" << endl;  
}  
  
void func(int& a)  
{  
    cout << "调用func(int& a)函数" << endl;  
}  
  
void func(int& a, int b = 10)  
{  
    cout << "调用func(int& a, int b = 10)函数" << endl;  
}  
  
int main()  
{  
    int a = 10;  
  
    func(a);  
} 

​​​​​​​ 

以上程序能正常运行吗?

答案是“NO”。

当你传入参数是非const整型变量a时,对应两个func函数:

① void func(int& a, int b = 10)

② void func(int& a)

但是,这两个函数没有调用优先级之分,因此这段程序不可以正常运行!

猜你喜欢

转载自blog.csdn.net/weixin_45590473/article/details/109261375