欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
C++ 中重載 + 操作符的正確方法

C++ 中重載 + 操作符的正確方法

作者:Danny Kalev
編譯:MTT 工作室

原文出處:Overloading Operator + the Right Way

摘要:本文概要性地介紹如何選擇正確的策略來(lái)為用戶(hù)定義類(lèi)型重載 + 操作符。


  用戶(hù)定義的類(lèi)型,如:字符串,日期,復數,聯(lián)合體以及文件常常重載二元 + 操作符以實(shí)現對象的連接,附加或合并機制。但是要正確實(shí)現 + 操作符會(huì )給設計,實(shí)現和性能帶來(lái)一定的挑戰。本文將概要性地介紹如何選擇正確的策略來(lái)為用戶(hù)定義類(lèi)型重載這個(gè)操作符。
考慮如下的表達式:
int x=4+2;

  內建的 + 操作符有兩個(gè)類(lèi)型相同的操作數,相加并返回右值 6,然后被賦值給 x。我們可以斷定內建的 + 是一個(gè)二元的,對稱(chēng)的,可交換的操作符。它產(chǎn)生的結果的類(lèi)型與其操作數類(lèi)型相同。按照這個(gè)規測,當你為某個(gè)用戶(hù)定義類(lèi)型重載操作符時(shí),也應該遵循相應內建操作符的特征。
  為用戶(hù)定義類(lèi)型重載 + 操作符是很常見(jiàn)的編程任務(wù)。盡管 C++ 提供了幾種實(shí)現方法,但是它們容易使人產(chǎn)生設計上的誤解,這種誤解常常影響代碼的正確性,性能以及與標準庫組件之間的兼容性。

下面我們就來(lái)分析內建操作符的特征并嘗試模仿其相應的重載機制。

第一步:在成員函數和非成員函數之間選擇
你可以用類(lèi)成員函數的方式實(shí)現二元操作符如:+、- 以及 ==,例如:

class String{public:       bool operator==(const String & s); // 比較 *this 和 s}; 

  這個(gè)方法是有問(wèn)題的。相對于其內建的操作符來(lái)說(shuō),重載的操作符在這里不具有對稱(chēng)性;它的兩個(gè)參數一個(gè)類(lèi)型為:const String * const(這個(gè)參數是隱含的),另一個(gè)類(lèi)型為:const String &。因此,一些 STL 算法和容器將無(wú)法正確處理這樣的對象。
  另外一個(gè)可選方法是把重載操作符 + 定義為一個(gè)外部(extern)函數,該函數帶兩個(gè)類(lèi)型相同的參數:

String operator + (const String & s1, const String s2);

這樣一來(lái),類(lèi) String 必須將該重載操作符聲明為友元:

class String{public:       friend String operator+(const String& s1,const String&s2);};

第二步:返回值的兩難選擇
  如前所述,內建操作符 + 返回右值,其類(lèi)型與操作數相同。但是在調用者堆棧里返回一個(gè)對象效率很低,處理大型對象時(shí)尤其如此。那么能不能返回一個(gè)指針或引用呢?答案是不行。因為返回指針破壞參數類(lèi)型與返回值類(lèi)型應該相同的規則。更糟的是,鏈接多個(gè)表達式將成為不可能:

String s1,s2,s3;String res;res=s1+s2+s3; // 不可能用 String* 作為返回值

  雖然有一個(gè)辦法可以定義額外的 + 操作符重載版本,但這個(gè)辦法是我們不希望用的,因為返回的指針必須指向動(dòng)態(tài)分配的對象。這樣的話(huà),如果調用者釋放(delete)返回的指針失敗,那么將導致內存泄漏。顯然,返回 String* 不是一個(gè)好主意。
  那么返回 String& 好不好呢?返回的引用必須一定要是一個(gè)有效的 String。它避免了使用動(dòng)態(tài)對象分配,該方法返回的是一個(gè)本地靜態(tài)對象的引用。靜態(tài)對象確實(shí)解決了內存泄漏問(wèn)題,但這個(gè)方法的可行性仍然值得懷疑。在一個(gè)多線(xiàn)程應用中,兩個(gè)線(xiàn)程可能會(huì )并發(fā)調用 + 操作符,因此造成 String 對象的混亂。而且,因為靜態(tài)對象總是保留其調用前的狀態(tài),所以有必要針對每次 + 操作符的調用都清除該靜態(tài) String 對象。由此看來(lái),在堆棧上返回結果仍然是最安全和最簡(jiǎn)單的解決方案。

 作者簡(jiǎn)介
  Danny Kalev 是一名通過(guò)認證的系統分析師和軟件工程師,專(zhuān)攻 C++ 和形式語(yǔ)言理論。1997 年到 2000 年期間,他是 C++ 標準委員會(huì )成員。最近他以?xún)?yōu)異成績(jì)完成了他在普通語(yǔ)言學(xué)研究方面的碩士論文。 業(yè)余時(shí)間他喜歡聽(tīng)古典音樂(lè ),閱讀維多利亞時(shí)期的文學(xué)作品,研究 Hittite、Basque 和 Irish Gaelic 這樣的自然語(yǔ)言。其它興趣包括考古和地理。Danny 時(shí)常到一些 C++ 論壇并定期為不同的 C++ 網(wǎng)站和雜志撰寫(xiě)文章。他還在教育機構講授程序設計語(yǔ)言和應用語(yǔ)言課程。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
操作符重載
操作符重載!看這篇就夠了!
C++中流操作符的重載
C++ operator關(guān)鍵字(重載操作符)
C++_指針懸掛和賦值操作符的重載
C++ Primer第六章函數
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久