目錄
四則運算符重載
左移運算符重載
遞增運算符重載
賦值運算符重載
關系運算符重載
函數調用運算符重載
對已有的運算符重新進行定義,賦予其另一種功能,以適應不同的數據類型
四則運算符重載
??????? 對自定義數據類型實現四則運算(加減乘除)操作,比如:自己寫成員函數,實現兩個對象相加屬性后返回新的對象
??????? 注意:四則運算符重載也可以進行函數重載。
??????? 總結:
??????? 1.對于內置的數據類型的表達式的的運算符是不可以改變的
??????? 2.不要濫用運算符重載
#include <iostream>using namespace std;class Person
{
public:int m_a;int m_b;Person(int a, int b) :m_a(a), m_b(b){}//成員函數重載Person operator+(const Person &p){Person rp(0, 0);rp.m_a = this->m_a + p.m_a;rp.m_b = this->m_b + p.m_b;return rp;}
};
//全局函數重載
static Person operator-(const Person& p1, const Person& p2)
{Person rp(0, 0);rp.m_a = p1.m_a - p2.m_a;rp.m_b = p1.m_b - p2.m_b;return rp;
}
//函數重載
static Person operator-(const Person& p1, const int value)
{Person rp(0, 0);rp.m_a = p1.m_a - value;rp.m_b = p1.m_b - value;return rp;
}int main(void)
{Person p1(10, 10);Person p2(10, 10);Person p3(5, 5);Person p4 = p1 + p2; //Person p4 = p1.operator+(p2);cout << "p4 m_a value:" << p4.m_a << endl;cout << "p4 m_b value:" << p4.m_b << endl;Person p5 = p4 - p3; //Person p5 = operator-(p4,p3)cout << "p5 m_a value:" << p5.m_a << endl;cout << "p5 m_b value:" << p5.m_b << endl;Person p6 = p5 - 5; //Person p6 = operator-(p5,5)cout << "p6 m_a value:" << p6.m_a << endl;cout << "p6 m_b value:" << p6.m_b << endl;system("pause");return 0;
}
左移運算符重載
??????? 輸出自定義的數據類型,比如:直接輸出一個對象就可以輸出其成員屬性
??????? 總結:左移運算符配合友元可以實現輸出自定義數據類型
#include <iostream>
#include <string>using namespace std;class Person
{friend static ostream& operator<<(ostream& cout, Person& p);
public:Person(int a, int b){m_a = a;m_b = b;}
private://通常不使用 成員函數重載 左移運算符 ,無法實現cout在左側int m_a;int m_b;
};static ostream& operator<<(ostream &cout, Person& p) // operator<<(cout, p)
{cout << "m_a=" << p.m_a << endl;cout << "m_b=" << p.m_b << endl;return cout;
}static void test(void)
{Person p(10, 10);cout << p << endl;
}int main(void)
{test();system("pause");return 0;
}
遞增運算符重載
??????? 區分前置和后置的差別!!
#include <iostream>
#include <string>using namespace std;class MyInteger
{friend static ostream& operator<<(ostream& cout, MyInteger p);
public:MyInteger(int b){m_b = b;}//重載 后置,int 占位參數 int ,區分前置和后置MyInteger operator++(int){MyInteger temp = *this;++*this;return temp;}//重載 前置MyInteger& operator++() //返回引用是為了一直對一個數據進行操作{++m_b;return *this;}
private:int m_b;
};static ostream& operator<<(ostream& cout, MyInteger p) // operator<<(cout, p)
{cout << p.m_b;return cout;
}static void test(void)
{MyInteger p(0);cout << ++p << endl;cout << p << endl;
}static void test1(void)
{MyInteger p1(0);cout << p1++ << endl;cout << p1 << endl;
}int main(void)
{test();test1();system("pause");return 0;
}
賦值運算符重載
???????? c++至少給一個類添加4個函數:前三個略
????????4.賦值運算符operator=,對屬性進行值拷貝(注意深淺拷貝問題)
#include <iostream>
#include <string>using namespace std;class Person
{
public:Person(int b){m_age = new int(b);}~Person(){if (m_age != NULL){delete m_age;m_age = NULL;}}Person& operator=(const Person & p) //重載賦值運算符,使用深拷貝{if (m_age != NULL){delete m_age;m_age = NULL;}m_age = new int(*p.m_age);return *this;}int *m_age;
};static void test1(void)
{Person p1(12);Person p2(19);Person p3(14);p3 = p2 = p1;cout << "p1年齡為:" << *p1.m_age << endl;cout << "p2年齡為:" << *p2.m_age << endl;cout << "p3年齡為:" << *p3.m_age << endl;
}int main(void)
{test1();system("pause");return 0;
}
關系運算符重載
??????? 重載關系運算符,讓兩個自定義的數據類型進行對比操作
#include <iostream>
#include <string>using namespace std;class Person
{
public:Person(string name, int age){m_name = name;m_Age = age;}bool operator==(Person& p){if (this->m_name == p.m_name && this->m_Age == p.m_Age){return true;}else {return false;}}string m_name;int m_Age;
};static void test1(void)
{Person p1("Tom", 19);Person p2("Mac", 19);if (p1 == p2){cout << "p1 == p2" << endl;}else{cout << "p1 != p2" << endl;}}int main(void)
{test1();system("pause");return 0;
}
函數調用運算符重載
- 函數調用運算符() 也可以重載
- 由于重載后使用的方式非常像函數的調用,故稱仿函數
- 仿函數沒有固定寫法,非常靈活(返回值、參數均不固定)
#include <iostream>
#include <string>using namespace std;class Myprint
{
public:void operator()(string test){cout << test << endl;}
};class MyAdd
{
public:int operator()(int a, int b){return a + b;}
};static void test1(void)
{Myprint myprint;myprint("Hello World!");//仿函數MyAdd myadd;int result = myadd(1, 1);cout << "result = " << result << endl;//匿名函數對象cout << "result = " << MyAdd()(11, 11) << endl;
}int main(void)
{test1();system("pause");return 0;
}
推薦:[C++核心編程](五):類和對象——友元(friend)