函数重载没有意义吗?

时间:2018-07-20 02:49:54

标签: c++ overloading

据我了解,函数重载只会增加程序中出现错误的可能性。当我只创建具有不同名称的函数时,为什么我应该拥有一大堆具有相同名称的函数,而这些名称更易于区分。我可以避免这种情况吗?还是有理由了解这一点?

2 个答案:

答案 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';