C/C++編程筆記:用C++編寫賦值運(yùn)算符,一般什么情況下用?
如果一個(gè)類不包含指針,則無需編寫賦值運(yùn)算符和復(fù)制構(gòu)造函數(shù)。編譯器為每個(gè)類創(chuàng)建一個(gè)默認(rèn)的復(fù)制構(gòu)造函數(shù)和賦值運(yùn)算符。當(dāng)我們擁有指針或文件句柄,網(wǎng)絡(luò)連接等資源的任何運(yùn)行時(shí)分配時(shí),編譯器創(chuàng)建的復(fù)制構(gòu)造函數(shù)和賦值運(yùn)算符可能不夠用。

例如,考慮以下程序。
以上程序的輸出為“ 10”。如果看一下main(),我們使用setValue()函數(shù)修改了“ t1”,但更改也反映在對(duì)象“ t2”中。這種類型的意外更改會(huì)引起問題。
由于上述程序中沒有用戶定義的賦值運(yùn)算符,因此編譯器將創(chuàng)建一個(gè)默認(rèn)的賦值運(yùn)算符,它將右側(cè)的“ ptr”復(fù)制到左側(cè)。因此,兩個(gè)“ ptr”都開始指向同一位置。
我們可以通過兩種方式解決上述問題。
1)不允許將一個(gè)對(duì)象分配給另一對(duì)象。我們可以創(chuàng)建自己的虛擬賦值運(yùn)算符并將其設(shè)為私有。
2)編寫自己的賦值運(yùn)算符,該運(yùn)算符進(jìn)行深度復(fù)制。
復(fù)制構(gòu)造函數(shù)也是如此。
以下是上述類的重載賦值運(yùn)算符的示例。
輸出:5
我們還應(yīng)該在上面的類中添加一個(gè)復(fù)制構(gòu)造函數(shù),以使諸如“ Test t3 = t4;”之類的語句成為可能。也不會(huì)造成任何問題。
注意賦值運(yùn)算符中的if條件。在重載賦值運(yùn)算符時(shí),我們必須檢查自我賦值。否則,分配對(duì)象本身可能會(huì)導(dǎo)致意想不到的結(jié)果。上面的“測(cè)試”類不需要進(jìn)行自賦值檢查,因?yàn)椤?ptr”始終指向一個(gè)整數(shù),因此我們可以重用相同的內(nèi)存。但通常,建議進(jìn)行自我分配檢查。
以上就是今天的全部內(nèi)容了。每日分享小知識(shí),希望對(duì)你有幫助~
另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~
微信公眾號(hào):C語言編程學(xué)習(xí)基地
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
