C++运算符重载为友元函数解析

需积分: 48 9 下载量 86 浏览量 更新于2024-08-23 收藏 8.66MB PPT 举报
"运算符重载为友元函数-C++程序设计(谭浩强完整版),涉及C++语言的发展历史,C语言的主要特点以及运算符重载的成员函数实现方式。" C++程序设计中,运算符重载是一项重要的特性,允许我们为已有的运算符赋予新的含义,以适应自定义数据类型的需求。运算符重载有两种方式:作为成员函数和作为友元函数。这里主要讨论将运算符重载为友元函数的情况。 在C++中,当运算符重载为成员函数时,通常由一个操作数的对象调用另一个操作数。例如,给定的代码示例展示了这种机制: ```cpp A a, b, c; c = a + b; // 实际上是 c = a.operator+(b); ``` 在这个例子中,`+` 运算符被重载为 `A` 类的一个成员函数,这样 `a` 对象就可以调用 `operator+` 来与 `b` 进行操作。同样,对于自增运算符 `++`,如果重载为成员函数: ```cpp c = ++a; // 实际上是 c = a.operator++(); ``` 这里,`a` 对象调用了 `operator++()` 函数,使得 `a` 的值增加。 对于复合赋值运算符如 `+=`,重载通常也是作为成员函数: ```cpp c += a; // 实际上是 c.operator+=(a); ``` 然而,有些情况可能需要将运算符重载为友元函数,特别是当操作数在类的内部无法访问或者需要对两个操作数进行平等处理时。友元函数不是类的成员,它可以访问类的私有和保护成员,从而能够处理类的对象。例如,当 `+` 运算符需要同时访问两个操作数时,可以这样重载: ```cpp class A { public: friend A operator+(const A& lhs, const A& rhs); // 重载为友元函数 }; A operator+(const A& a, const A& b) { // 处理 a 和 b 的加法逻辑 } ``` 这样的重载方式让两个操作数在函数内部拥有相同的地位,避免了只能从一个对象内部操作的限制。 C++的发展历程是基于其他编程语言的演进,尤其是从 BCPL、B 语言到 C 语言的演变。C 语言以其强大的结构化特性,丰富的运算符,良好的可移植性和高效的执行效率,成为了广泛应用的编程语言。C++ 在此基础上增加了面向对象的特性,比如类、继承、多态等,以及模板和异常处理等高级特性,进一步增强了其灵活性和实用性。 C 语言的主要特点包括: 1. 结构化编程:C 语言的结构化特性使得程序设计清晰、模块化,易于理解和维护。 2. 高级与低级特性结合:C 语言提供高级语言的抽象和低级语言的控制,适合编写系统级和应用程序。 3. 可移植性:C 语言编写的程序可以在不同的计算机系统上运行,只需少量或无需修改。 4. 语法自由度:C 语言的语法规则相对较宽松,给程序员提供了较大的设计自由度,但同时也增加了学习和调试的难度。 了解这些背景和特性有助于更好地理解C++中的运算符重载,特别是在选择使用成员函数还是友元函数进行重载时,可以根据具体需求和类的设计来决定。