C++(五)——运算符重载
生活随笔
收集整理的這篇文章主要介紹了
C++(五)——运算符重载
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
加號運算符重載
#include<iostream> using namespace std;//對于內置數據類型,編譯器知道如何運算 //加號運算符重載 class Person { public:int m_a;int m_b;//成員函數實現加號運算符重載//Person operator+ (Person& p) {// Person temp;// temp.m_a = this->m_a + p.m_a;// temp.m_b = this->m_b + p.m_b;// return temp;//}}; //全局函數實現加號運算符重載 Person operator+ (Person& p1, Person& p2) {Person temp;temp.m_a = p1.m_a + p2.m_a;temp.m_b = p1.m_b + p2.m_b;return temp; } //函數重載 Person operator+ (Person& p1, int num) {Person temp;temp.m_a = p1.m_a + num;temp.m_b = p1.m_b + num;return temp; }void test01() {Person p1;Person p2;p1.m_a = 11;p1.m_b = 12;p2.m_a = 13;p2.m_b = 14;Person p3 = p1 + p2;cout << "p3.m_a = " << p3.m_a << endl;cout << "p3.m_b = " << p3.m_b << endl;p3 = p3 + 100;cout << "p3.m_a = " << p3.m_a << endl;cout << "p3.m_b = " << p3.m_b << endl;}int main() {test01();return 0; }左移運算符重載
#include<iostream> using namespace std; //左移運算符重載 class Person {friend ostream& operator<< (ostream& cout, Person& p);//友元 public:Person() {m_a = 0;m_b = 0;} private:int m_a;int m_b;//利用成員函數重載左移函數, 通常不會利用成員函數重載左移運算符/*void operator<<(Person& p) {}*/};ostream & operator<<(ostream &cout, Person &p) {cout << "m_a = " << p.m_a << " m_b = " << p.m_b;return cout; }void test01() {Person p;cout << p << endl; }int main() {test01();return 0; }遞增運算符重載
#include<iostream> using namespace std; class MyInteger {friend ostream& operator<<(ostream& out, MyInteger myint); public:MyInteger() {m_num = 0;}//重載前置++運算符 返回&是為了一直對一個數據進行操作MyInteger& operator++() {m_num++;//將自身作為返回return *this;}//重置后置++運算符 int代表占位參數 用于區(qū)分前置和后置遞增//不反回& 因為局部變量temp會被釋放MyInteger operator++(int) {//先記錄當時結果MyInteger temp = *this;//后遞增m_num++;//最后將記錄的結果進行返回,因為這是后置++return temp;}private:int m_num; }; //重載左移運算符 ostream& operator<<(ostream& out, MyInteger myint) {out << myint.m_num;return out; }void test01() {MyInteger myint;cout << ++myint;}void test02() {MyInteger myint;cout << (myint++)++ << endl;;cout << myint; }int main() {//test01();test02();return 0; }賦值運算符重載
#include<iostream> using namespace std; class Person { public:Person(int age) {m_age = new int(age);}~Person() {if (m_age != NULL) {delete(m_age);//防止成為野指針m_age = NULL;}}//重載賦值運算符Person& operator=(Person& p) {//編譯器提供的是淺拷貝//m_age = p.m_age//應該先釋放是否有屬性在堆區(qū),如果有先釋放,然后再深拷貝if (m_age != NULL) {delete m_age;m_age = NULL;}//深拷貝m_age = new int(*p.m_age);return *this;}int* m_age;}; void test01() {Person p1(18);Person p2(20);Person p3(30);p3 = p2 = p1;cout << "p1的年齡:"<< * p1.m_age << endl;cout << "p2的年齡:" << *p2.m_age << endl;cout << "p2的年齡:" << *p3.m_age << endl; } int main() {test01();return 0; }關系運算符重載
#include<iostream> #include<cstring> using namespace std; class Person { public:Person(string name, int age) {m_name = name;m_age = age;}//重載關系運算符int operator==(Person& p) {if (this->m_age == p.m_age && this->m_name == p.m_name)return 1;elsereturn 0;}bool operator!=(Person& p) {if (this->m_age == p.m_age && this->m_name == p.m_name)return false;return true;}string m_name;int m_age; }; void test01() {Person p1("tom", 18);Person p2("tom", 17);if (p1 == p2)cout << "p1和p2是相等的" << endl;elsecout << "p1和p2是不相等的" << endl;}void test02() {Person p1("tom", 18);Person p2("tom", 18);if (p1 != p2)cout << "p1和p2是不相等的" << endl;elsecout << "p1和p2是相等的" << endl;}int main() {test01();test02();return 0; }函數調用運算符重載
#include<iostream> #include<cstring> using namespace std; //函數調用運算符重載 //打印輸出類 class Myprint { public://重載函數調用運算符void operator() (string test) {cout << test << endl;}};void test01() {Myprint myprint;//由于使用起來非常像函數調用,所以也叫仿函數myprint("hello motherfucker");} //仿函數非常靈活,沒有固定的寫法 class Add { public:int operator()(int num1, int num2) {return num1 + num2;}};void test02() {Add myadd;int res = myadd(100, 111);cout << "sum = " << res << endl;//匿名函數對象cout << Add()(100, 100) << endl;}int main() {//test01();test02();return 0; }總結
以上是生活随笔為你收集整理的C++(五)——运算符重载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习(七)——tf.keras搭建神
- 下一篇: C++(六)——继承