C++运算符重载:友元函数实现

需积分: 10 3 下载量 114 浏览量 更新于2024-08-19 收藏 1.74MB PPT 举报
"这篇文档介绍了如何在C++中使用友元函数进行运算符重载,以实现自定义类与标准输出流的交互。通过将`<<`运算符重载为友元函数,使得类对象可以像普通变量一样进行输出。" 在C++编程中,运算符重载是一种强大的特性,允许我们为自定义类赋予类似内置类型的操作。在这个例子中,`<<`运算符被重载为友元函数,以便于输出`Clock`类的对象。`Clock`类包含了一个`m_hour`和`m_minute`成员,表示小时和分钟,用于存储时间。重载`<<`运算符的目的是为了让`Clock`对象可以直接与`std::cout`进行流式输出。 友元函数在此场景下的作用在于它可以访问类的私有或保护成员,因此能够直接操作`Clock`对象的内部状态。以下是友元函数`operator<<`的定义: ```cpp friend ostream& operator<<(ostream& out, const Clock& clock); ``` 这个友元函数接受一个`ostream`引用(通常为`std::cout`)和一个`const Clock`引用作为参数。`out`参数用于输出,`clock`参数是我们要输出的`Clock`对象。函数内部,`out`被用来打印`clock`的小时和分钟,然后返回`out`的引用。返回`out`引用的原因是为了支持链式调用,例如`cout << c1 << "其它数据"`。 在`main`函数中,我们可以看到如何使用这个重载的运算符: ```cpp Clock c1; cout << c1; ``` 这行代码会调用`operator<<(cout, c1)`,并将`c1`的时间输出到控制台。 关于运算符重载的一些要点: 1. 只有C++中存在的运算符才能被重载,不能创造新的运算符。 2. 重载运算符不能改变其优先级和结合性。 3. 操作数个数不能变,但可以通过成员函数或友元函数调整参数列表。 4. 不能将运算符函数声明为类的静态成员,因为静态成员函数没有`this`指针。 5. 重载的运算符应保持其语义,遵循用户期望的行为。 此外,运算符重载有两种调用方式:显式和隐含。显式调用是直接通过函数名,而隐含调用是通过运算符语法。在上述例子中,`cout << c1`是隐含调用了`operator<<`。 通过运算符重载,我们可以让自定义类的行为更接近于内置类型,提升代码的可读性和易用性。在`Clock`类的例子中,使用友元函数重载`<<`运算符使得打印时间变得自然直观。