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

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

復制構造函數

2019-11-11 03:11:04
字體:
來源:轉載
供稿:網友

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)的對象,則必須返回一個指向這種對象的引用。最后,有些方法和函數(如重載的賦值運算符)可以返回對象,也可以返回指向對象的引用,在這種情況下,應首選引用,因為其不會調用復制構造函數,效率更高。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 惠安县| 洪湖市| 安顺市| 如东县| 农安县| 泊头市| 岚皋县| 东兴市| 阿坝县| 台山市| 龙山县| 桃园市| 方城县| 吉木乃县| 开江县| 荣成市| 湟中县| 常熟市| 万年县| 云南省| 沁阳市| 新乐市| 轮台县| 同心县| 枞阳县| 柳河县| 蒙山县| 弥渡县| 贵溪市| 奉新县| 溆浦县| 株洲市| 武鸣县| 巨野县| 辽阳市| 东乡县| 宜城市| 永州市| 钦州市| 龙游县| 东丰县|