C++如何确定表达式计算时应调用的函数?
C++运算符重载的语法映射规则
C的运算符重载本质是语法糖——编译器会自动把运算符表达式转换为对应的operatorXXX函数调用,规则由C语言标准明确规定,针对你提到的场景具体说明如下:
1. 一元运算符重载(如-object)
当你编写object2 = -object1时,编译器会按照标准规则,将一元负号表达式-object1直接映射为成员函数调用:
object2 = object1.operator-();
这是因为一元运算符(-、++、--等)作用于类对象时,C++标准优先匹配该类的成员operator-()函数(无参数版本对应一元运算符)。只要类中定义了符合签名的成员运算符函数,编译器就会自动完成这个转换。
2. 全局运算符重载(如int + Complex)
对于answer = 10 + aComplexNumber这种表达式,编译器会将其转换为全局运算符函数的调用:
answer = operator+(10, aComplexNumber);
原因是:如果运算符左侧不是类对象(这里是int),无法调用成员operator+(成员运算符要求左侧是当前类的实例),此时编译器会在当前作用域(包括可见的命名空间)中查找参数匹配的非成员operator+函数。只要你定义了Complex operator+(int, const Complex&),编译器就会匹配到这个函数并完成转换。
3. 下标运算符[]重载
object[argument]这种写法,编译器会强制转换为成员函数调用:
object.operator[](argument);
C++标准明确规定:下标运算符operator[]只能作为类的成员函数重载,不存在全局版本的合法重载。所以编译器无需额外判断,直接按照这个规则完成语法映射。
内容的提问来源于stack exchange,提问作者Khanh
相关产品推荐
相关产品推荐

