Cur*_*eek 30 c c++ overloading
我有一个C背景.我只是想知道为什么函数重载被添加到C++中?C没有函数重载但是C++没有,它需要什么?
当时语言设计师的想法是什么?
Pup*_*ppy 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++字符串重载是非常多余.但是,这种情况比这更普遍,并非所有这些过载都是多余的.
Stu*_*etz 22
除了DeadMG所说的,一个很好的理由是,如果你正在编写一个模板函数,例如调用sqrt,那么你需要一种通用的调用方式sqrt- 如果你不得不尝试以某种方式改变名称将是非常困难的to sqrtf,sqrtd等等,具体取决于模板参数的类型.重载解决了这个问题,因为那样你只需编写sqrt并让编译器找出它应该使用的重载:
template <typename T>
T sqrt_plus_one(T t) // contrived example
{
return sqrt(t) + 1;
}
Run Code Online (Sandbox Code Playgroud)
Naw*_*waz 15
你更喜欢在abs/labs/llabs/fabs/fabsf/fabsl中选择一个还是只选择abs()?
显然,abs().
因此,除了其他优点之外,大多数情况下,函数重载对程序员来说是一种解脱.
| 归档时间: |
|
| 查看次数: |
3157 次 |
| 最近记录: |