第五次做業--運算符重載與虛函數

運算符重載和虛函數

運算符重載

  • 定義:對已有的運算符賦予多重含義,使同一個運算符做用於不一樣類型的數據時致使不一樣行爲,其實質就是函數重載
    ios

  • 規則:

    (1)C++中的運算符除了少數幾個以外,所有能夠重載,並且只能重載C++中已經有的運算符(不能重載的運算符:成員訪問符 "." 、成員指針運算符". *" 、做用域分辨符"::" 、三目運算符"?:")

    (2)重載以後運算符的優先級和結合性不會改變

    (3)運算符的重載是因爲對新的數據類型有需求,因此對原有運算符進行改造,因此重載功能應與原有功能類似,不能改變原有運算符的操做對象個數,同時至少要有一個操做對象是自定義類型

    函數

  • 語法:

    測試

  • 注意:
    this

(1)當以非成員函數進行重載時,有時須要訪問運算符所涉及的私有成員,這是能夠把該函數聲明爲類的友元函數
spa

(2)當運算符重載爲類的成員函數時,函數參數個數要比原來的參數少一個(後置"++" "--"除外);爲非成員函數時,參數與原有的相同

3d

(3)前置「++」 「--」和後置「++」 「--」:成員函數形參:沒有形參;非成員函數:重載函數有一個int類型

指針

  • 程序

以雙目運算符重載,實現Counter類的相加和整數與類相加(成員函數)、相減(非成員函數)
code

#include<iostream>
#include<Windows.h>

using namespace std;

class Counter;
class Counter
{
public:
    Counter(int data=0) :data(data) {};
    Counter operator +(Counter &p);//一個參數,另一個參數爲this所指的對象
    Counter operator +(int);
    friend Counter operator -(Counter &p, const int a);//兩個參數,保持不變
    inline void Show() const;
private:
    int data;
};

//類與類相加,Counter 自定義類型
Counter Counter::operator+(Counter &p)
{
    data = data + p.data;
    return (*this);
}
Counter Counter::operator+(int a)
{
    data = data + a;
    return (*this);
}
void Counter::Show() const
{
    cout<< data << endl;
}
Counter operator - (Counter &p, const int a)
{
    Counter pt;
    pt.data = p.data - a;
    return a;
}

int main()
{
    Counter c1(5);
    Counter c2;
    Counter c3;

    cout << "The Origin Of c1:";
    c1.Show();

    cout << "The Origin Of c2:";
    c2.Show();

    c1 + 5;
    cout << "c1=c1+5=";
    c1.Show();

    c3=c1 - 5;
    cout << "c1-5=";
    c3.Show();

    c2 + c1;
    cout << "c2=c2+c1=";
    c2.Show();

    system("pause");
    return 0;
}

運行結果對象

單目運算符重載,實現Point類的前置"++"、後置"++"、前置"--"、後置"--",運用引用,節省內存,不用再建立一個對象,進行保存
blog

#include<iostream>
#include<Windows.h>

using namespace std;

class Point
{
public:
    Point(double x = 0, double y = 0) :x(x), y(y) {};
    Point & operator ++();
    Point &operator ++( const int);
    Point & operator --();
    Point &operator --(const int);
    inline void Show() const;
private:
    double x, y;
};
//功能:實現前置++
Point &Point::operator++()
{
    ++x;
    ++y;
    return *this;
}

//功能:實現後置++
Point& Point::operator++(const int)
{
    Point old(*this);
    ++(*this);
    return old;
}

//功能:實現前置--
Point & Point::operator--()//引用用於返回一個地址,就不用在多建立對象,消耗內存
{
    --x;
    --y;
    return *this;
}

//功能:實現後置--
Point &Point::operator--(const int)
{
    Point old = (*this);
    --(*this);
    return old;
}

//功能:顯示點的座標
inline void Point::Show() const
{
    cout << "(" << x << "," << y << ")" << endl;
}
int main()
{
    //測試前置++和後置--
    Point p1(3, 4);
    Point p2;

    cout << "The Origin Of P1 :";
    p1.Show();

    //p1前置++
    ++p1;
    cout << "++P1 =";
    p1.Show();

    //p1後置++
    p2 = p1++;
    cout << "P2=P1++ =";
    p2.Show();
    cout << "P1++ =";
    p1.Show();

    //測試前置--和後置--
    Point p3(8, 9);
    Point p4;

    cout << "The Origin Of P3 :";
    p3.Show();

    //p3前置++
    --p3;
    cout << "--P3 =";
    p3.Show();

    //p3後置--
    p4 = p3--;
    cout << "P4=P3-- =";
    p4.Show();
    cout << "P3-- =";
    p3.Show();

    system("pause");
    return 0;
}

運行結果

虛函數和抽象類

虛函數能夠用於實現多態,而多態的條件有3:(1)知足兼容規則(2)要聲明虛函數(3)成員函數的調用經過指針、引用訪問

  • 通常虛函數

    (1)語法:virtual 函數類型 函數名(形參表)

    (2)注意:函數聲明只能在類的定義中的函數原型聲明中,不能在成員函數實現時

    (3)虛函數通常不聲明成內聯函數,由於對虛函數調用是須要動態綁定,而內聯函數的處理爲靜態,因此通常不將虛函數聲明成內聯函數

  • 純虛函數

    (1)語法:virtual 函數類型 函數名(形參表)=0

    (2)定義爲純虛函數後在基類能夠不給出函數的實現部分,由派生類給出不一樣的函數實現,從而實現多態

  • 抽象類

    (1)具備純虛函數的類叫抽象類

(2)抽象類不能實例化,即不能生成對象

  • 程序

    以Shape(抽象類)做爲基類,派生出_Rectangle和Circle類,使用指針進行對象的訪問

頭文件定義

class Shape//抽象類Shape
{
public:
    virtual double getArea() const=0;
    virtual double getPerim() const=0;
};

class _Rectangle :public Shape
{
public:
    _Rectangle(float length, float width) :length(length), width(width) {};
    double getArea() const;
    double getPerim() const;
    inline void Show() const;
private:
    float length;
    float width;
};

class Circle :public Shape
{
public:
    Circle(float Radius) :Radius(Radius) {};
    double getArea() const;
    double getPerim() const;
    inline void Show() const;
private:
    double Radius;
};

頭文件實現和main函數實現

#include<iostream>
#include<Windows.h>
#include<cstdlib>
#include"8-6.h"

constexpr auto PI  = 3.1415926;

using namespace std;

double _Rectangle::getArea() const
{
    return (length * width);
}

double _Rectangle::getPerim() const
{
    return (2 * length + 2 * width);
}

inline void _Rectangle::Show() const
{
    cout << "The Area Of Rectangle :" << getArea() << endl;
    cout << "The Perim Of Rectangle :" << getPerim() << endl;
}

double Circle::getArea() const
{
    return (Radius *Radius *PI);
}
double Circle::getPerim() const
{
    return (2 * Radius*PI);
}
inline void Circle::Show() const
{
    cout << "The Area Of Circle : " << getArea() << endl;
    cout << "The Perim Of Circle : " << getPerim() << endl;
}
void fun(Shape *ptr)
{
    ptr->getArea();
    ptr->getPerim();
}
int main()
{
    //測試:Shape不能實例化
    //Shape p;

    _Rectangle s(3, 4);

    //經過對象操做
    /*s.getArea();
    s.getPerim();*/

    //經過指針操做,運用虛函數,使指針指向對所引用的對象
    fun(&s);
    s.Show();

    Circle c(3);

    /*c.getArea();
    c.getPerim();*/

    fun(&c);
    c.Show();
    system("pause");
    return 0;
}

運行結果

相關文章
相關標籤/搜索