定義:對已有的運算符賦予多重含義,使同一個運算符做用於不一樣類型的數據時致使不一樣行爲,其實質就是函數重載
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)抽象類不能實例化,即不能生成對象
頭文件定義
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; }
運行結果