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

需积分: 49 1 下载量 137 浏览量 更新于2024-07-14 收藏 80KB PPT 举报
本文将深入探讨C++中的运算符重载,这是实现多态性的一种重要方式。多态性是面向对象编程的三大特性之一,它允许相同的消息在不同类型的对象上产生不同的行为。C++提供了两种多态性:编译时多态性和运行时多态性。 编译时多态性主要体现在函数重载和运算符重载。函数重载允许我们创建同名但参数列表不同的函数,编译器会根据传入参数的类型和数量选择合适的函数进行调用。运算符重载则允许我们为特定的类定制运算符的行为,使得类的对象可以像基本数据类型一样进行操作。运算符重载通常通过定义类的成员函数或友元函数来实现。 成员函数重载运算符时,通常用于单目运算符,如前置自增、后置自增等。这样的运算符重载函数可以访问类的私有和保护成员,更便于操作对象的状态。例如,对于时间类`CTime`,我们可以定义一个成员函数`operator+`来实现时间的累加: ```cpp CTime CTime::operator+(int s) { int x; x = hours * 3600 + minutes * 60 + seconds; x += s; hours = x / 3600; minutes = (x - hours * 3600) / 60; seconds = x - hours * 3600 - minutes * 60; return *this; // 返回更新后的时间对象 } ``` 友元函数通常用于双目运算符,例如加法、减法等,因为它需要访问两个操作数。这样可以确保对两边对象的操作都具有适当的访问权限。比如,我们为复数类`CComplex`定义一个友元函数`operator+`: ```cpp class CComplex { private: double real, image; public: CComplex(double r = 0.0, double i = 0.0) : real(r), image(i) {} CComplex& operator+=(const CComplex& r_c) { // 成员函数重载 real += r_c.real; image += r_c.image; return *this; } friend CComplex operator+(const CComplex& c1, const CComplex& c2); // 友元函数重载 }; CComplex operator+(const CComplex& c1, const CComplex& c2) { return CComplex(c1.real + c2.real, c1.image + c2.image); } ``` 运行时多态性主要依赖于类的继承和虚函数。当基类指针或引用指向派生类对象时,通过虚函数可以调用派生类的实现,实现动态绑定。这对于设计通用的算法和接口非常有用。例如,我们可以定义一个基类`Base`和派生类`Derived`,并声明一个虚函数`doSomething()`: ```cpp class Base { public: virtual void doSomething() = 0; // 虚函数声明 }; class Derived : public Base { public: void doSomething() override { /* 实现 */ } }; ``` 总结来说,C++中的运算符重载是实现编译时多态性的一种手段,它可以为类对象提供自然且直观的操作方式。同时,结合类的继承和虚函数,我们可以构建出强大的运行时多态系统,从而实现灵活的代码设计和复用。