在C++编程中,第十五章重点讨论了重载操作符和用户定义的转换。C++语言规范严格要求赋值(=)、下标([])、调用(())以及成员访问(->)等特定操作符必须作为类成员函数来定义,以确保代码的正确性和一致性。试图将这些操作符定义为命名空间成员会导致编译错误。例如,正确的做法是:
```cpp
class String {
public:
char& operator[](String& str, int ix); // 正确的定义应为类成员
};
// 错误示例:
// char& operator[](String &, int); // 必须是类成员
在本节中,作者强调了对于某些对称操作符,尤其是涉及类类型的,如等于(==),设计者通常会选择将其定义为命名空间成员,以提高灵活性。例如,下面的字符串相等运算符重载示例:
```cpp
bool operator==(const String& str1, const String& str2) {
if (str1.size() != str2.size())
return false;
return strcmp(str1.c_str(), str2.c_str()) ? false : true;
}
```
重载操作符仅限于C++预定义的操作符集合,如表15.1所示,包括算术运算符、比较运算符、逻辑运算符等。编译器不允许设计者自定义那些未列出的操作符,如`operator**`用于指数运算,尝试这样定义会引发编译错误。
此外,虽然像`::.*.?:`这样的内置操作符不能被重载,但它们的预定义行为是固定的,例如,整型加法操作符`+`的含义不能被修改。对于内置类型的操作符,保持其固有功能至关重要。
C++ Primer系列书籍,由Stanley B. Lippman和Josée Lajoie撰写,是C++领域的权威参考。书中指出,尽管C++语言历史悠久且复杂,但自1998年ISO完成标准化以来,它变得更加成熟且标准化。本书不仅提供了丰富的资源,还纠正了作者以往对C++的一些误解,强调了C++不仅是传统语言,更是遵循标准的现代编程语言。两位作者的丰富经验和专业知识使得本书成为理解和学习C++的绝佳资源。