麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

復制構造函數

2019-11-11 05:15:44
字體:
來源:轉載
供稿:網友

C++除了自動提供默認構造函數和析構函數,還有一種叫復制構造函數,用于將一個對象復制到新創建的對象中。它用于初始化過程中,而不是常規的賦值過程。原型通常如:

Classname ( const Classname & );

新建一個對象并初始化為同類現有對象時,復制構造函數都會被調用,如下4種聲明:

StringBad ditto(motto);

StringBad metoo = motto;

StringBad also = StringBad(motto);

StringBad * ps = new StringBad(motto);

由于按值傳遞對象將調用復制構造函數,應該按引用傳遞對象,節省調用時間和空間。

默認的復制構造函數將逐個復制非靜態成員(成員復制也稱為淺復制),復制的是成員的值。如果需要用到靜態成員,需要顯式定義一個復制構造函數。函數頭如:

StringBad::StringBad(const StringBad & s)

淺復制還有一個隱患,當成員包含指針,在調用了默認復制構造函數之后,會出現兩個指針指向同一個地址的情況。此時如果用delete釋放內存很容易不小心釋放兩次,此時將導致不確定的、可能有害的后果。解決辦法是定義一個顯式復制構造函數,進行深度復制!生成一個指向數據的副本,并將其地址賦給新的指針。

通常還需要看一看默認的賦值運算符。上面4種情況總是會調用復制構造函數,但使用=時也可能會調用賦值運算符(與具體實現有關,比如先用復制構造函數創建一個臨時對象,然后再通過賦值將臨時對象的值復制到新對象中。

賦值運算符原型:

Classname & Classname::Operator=(const Classname &);

同樣必須用深度復制解決值傳遞出現的問題。

補充:復制構造函數與返回對象的關系

一般而言,如果方法或函數要返回局部對象,則應返回對象,而不是指向對象的引用。在這種情況下,將使用復制構造函數來生成返回的對象。如果方法或函數要返回一個沒有公有復制構造函數的類(如ostream)的對象,則必須返回一個指向這種對象的引用。最后,有些方法和函數(如重載的賦值運算符)可以返回對象,也可以返回指向對象的引用,在這種情況下,應首選引用,因為其不會調用復制構造函數,效率更高。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产在线观看 | 免费观看一区二区三区视频 | 特级毛片a级毛片100免费 | 亚洲小视频 | 精品国产乱码久久久久久久久 | 久久久久久久久久久久99 | 免费视频一区 | 精品一区二区三区毛片 | 免费观看国产视频 | 永久免费av在线 | 国产高潮好爽好大受不了了 | 韩国精品久久久 | 国产色视频免费 | hdjapanesemassagehd日本| 在线播放av网址 | 91精选视频 | 中文字幕欧美一区二区三区 | 香蕉视频99 | 最近国产中文字幕 | 欧美性生活久久久 | 欧美韩国日本在线 | 成人羞羞在线观看网站 | 国产精品成人av片免费看最爱 | 在线视频观看一区二区 | 成人一区三区 | 97超视频在线观看 | 午夜视频久久久 | 国产精品久久久久久模特 | 久久精品女人天堂av | 黄色特级片黄色特级片 | 国产精品99久久久久久大便 | 欧美性受xxxx人人本视频 | 欧美成人福利 | 九九午夜| 亚洲小视频在线观看,com | 久久精品亚洲欧美日韩精品中文字幕 | 久久亚洲成人 | 久久吊 | 神马福利电影 | av电影在线观看网站 | 久久精品av |