函数重载的注意事项
问题一
#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)
但是,这两个函数没有调用优先级之分,因此这段程序不可以正常运行!