据我了解,函数重载只会增加程序中出现错误的可能性。当我只创建具有不同名称的函数时,为什么我应该拥有一大堆具有相同名称的函数,而这些名称更易于区分。我可以避免这种情况吗?还是有理由了解这一点?
答案 0 :(得分:2)
由于构造函数没有名称,因此无法避免重载构造函数。重载函数的一个实际示例是std::to_string
。您确实不想在每次调用中都指定参数类型,并且在模板代码中区分可能性是不现实的。
答案 1 :(得分:2)
函数重载的一个原因是使代码的维护更加健壮。例如:
void f_int(int);
void f_long(long);
void g(int i) {
f_int(i);
}
现在,假设您确定g
实际上应该处理long
而不是int
。因此,您进行了更改:
void g(long i) {
f_int(i); // whoops, forgot to change this to f_long
}
这样的更改可能会产生冗长的波动,最终您不得不在整个源代码中跟踪函数调用,以便通过函数重载进行简单的更改:
void f(int);
void f(long);
void g(int i) {
f(i); // calls f(int)
}
void new_g(long i) {
f(i); // calls f(long)
}
这种事情经常发生在模板编程中。作为练习,请尝试编写此模板而不使f
重载:
void f(int);
void f(long);
template <class T> void g(T arg) {
f(arg);
}
做完该练习后,如果您认为还算不错,请尝试使用f
的六个版本。
请注意,“我不需要模板”不是有效的答案。
重载非常重要的另一个地方是重载运算符。想象一下,如果您无法重载operator<<
,就可以编写此代码:
int i = 3;
double d = 4.1;
long long x = 32;
my_type mt;
std::cout << i << ' ' << d << ' ' << x << ' ' << mt << '\n';