函数的“重载”,全人工打造未解之谜

一、函数重载的意义

重载(Overloading)是指在同一个作用域内,定义多个同名函数,但这些函数的参数列表不同(参数个数、类型或顺序)。

通过重载,我们可以使用同一函数名实现不同的功能,相当于“一词多义”,在编程中称这个叫“多态性”。

二、函数重载的歧义

然而,老金不得不吐槽一下“重载”这个词,显然,它是从英文overload翻译过来的。但是这个词无论读音还是词义,都存在很大的歧义。

over的本义是“向上”(more up, upper),它可以表示动态含义,像火箭一样冲天而起,或像被击打的排球一样,在球网上划出一道彩虹。这时它就是足球场的前锋,“过人”是必杀技,因此引申为“越过”。它还可以表示静态含义,这时表示向上路径的终点,像箭射到靶上,意为“在上”。

load可作名词,表示“负载”,也可作动词,表示“装载”。

因此,理论上over和load有两种搭配关系:

①介+名:over作介词,表“越过”,load作名词,表“负载”。overload表“越过负载”,就是过载,超载。这就是英语词典中给出的意思。

②副+动:over作副词,表“在上”,load作动词,表“装载”,overload指“在上面装载”,就是在一个东西上装这装那。注意,这层意思只是老金臆想出来的,英语词典中并无这种解释。

按第①种解释,似乎可以将编程中的重载理解为:一个函数名承载的比平常多,就像超重了一样。因为正常来说,比如C语言,一个函数只有一种实现,多于一种实现可不就是超出了正常情形,像超载了一样吗?

老金认为,这可能就是用overload命名C++这种特殊语法的真正用意。

为什么这么说呢?老金前面也说了,第②种意思是词典里没有的,假设你为一个新事物取名,会用词典中没有的生编硬造出一个新意思来传达你真正想要表达的思想吗?这不是给自己找不自在吗?

当然,这只是老金的猜想,到底是怎样只能用overload的第一使用者了。

如果overload取“过载、超载”之意,似乎“重载”应读作zhòng zài。

不过,虽然重载也有“过载、超载”之意,但显然没有后者表达的意思更直观、清楚。因此,就算当初翻译者是这样理解的,这个翻译也不能算是一个好翻译。

基于以上分析,老金倾向于译者当初应该选择的是意译“重载(chóng zài)”,取重新装载、重复加载之意。

因“过载、超载”有贬意之嫌,至少有不应该这样做的意味(然而,在C++中这是一种非常正常的行为)。可能,为了去除这种味道,译者大刀阔斧地进行了改革,去其“超”,取其“多”,从而译成“重载(chóng zài)”(大多数人习惯叫chóng zǎi,这样更顺口,无伤大雅)。

因为说到底,超不超不是关键,“多”才是这种行为的本质。

这也呼应了老金给出的第②种解释。在一个函数名上装上这种、那种实现,不就是重新装载、重复加载吗?

这就像一辆装甲车,你可以装机枪,也可以装大炮,或者装导弹。装甲车就是函数名,机枪、大炮、导弹就是函数实现的不同功能。对敌人展开攻击时,装的机枪叫“射击”,装的大炮叫“开炮”,装的导弹叫“发射”,但你也可以都叫一个名字——“干它”。这样,如果你是指挥官,可以不用管车上装的是什么,只需要喊一声“给老子干!”。

  • 21
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金创想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值