"C++ Primer Plus 第三版 中文版,由Stanley B. Lippman和Josée Lajoie合著,深入解析C++语言,包括C++ PREMIER标签的相关知识,讲述了C++的复杂性和发展历史,以及C++在1998年标准化后的新面貌。"
在C++编程中,类成员函数的重载解析过程是一个关键概念,它涉及到如何正确找到和调用正确的操作符或函数。本节主要讨论了在使用操作符语法时,如`si + iobj`这样的表达式,如何解析并选择适当的操作符函数`operator+`。
首先,候选的操作符函数是指与被调用的函数同名的函数。在上述例子中,对于`si + iobj`的加法操作,候选的`operator+`函数会被寻找。这些候选函数分为以下几个集合:
1. **在调用点可见的操作符集合**:这是指在当前作用域中可以直接访问的`operator+`声明,如全局域中的`SmallInt operator+ ( const SmallInt&, const SmallInt & );`。
2. **操作数类型定义的名字空间中声明的操作符集合**:如果操作数是类类型,如`SmallInt`,并且这个类在用户定义的名字空间(如`NS`)中声明,那么在该名字空间内声明的同名操作符函数也是候选函数,如`NS::SmallInt operator+ ( const SmallInt&, double );`。
C++中的重载解析遵循一定的规则,不仅要考虑函数签名,还要考虑操作符的上下文,比如是否是成员操作符,以及操作数的类型。在解析过程中,编译器会尝试匹配最合适的候选函数,这个过程涉及类型转换、函数重载规则等。
对于非成员操作符函数,如果一个操作数是类类型,那么编译器会试图通过隐式类型转换找到合适的候选函数。对于成员操作符函数,如`si.operator+(iobj)`,则会优先考虑类`SmallInt`内部的`operator+`成员函数,这涉及到成员函数的隐藏规则和作用域解析。
C++ Primer Plus这本书详细解释了这些规则,并提供了丰富的示例来帮助理解。通过学习,读者能够更好地理解和编写符合C++标准的、可移植的代码,避免因不理解重载解析过程而导致的常见错误。该书的权威性和作者的专业背景,使得它成为学习C++语言的重要参考资料。