C++运算符重载:成员函数与友元函数实现
需积分: 49 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++中的运算符重载是实现编译时多态性的一种手段,它可以为类对象提供自然且直观的操作方式。同时,结合类的继承和虚函数,我们可以构建出强大的运行时多态系统,从而实现灵活的代码设计和复用。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2015-01-05 上传
2023-05-23 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
西住流军神
- 粉丝: 31
- 资源: 2万+
最新资源
- 深入浅出:自定义 Grunt 任务的实践指南
- 网络物理突变工具的多点路径规划实现与分析
- multifeed: 实现多作者间的超核心共享与同步技术
- C++商品交易系统实习项目详细要求
- macOS系统Python模块whl包安装教程
- 掌握fullstackJS:构建React框架与快速开发应用
- React-Purify: 实现React组件纯净方法的工具介绍
- deck.js:构建现代HTML演示的JavaScript库
- nunn:现代C++17实现的机器学习库开源项目
- Python安装包 Acquisition-4.12-cp35-cp35m-win_amd64.whl.zip 使用说明
- Amaranthus-tuberculatus基因组分析脚本集
- Ubuntu 12.04下Realtek RTL8821AE驱动的向后移植指南
- 掌握Jest环境下的最新jsdom功能
- CAGI Toolkit:开源Asterisk PBX的AGI应用开发
- MyDropDemo: 体验QGraphicsView的拖放功能
- 远程FPGA平台上的Quartus II17.1 LCD色块闪烁现象解析