C++运算符重载:成员函数与友元函数实现
需积分: 49 140 浏览量
更新于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++中的运算符重载是实现编译时多态性的一种手段,它可以为类对象提供自然且直观的操作方式。同时,结合类的继承和虚函数,我们可以构建出强大的运行时多态系统,从而实现灵活的代码设计和复用。
2014-06-20 上传
2022-06-12 上传
2015-01-05 上传
2023-05-23 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情