<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在C++中基本資料型別例如整型,可以實現連續賦值:a=b=c;而我們的物件的成員屬性雖然可以相等,但是如果牽扯到堆地址,就會有深淺拷貝的問題存在。所以我們自己過載賦值運運算元,實現連等的方法。
class Info { int* m_a; public: Info() { m_a = NULL; } Info(int a) { m_a = new int(a); } ~Info() { if (m_a != NULL) delete m_a; m_a = NULL; } };
建立一個Info類,定義指標屬性*m_a, 然後自己定義Info類的無參、有參建構函式和解構函式,再給屬性賦值的時候,是用new關鍵字開闢堆區並存放資料;解構在前面的文章中講到了他的作用,就是在程式結束前編譯器自動呼叫解構來完成物件的清理工作,在這裡就會把堆區的資料釋放掉。
Info f(20); Info f1; Info f2; Info f3(30); f1 = f2 =f;
直接連等是不行的,因為在解構函式裡存取了一個NULL地址,就比如程式即將結束,f呼叫解構函式,刪除m_a指向的地址,然而f1也會呼叫解構函式,由於f1和f的m_a指向同一個地址,那就好重複存取,存取一個被刪除的地址肯定會報錯的;因此我們需要對賦值運運算元進行過載,這裡提示一下,連等就相當於鏈式呼叫,因此過載運運算元的返回值型別需要返回參照。
Info& operator=(Info& f) { if (m_a != NULL) delete m_a; m_a = NULL; m_a = new int(*f.m_a); return *this; }
返回值型別是類參照,這樣可以做到鏈式呼叫 ,函數名還是統一的operator+運運算元,既然是賦值運運算元就用operator=,然後這個過載發生在成員內部,因此引數裡只需要傳入用來賦值的物件即可,注意倒數第二行程式碼,我利用new讓m_a指向堆區中新開闢的地址,這是賦值運運算元過載的關鍵;就是因為把地址指向了堆區的新地址,這樣不同的物件在呼叫解構函式的時候各刪各的堆地址,不會存取空地址,這個問題的解決和深淺拷貝的解決方式一樣,都是自己寫方法來避免原來方法中成員屬性指向同一個地址。最後返回自身的參照,就可以實現連續呼叫了。
關係運算子有“大於”、“小於”、“等於”、“大於等於”、“不等於”等幾種情況,我就舉例等於和不等於兩種賦值運運算元過載的例子
class Info { friend void test1(); int* m_a; string m_name; public: Info() { m_a = NULL; } Info(int a,string name) { m_a = new int(a); m_name = name; } ~Info() { if (m_a != NULL) delete m_a; m_a = NULL; } }
這裡的類結構相比於賦值運運算元過載多了一個String型別的m_name屬性,然後寫出類的無參、有參構造和解構函式,最上面的friend關鍵字是加了一個友元的宣告,讓下面的test1函數可以存取類的私有屬性。
bool operator==(Info& f) { if (*this->m_a == *f.m_a && m_name==f.m_name) return true; else return false; } bool operator!=(Info& f) { if (*this->m_a == *f.m_a && m_name == f.m_name) return false; else return true; }
返回值型別寫成布林型別,因為關係運算的結果就是布林型別的,常和while迴圈以及if語句使用;函數名還是老樣子,operator==和operator!=,分別是相等和不等;既然是成員內部的關係運算子過載,那麼形參傳入一個待比較物件即可。
呼叫方法
void test1() { Info f1(20,"張三"); Info f3(30,"張六"); if (f1== f3) cout << "二者相等" << endl; else if (f1!= f3) cout << "二者不相等" << endl; }
執行效果
函數呼叫使用“()”,函數呼叫也是可以過載的,而且過載的呼叫很像直接呼叫函數,因此也叫做仿函數。
class MyHello { public: string hello; };
非常簡單的類結構,只有一個公有許可權下的String型別的hello屬性。
void operator()(string s) { cout << s << endl; }
因為只是列印一下,不需要返回值,函數名不多說了,和前面類似,然後傳入字串型別再方法裡列印出來。
呼叫方法
void test() { MyHello hello; hello("Hello World"); }
首先建立類物件hello,直接使用過載後的呼叫方法:物件+(字串);這樣就能列印出引號裡的內容了:
匿名物件呼叫
最後補充一個匿名物件的知識,範例:
class MyAdd { public: int operator()(int num1, int num2) { return num1 + num2; } }; void test1() { MyAdd myAdd; int num = myAdd(160, 40); cout << "ret =" << myAdd(160,40) << endl; cout << "ret =" << MyAdd()(100,50) << endl; }
這裡我寫了一個只有過載函數呼叫函數的類,並在test1中用常規和匿名物件呼叫過載後的函數呼叫方法;看一下執行效果:
先建立物件,再通過物件呼叫函數的方法我們不感到奇怪,但是最後一個輸出語句中,MyAdd()(100,50)是什麼意思呢 ,這就是匿名物件,往後我們遇到形如類名+()再+呼叫函數的方式,那就是建立了匿名物件,其特點就是建立完畢後就會刪除,這裡我們只都一下資料,所以適合匿名物件的呼叫。
到這裡C++的運運算元過載徹底結束了,運運算元過載可以多個都過載並互相配合使用,把物件的屬性可以和基本型別一樣進行算數運算和邏輯運算,在類物件比較多的時候可以節省很多時間,簡化程式。
以上就是詳解C++中賦值,關係,函數呼叫運運算元過載的實現的詳細內容,更多關於C++運運算元過載的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45