C++教程:运算符与函数重载

需积分: 32 0 下载量 126 浏览量 更新于2024-07-14 收藏 1.27MB PPT 举报
"C++教程关于单目运算符重载、多态性和函数重载的讲解" 在C++编程语言中,运算符重载是实现多态性的一种方式,特别是对于单目运算符(如`++`,`--`等)。在重载单目运算符时,通常会使用友元函数,因为这些运算符需要访问类的私有或保护成员。友元函数是非成员函数,但被授予了访问类内部数据的能力,因此它们可以适当地修改对象的状态。例如,如果你有一个名为`MyClass`的类,并且想要重载`++`运算符,你可以定义一个友元函数如下: ```cpp class MyClass { private: int value; public: MyClass(int v): value(v) {} friend MyClass operator++(MyClass& obj); // 前置增量运算符 }; MyClass operator++(MyClass& obj) { obj.value++; return obj; } ``` 上述代码中,`operator++`是友元函数,它接收一个`MyClass`对象的引用作为参数,并递增该对象的`value`值。返回的是递增后的对象,使得可以支持连续递增(如`obj++; ++obj;`)。 多态性是面向对象编程的一个关键特性,它允许不同类型的对象对相同的消息作出不同的响应。在C++中,多态性分为两种类型:编译时多态性和运行时多态性。 编译时多态性主要通过函数重载和运算符重载来实现。函数重载指的是在同一个作用域内,可以定义多个同名函数,但这些函数的参数列表必须不同(参数个数、类型或顺序)。例如: ```cpp void print(int num) { cout << "打印整数:" << num << endl; } void print(double num) { cout << "打印浮点数:" << num << endl; } ``` 在这个例子中,`print`函数被重载了两次,分别处理整数和浮点数。 运行时多态性主要依赖于虚函数。当基类指针或引用来调用虚函数时,实际执行哪个派生类的函数会在运行时决定,这被称为动态联编。为了实现运行时多态性,基类必须声明至少一个虚函数,这样编译器就能知道如何在运行时找到正确的函数来执行。例如: ```cpp class Shape { public: virtual void draw() = 0; // 纯虚函数 }; class Circle : public Shape { public: void draw() override { cout << "绘制圆形" << endl; } }; class Rectangle : public Shape { public: void draw() override { cout << "绘制矩形" << endl; } }; Shape* shapes[] = { new Circle(), new Rectangle() }; for (Shape* shape : shapes) { shape->draw(); // 运行时多态性 } ``` 在这个例子中,`Shape`是基类,`Circle`和`Rectangle`是派生类,都重写了`draw`虚函数。通过基类指针的数组,我们可以调用每个对象的`draw`方法,而无需知道具体的形状类型,这就是运行时多态性的体现。 总结来说,C++中的单目运算符重载是通过友元函数实现的,它可以为类的实例提供自定义的行为。多态性则是通过函数重载、运算符重载以及虚函数来实现的,它允许程序在不同的上下文中灵活地处理不同类型的对象。编译时多态性基于函数签名的差异,而运行时多态性则依赖于虚函数机制。理解和熟练运用这些概念是掌握C++面向对象编程的关键。