我有一个C背景。我只是想知道为什么函数重载被添加到C ++中? C没有函数重载但是C ++没有,它需要什么?
当时语言设计师的想法是什么?
答案 0 :(得分:54)
它提高了可维护性。如果你有一个类型T并用它调用一个函数,那么你需要更改T,如果该函数已经为新T重载,那么你可以立即重新编译。在C中,您必须返回并浏览所有呼叫站点并更改所调用的功能。拿sqrt()。如果你想sqrt()一个浮点数,那么你必须改为sqrtf()。
不仅如此,C ++的类型系统的数量和复杂性远远超过C,并且必须为每个可能的重载分别具有单独的函数名称,这很快会耗尽合理的名称池,用于同样目的的函数。采取不同的论点,因为现在有更多的论据要采取。
例如,比较C和C ++字符串库。 C字符串库提供了一种附加到字符串的方法 - strcat()。 C ++的std :: string :: append有8个重载。你想叫他们什么? append_a,append_b等?这太荒谬了 - 他们都以不同的方式发挥同样的作用。
编辑: 实际上值得一提的是append
是一个非常糟糕的例子,许多C ++字符串重载非常多余。但是,这种情况比一般情况更为普遍,而且所有这些重载都是多余的。
答案 1 :(得分:22)
除了DeadMG所说的,还有一个很好的理由是,如果你正在编写一个模板函数,例如调用sqrt
,然后你需要一个泛型方式调用sqrt
- 如果你不得不尝试以某种方式将名称改为sqrtf
,那将非常困难,sqrtd
等,具体取决于模板参数的类型。重载解决了这个问题,因为那样你只需编写sqrt
并让编译器找出它应该使用的重载:
template <typename T>
T sqrt_plus_one(T t) // contrived example
{
return sqrt(t) + 1;
}
答案 2 :(得分:15)
您希望在 abs / labs / llabs / fabs / fabsf / fabsl 中选择一个,还是只选择 abs()?
显然, abs()。
所以函数重载对于程序员来说是一种解脱,大多数情况下,除了其他优点之外。
答案 3 :(得分:12)
你可以直接从马的嘴里得到答案:Bjarne Stroustrup的The Design and Evolution of C++用了整整一章来讨论超载,历史,演变,设计权衡和决策。
我不会在这里讲述这个故事,但会提到一些有趣的历史事实:
overload
),必须用来将标识符声明为重载; lint
- 有些令人尴尬”。 )答案 4 :(得分:3)
如果不是为了函数重载,尝试提出一种构造对象的舒适方法。
std::string foo = "bar";
std::vector< std::string > myStringVector;
myStringVector.push_back( std::string() );
myStringVector.push_back( std::string( "hello" ) );
myStringVector.push_back( std::string( foo ) );
当然是一个无意义的例子,但它说明了这一点。
另一点是模板编程。如果必须为每个参数类型使用不同的函数名,则无法提供通用模板。
答案 5 :(得分:0)
使用多态,我们可以设计一个具有相同函数名但具有不同参数列表的函数族。该函数将根据函数调用中的参数列表执行不同的操作。