【MyCpp_2.1】多态浅窥——运算符重载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Reflection_/article/details/78648841

多态

1.多态性(前言)

1.1简述

多态(Polymorphism)字面意思是“多种状态”,即一个接口有多种方法

引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
简而言之,父类的指针指向子类 的一系列操作。

1.2类型

面向对象的多态有4类:重载多态,强制多态,包含多态,参数多态
重载函数实现了重载多态,而运算符号的重载也是重载多态的一种。
强制多态是借由类型的强制转化变成符合要求的参数实现的多态。
包含多态不同类中,同名成员函数的多态实现,主要由虚函数实现。
而参数多态与类模板联系。

1.3绑定

从多态接口,或是说同名函数的调用处到该函数的实现的连接, 该确认的过程 绑定。
标识符(函数名)–>存储地址 联系起来
实现有两种:编译时 和 运行时
而编译时的绑定称为静态绑定,运算时的称为动态绑定。

2.运算符重载

重载是多态性的常用体现,而不光函数重载,还有运算符的重载。

要求:
只能对已有的运算符重载。
不改变符号优先级和结合性。
不改变操作数个数,且至少有一个是自定义类,最好也保持或是与符号原功能相似。
同时”.” , “::” , “? :” , “.*“不能重载。

返回类型 operator 运算符 (形参表)
{
    函数体
}
//成员函数和非成员函数相同结构

结构虽然相同,但成员函数会省略左边的操作数,默认为本类this,而非成员需要写全。

基于Point的列子

class Point
{
public:
    int x, y;
public:
    Point() {}
    Point(int x, int y) :x(x), y(y) {}
    Point(Point &p) :x(p.x), y(p.y) {}
    virtual ~Point() {}

    Point operator + (const Point &p)const //对Point重载+运算符实现加法
    {
        return Point(x + p.x, y + p.y);
    }

    Point operator - (const Point &p)const //对Point重载-运算符实现减法
    {
        return Point(x - p.x, y - p.y);
    }

    friend bool operator ==(const Point &p1, const Point &p2);//友元
非成员函数 重载‘==’

    Point & operator ++() { x++; y++; return *this; }//前置运算符++
    Point operator ++(int) { Point old = *this; ++*this; return old; }//后置运算符++


};

bool operator ==(const Point &p1, const Point &p2)////友元
非成员函数 重载‘==’
{
    return(p1.x == p2.x&&p1.y == p2.y);
}




//main.cpp

#include <iostream>
#include <stdio.h>
using namespace std;
/* 前置--,非成员函数的重载  */
Point operator -( Point &p)
{
    -p.x;
    -p.y;
    return p;
}
/* 后置--,非成员函数的重载  */
Point operator --(Point p, int)// 这里无形参名的“int”只是一个“符号”,标志着为后置的
{
    Point old = p;
    p.x--;
    p.y--;
    return old;
}

/*  +=的重载  */
Point operator +=(Point &p1, const Point &p2)
{
    p1 = p1 + p2;
    return p1;
}
/*<<的重载*/
ostream & operator <<(ostream &out, const Point &p)
{
    out << p.x << " , " << p.y;
    return out;
}
/*>>的重载*/
istream & operator >>(istream &in, Point &p )
{
    in >> p.x >> p.y;
    return in;
}

ps:注意函数中的const和&,const意义在于保护,而&在于提高效率意义,也符合函数参数或返回的逻辑,如:

Point & operator ++() { x++; y++; return *this; }//前置运算符++

成员函数的“–”前置运算符的重载,返回引用
特别的
这里无形参名的“int”只是一个“符号”,标志着为后置的,

Point operator --(Point p, int)// 这里无形参名的“int”只是一个“符号”,标志着为后置的
{
    Point old = p;
    p.x--;
    p.y--;
    return old;
}

猜你喜欢

转载自blog.csdn.net/Reflection_/article/details/78648841