【问题标题】:Is function overloading pointless? [closed]函数重载没有意义吗? [关闭]
【发布时间】:2018-07-20 02:49:53
【问题描述】:

据我了解,函数重载只会让程序更容易出错。当我可以创建具有不同名称且更容易区分的函数时,为什么还要拥有一大堆同名的函数。我可以避免这种情况还是有理由理解这一点?

【问题讨论】:

  • 怎样才能让你相信函数重载不会“让程序更容易出错”?因为消除这种信念本质上是理解函数重载实用性的第一步。
  • 您想要一种不能将运算符+ 用于整数加法和浮点加法的编程语言吗?它们使用不同的机器指令和 CPU 组件。
  • 我的意思是,如果学习编程的某个方面并不能使编程或添加实用程序变得容易,那么 imo 就没有意义了。为什么我不应该只创建不同的函数名称?我不是在抱怨。我只是想批判性地思考。
  • 批判性思维的重点是通过分析形成判断,而不是在获得相关知识之前形成预判断。每当您声称进行批判性思考时,准确和准确的措辞就更为重要。
  • @TylerMos:重载如何更容易出错?那就是问题所在;您有许多非常模糊的概念,但您希望其他人的答案非常具体。如果你真的不知道它们是什么,我们就无法消除它们。

标签: c++ overloading


【解决方案1】:

函数重载的一个原因是为了使代码在维护中更加健壮。例如:

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&lt;&lt;,写这段代码:

int i = 3;
double d = 4.1;
long long x = 32;
my_type mt;

std::cout << i << ' ' << d << ' ' << x << ' ' << mt << '\n';

【讨论】:

    【解决方案2】:

    您无法避免重载构造函数,因为构造函数没有名称。重载函数的一个实际示例是std::to_string。您真的不想在每次调用中指定参数类型,并且区分可能性在模板代码中是不切实际的。

    【讨论】:

      猜你喜欢
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 2016-07-05
      • 1970-01-01
      相关资源
      最近更新 更多