关于运算符重载,下列说法正确的是( )。
这题考运算符重载的函数签名唯一性。拿到题先别想数学交换律,盯着编译器怎么区分重载:参数类型序列不同就能共存,顺序变了就是新函数。
容易把数学上的交换律(a+b=b+a)套用到 C++ 重载上,误以为参数顺序互换必须实现一致;或者死记‘重载必须完全相同’这种绝对化表述,忘了编译器只看参数序列,哪怕把 int 改成 double 也能编译,这类绝对化选项往往是命题人挖的坑。
【考点】运算符重载的函数签名唯一性|C++标准库规则|参数顺序决定重载区分
本题是 GESP C++ 组六级的概念辨析题,命题人专门设计这道选择题,就是要卡住考生对‘函数签名’这一概念的模糊认知——绝大多数人背熟了‘运算符重载’这个词,却说不清编译器到底按什么规则区分重载函数。
解题的核心判断依据只有一条:C++ 中函数重载的唯一标识是参数类型序列。当两个重载声明的参数类型顺序不同(int, Test vs Test, int),它们就是两个完全独立的函数,编译器毫无理由禁止同时存在。A 选项的描述精准命中了这一规则。
B 选项试图用‘加法满足交换律’来论证,这是典型的语义混淆——C++ 编译器只关心语法签名,不关心你重载的运算符代表什么数学运算。即便你重载的是减法,只要参数顺序不同,照样能共存。
C 选项声称‘所有参数类型必须完全相同’,这是对重载机制的根本性误解。反证法很简单:如果把后一处 int 改成 double,参数序列就不同了,照样能编译,直接证伪。
D 选项属于逻辑偷懒陷阱,既然 C 明显错误,D 必然也错,选项之间存在逻辑包含关系,D 属于无效选项。
【反命题思维】 如果把 C 选项中的后一处 int 改成 double,则两个重载的参数序列分别为 (int, Test) 和 (Test, double),仍保持唯一性,C 的断言彻底崩塌。
刷到类似题先问自己:这道题是在考‘运算符重载能做什么’,还是考‘编译器如何区分重载函数’——前者是语义,后者才是 C++ 标准规定的硬性规则。
【考频与趋势】 运算符重载在 GESP 六级中属于高频考点,历年考频稳定在 2-3 题/年,常与类成员函数、友元函数结合考查。命题趋势上,越来越喜欢用‘看似合理但违背编译器规则’的选项(如 B 的交换律陷阱)来区分真正掌握 C++ 语法的考生。
【预测】 基于近年趋势,未来六级题仍可能以‘参数顺序是否影响重载’为核心,但会增加‘返回类型是否参与重载’的干扰项,考生需格外注意 C++ 标准规定:返回类型不参与重载区分。