C++中的友元函数与重载运算符解析

需积分: 35 0 下载量 38 浏览量 更新于2024-08-24 收藏 1.05MB PPT 举报
"这篇资料主要讨论了C++中的重载运算符与一般函数之间的比较,以及友元函数的概念和特点。" 在C++编程中,重载运算符和一般函数都是实现特定功能的重要手段,但它们之间存在一些差异。首先,重载运算符和一般函数都可以是类的成员,用于实现类的某些特定行为。例如,`AddA` 是一个一般函数,而 `operator +` 是重载的加法运算符。两者都能完成数值的相加操作。 对于重载的运算符,如 `operator +`,它的调用方式与普通函数不同。在示例中,`a3 = a1 + a2;` 使用了重载的加法运算符,运算符的左操作数 `a1` 实际上调用了这个运算符。而 `AddA` 函数则需要通过对象名和参数来调用,如 `a3.AddA(a1, a2);`。这展示了重载运算符在语法上的便捷性。 返回值方面,`AddA` 函数没有返回值,而是直接修改了 `a3` 的成员 `i`。而重载的 `operator +` 创建了一个新的对象 `t`,并将结果存储在其中,然后返回这个新对象。这种差异体现了运算符重载通常会保持原操作数不变,返回一个新的对象以保持“不可变”原则。 接下来,资料介绍了友元函数的概念。友元函数是一种特殊类型的函数,它能访问类的私有和保护成员,打破了封装性。在类定义中声明 `friend` 关键字后,友元函数可以自由地访问类的所有数据。例如,`class A` 中的 `friend float Sum(A&)` 就是一个友元函数,它可以直接访问 `A` 类的私有成员 `x` 和 `y`。 友元函数不是类的成员函数,所以它没有 `this` 指针,必须通过对象名或对象引用作为参数来访问成员。在示例中,`Sum(t2)` 是通过对象 `t2` 来调用友元函数 `Sum` 的,而友元函数可以直接操作对象的私有数据。 友元函数的使用需要注意以下几点: 1. 友元函数必须在类的定义中声明,但它可以在类内或类外定义函数体。 2. 它可以访问类的所有成员,包括私有和保护成员,而一般函数只能访问公有成员。 最后,示例中展示了两种不同的 `Sum` 函数,一个为友元函数,另一个为非友元函数。友元函数 `Sum(A&)` 直接访问了对象的私有成员 `x` 和 `y`,而非友元函数 `Sumxy(A&a)` 则通过公共接口 `Getx()` 和 `Gety()` 访问成员。 总结来说,C++ 中的重载运算符提供了一种更加自然和直观的方式来表达操作,而友元函数则提供了对私有和保护成员的访问途径,虽然这可能会影响类的封装性,但在某些情况下,友元函数是必要的设计选择。理解并熟练运用这些概念对于编写高效且易于维护的C++代码至关重要。