国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

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

2019-11-17 05:05:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
用戶定義的類型,如:字符串,日期,復(fù)數(shù),聯(lián)合體以及文件經(jīng)常重載二元 + 操作符以實(shí)現(xiàn)對(duì)象的連接,附加或合并機(jī)制。但是要正確實(shí)現(xiàn) + 操作符會(huì)給設(shè)計(jì),實(shí)現(xiàn)和性能帶來(lái)一定的挑戰(zhàn)。本文將概要性地介紹如何選擇正確的策略來(lái)為用戶定義類型重載這個(gè)操作符。

考慮如下的表達(dá)式: int x=4+2;

  內(nèi)建的 + 操作符有兩個(gè)類型相同的操作數(shù),相加并返回右值 6,然后被賦值給 x。我們可以斷定內(nèi)建的 + 是一個(gè)二元的,對(duì)稱的,可交換的操作符。它產(chǎn)生的結(jié)果的類型與其操作數(shù)類型相同。按照這個(gè)規(guī)測(cè),當(dāng)你為某個(gè)用戶定義類型重載操作符時(shí),也應(yīng)該遵循相應(yīng)內(nèi)建操作符的特征。

  為用戶定義類型重載 + 操作符是很常見的編程任務(wù)。盡管 C++ 提供了幾種實(shí)現(xiàn)方法,但是它們輕易使人產(chǎn)生設(shè)計(jì)上的誤解,這種誤解經(jīng)常影響代碼的正確性,性能以及與標(biāo)準(zhǔn)庫(kù)組件之間的兼容性。
  下面我們就來(lái)分析內(nèi)建操作符的特征并嘗試模擬其相應(yīng)的重載機(jī)制。

  第一步:在成員函數(shù)和非成員函數(shù)之間選擇

  你可以用類成員函數(shù)的方式實(shí)現(xiàn)二元操作符如:+、- 以及 ==,例如:

class String
{
public:
bool Operator==(const String & s); // 比較 *this 和 s
};
  這個(gè)方法是有問題的。相對(duì)于其內(nèi)建的操作符來(lái)說,重載的操作符在這里不具有對(duì)稱性;它的兩個(gè)參數(shù)一個(gè)類型為:const String * const(這個(gè)參數(shù)是隱含的),另一個(gè)類型為:const String &。因此,一些 STL 算法和容器將無(wú)法正確處理這樣的對(duì)象。

  另外一個(gè)可選方法是把重載操作符 + 定義為一個(gè)外部(extern)函數(shù),該函數(shù)帶兩個(gè)類型相同的參數(shù):

String operator + (const String & s1, const String s2);
  這樣一來(lái),類 String 必須將該重載操作符聲明為友元:

class String
{
public:
friend String operator+(const String& s1,const String&s2);
};
  第二步:返回值的兩難選擇

  如前所述,內(nèi)建操作符 + 返回右值,其類型與操作數(shù)相同。但是在調(diào)用者堆棧里返回一個(gè)對(duì)象效率很低,處理大型對(duì)象時(shí)尤其如此。那么能不能返回一個(gè)指針或引用呢?答案是不行。因?yàn)榉祷刂羔樒茐膮?shù)類型與返回值類型應(yīng)該相同的規(guī)則。更糟的是,鏈接多個(gè)表達(dá)式將成為不可能:

String s1,s2,s3;
String res;
res=s1+s2+s3; // 不可能用 String* 作為返回值
  雖然有一個(gè)辦法可以定義額外的 + 操作符重載版本,但這個(gè)辦法是我們不希望用的,因?yàn)榉祷氐闹羔槺仨氈赶騽?dòng)態(tài)分配的對(duì)象。這樣的話,假如調(diào)用者釋放(delete)返回的指針失敗,那么將導(dǎo)致內(nèi)存泄漏。顯然,返回 String* 不是一個(gè)好主意。

  那么返回 String& 好不好呢?返回的引用必須一定要是一個(gè)有效的 String。它避免了使用動(dòng)態(tài)對(duì)象分配,該方法返回的是一個(gè)本地靜態(tài)對(duì)象的引用。靜態(tài)對(duì)象確實(shí)解決了內(nèi)存泄漏問題,但這個(gè)方法的可行性仍然值得懷疑。在一個(gè)多線程應(yīng)用中,兩個(gè)線程可能會(huì)并發(fā)調(diào)用 + 操作符,因此造成 String 對(duì)象的混亂。而且,因?yàn)殪o態(tài)對(duì)象總是保留其調(diào)用前的狀態(tài),所以有必要針對(duì)每次 + 操作符的調(diào)用都清除該靜態(tài) String 對(duì)象。由此看來(lái),在堆棧上返回結(jié)果仍然是最安全和最簡(jiǎn)單的解決方案。 更多文章 更多內(nèi)容請(qǐng)看C/C++技術(shù)專題  C/C++進(jìn)階技術(shù)文檔專題,或

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 临猗县| 太谷县| 九台市| 阳西县| 苗栗市| 潼关县| 博爱县| 安多县| 天峨县| 盈江县| 古蔺县| 翁牛特旗| 开鲁县| 万载县| 浦江县| 东安县| 黑龙江省| 汉中市| 平遥县| 苏尼特右旗| 班戈县| 阜城县| 吉安市| 辰溪县| 平江县| 格尔木市| 霍山县| 太谷县| 普格县| 阳曲县| 景洪市| 古蔺县| 永泰县| 长治市| 昌宁县| 汾阳市| 台安县| 邯郸市| 五寨县| 清水县| 马关县|