亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

詳解C++ 拷貝構造函數和賦值運算符

2020-05-23 13:58:35
字體:
來源:轉載
供稿:網友

?本文主要介紹了拷貝構造函數和賦值運算符的區別,以及在什么時候調用拷貝構造函數、什么情況下調用賦值運算符。最后,簡單的分析了下深拷貝和淺拷貝的問題。

拷貝構造函數和賦值運算符

在默認情況下(用戶沒有定義,但是也沒有顯式的刪除),編譯器會自動的隱式生成一個拷貝構造函數和賦值運算符。但用戶可以使用delete來指定不生成拷貝構造函數和賦值運算符,這樣的對象就不能通過值傳遞,也不能進行賦值運算。

class Person{public: Person(const Person& p) = delete; Person& operator=(const Person& p) = delete;private: int age; string name;};

上面的定義的類Person顯式的刪除了拷貝構造函數和賦值運算符,在需要調用拷貝構造函數或者賦值運算符的地方,會提示_無法調用該函數,它是已刪除的函數_。

還有一點需要注意的是,拷貝構造函數必須以引用的方式傳遞參數。這是因為,在值傳遞的方式傳遞給一個函數的時候,會調用拷貝構造函數生成函數的實參。如果拷貝構造函數的參數仍然是以值的方式,就會無限循環的調用下去,直到函數的棧溢出。

何時調用

拷貝構造函數和賦值運算符的行為比較相似,都是將一個對象的值復制給另一個對象;但是其結果卻有些不同,拷貝構造函數使用傳入對象的值生成一個新的對象的實例,而賦值運算符是將對象的值復制給一個已經存在的實例。這種區別從兩者的名字也可以很輕易的分辨出來,拷貝構造函數也是一種構造函數,那么它的功能就是創建一個新的對象實例;賦值運算符是執行某種運算,將一個對象的值復制給另一個對象(已經存在的)。調用的是拷貝構造函數還是賦值運算符,主要是看是否有新的對象實例產生。如果產生了新的對象實例,那調用的就是拷貝構造函數;如果沒有,那就是對已有的對象賦值,調用的是賦值運算符。

調用拷貝構造函數主要有以下場景:

  • 對象作為函數的參數,以值傳遞的方式傳給函數?!?/li>
  • 對象作為函數的返回值,以值的方式從函數返回
  • 使用一個對象給另一個對象初始化

代碼如下:

class Person{public: Person(){} Person(const Person& p) { cout << "Copy Constructor" << endl; } Person& operator=(const Person& p) { cout << "Assign" << endl; return *this; }private: int age; string name;};void f(Person p){ return;}Person f1(){ Person p; return p;}int main(){ Person p; Person p1 = p; // 1 Person p2; p2 = p; // 2 f(p2); // 3 p2 = f1(); // 4 Person p3 = f1(); // 5 getchar(); return 0;}

上面代碼中定義了一個類Person,顯式的定義了拷貝構造函數和賦值運算符。然后定義了兩個函數:f,以值的方式參傳入Person對象;f1,以值的方式返回Person對象。在main中模擬了5中場景,測試調用的是拷貝構造函數還是賦值運算符。執行結果如下:

C++,構造函數,賦值運算符

分析如下:

  1. 這是雖然使用了"=",但是實際上使用對象p來創建一個新的對象p1。也就是產生了新的對象,所以調用的是拷貝構造函數。
  2. 首先聲明一個對象p2,然后使用賦值運算符"=",將p的值復制給p2,顯然是調用賦值運算符,為一個已經存在的對象賦值 。
  3. 以值傳遞的方式將對象p2傳入函數f內,調用拷貝構造函數構建一個函數f可用的實參。
  4. 這條語句拷貝構造函數和賦值運算符都調用了。函數f1以值的方式返回一個Person對象,在返回時會調用拷貝構造函數創建一個臨時對象tmp作為返回值;返回后調用賦值運算符將臨時對象tmp賦值給p2.
  5. 按照4的解釋,應該是首先調用拷貝構造函數創建臨時對象;然后再調用拷貝構造函數使用剛才創建的臨時對象創建新的對象p3,也就是會調用兩次拷貝構造函數。不過,編譯器也沒有那么傻,應該是直接調用拷貝構造函數使用返回值創建了對象p3。

深拷貝、淺拷貝

說到拷貝構造函數,就不得不提深拷貝和淺拷貝。通常,默認生成的拷貝構造函數和賦值運算符,只是簡單的進行值的復制。例如:上面的Person類,字段只有int和string兩種類型,這在拷貝或者賦值時進行值復制創建的出來的對象和源對象也是沒有任何關聯,對源對象的任何操作都不會影響到拷貝出來的對象。反之,假如Person有一個對象為int *,這時在拷貝時還只是進行值復制,那么創建出來的Person對象的int *的值就和源對象的int *指向的是同一個位置。任何一個對象對該值的修改都會影響到另一個對象,這種情況就是淺拷貝。

深拷貝和淺拷貝主要是針對類中的指針和動態分配的空間來說的,因為對于指針只是簡單的值復制并不能分割開兩個對象的關聯,任何一個對象對該指針的操作都會影響到另一個對象。這時候就需要提供自定義的深拷貝的拷貝構造函數,消除這種影響。通常的原則是:

  • 含有指針類型的成員或者有動態分配內存的成員都應該提供自定義的拷貝構造函數
  • 在提供拷貝構造函數的同時,還應該考慮實現自定義的賦值運算符

對于拷貝構造函數的實現要確保以下幾點:

  • 對于值類型的成員進行值復制
  • 對于指針和動態分配的空間,在拷貝中應重新分配分配空間
  • 對于基類,要調用基類合適的拷貝方法,完成基類的拷貝

總結

  • 拷貝構造函數和賦值運算符的行為比較相似,卻產生不同的結果;拷貝構造函數使用已有的對象創建一個新的對象,賦值運算符是將一個對象的值復制給另一個已存在的對象。區分是調用拷貝構造函數還是賦值運算符,主要是否有新的對象產生。
  • 關于深拷貝和淺拷貝。當類有指針成員或有動態分配空間,都應實現自定義的拷貝構造函數。提供了拷貝構造函數,最后也實現賦值運算符。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,同時也希望多多支持VEVB武林網!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91久久精品在线| 久久亚洲精品毛片| 国内自拍欧美激情| 亚洲品质视频自拍网| 亚洲精品自拍视频| 国产美女精品视频| 午夜精品理论片| 欧美日韩高清在线观看| 精品小视频在线| 81精品国产乱码久久久久久| 国产精品第一页在线| 国产精品av免费在线观看| xxxxx91麻豆| 精品国内产的精品视频在线观看| 92国产精品久久久久首页| 亚洲精品一区av在线播放| 午夜免费日韩视频| 国产亚洲精品久久久| 一区二区三区视频在线| 午夜伦理精品一区| 亚洲一区av在线播放| 国产日韩精品在线观看| 国产一区二区三区在线视频| 亚洲精品久久久久中文字幕欢迎你| 91精品中国老女人| 亚洲a级在线观看| 国产精品亚洲第一区| 日本免费久久高清视频| 国产在线一区二区三区| 欧美乱妇40p| 亚洲电影免费观看高清完整版在线观看| 亚洲福利在线观看| 亚洲日本成人网| 久久国产视频网站| 日韩美女av在线免费观看| 欧美重口另类videos人妖| 综合久久五月天| 日本一区二区三区在线播放| 精品久久久久久中文字幕一区奶水| 欧美老少配视频| 欧美视频中文在线看| 日韩欧美a级成人黄色| 国产精品久久久久7777婷婷| 欧美成人精品一区二区| 国产91网红主播在线观看| 91久久嫩草影院一区二区| 欧美黑人性猛交| 欧美日韩中文字幕| 亚洲激情在线观看视频免费| 欧美成在线视频| 亚洲欧洲自拍偷拍| 色阁综合伊人av| 欧美午夜宅男影院在线观看| 欧美精品性视频| 国产又爽又黄的激情精品视频| 国产亚洲激情视频在线| 亚洲最大av在线| 国产精品爱久久久久久久| 日韩电影在线观看中文字幕| 性色av一区二区三区红粉影视| 国产精品黄色影片导航在线观看| 成人性生交xxxxx网站| 亚洲欧美制服第一页| 91亚洲国产成人精品性色| 欧美一区二区大胆人体摄影专业网站| 日韩女在线观看| 91欧美视频网站| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品白嫩美女在线观看| 精品欧美激情精品一区| 亚洲伊人久久大香线蕉av| 亚洲精品国产综合区久久久久久久| 欧美性xxxx极品hd欧美风情| 精品国产1区2区| 日韩在线视频播放| 久久视频在线免费观看| 亚洲女性裸体视频| 色先锋久久影院av| 亚洲男人天堂网| 亚洲bt欧美bt日本bt| 91九色视频在线| 成人在线播放av| 欧美视频专区一二在线观看| 久久久精品视频在线观看| 中文字幕亚洲欧美在线| 亚洲福利视频网站| 精品久久香蕉国产线看观看亚洲| 日韩中文字幕在线视频| 亚洲精品白浆高清久久久久久| 欧美日韩免费区域视频在线观看| 国产精品成熟老女人| 超碰97人人做人人爱少妇| 国产aⅴ夜夜欢一区二区三区| 久久久久久久久电影| 欧美整片在线观看| 国产精品久久电影观看| 亚洲v日韩v综合v精品v| 国产在线观看精品一区二区三区| 久久久久久国产精品美女| 亚洲电影天堂av| 亚洲97在线观看| 久久成人亚洲精品| 亚洲专区国产精品| 久久久久免费精品国产| 伊人久久五月天| 91免费福利视频| 国产精品夜色7777狼人| 久久综合久久88| 欧美中文字幕视频| 国产欧美一区二区| 国产亚洲精品高潮| 日本一本a高清免费不卡| 97在线免费观看| 久久久亚洲精选| 91热精品视频| 精品视频久久久久久久| 欧美一区二区三区……| 国产精品影片在线观看| 久久久久久亚洲精品中文字幕| 欧美在线欧美在线| 国产高清视频一区三区| 国产精品视频公开费视频| 久久精品中文字幕| 日韩免费av在线| 亚洲成人免费网站| 日韩激情在线视频| 亚洲国产精品va在线看黑人| 久久久免费精品视频| 91精品视频免费看| 日韩精品极品在线观看| 美女久久久久久久| 综合网日日天干夜夜久久| 国产精品扒开腿做| 日本不卡视频在线播放| 亚洲精品av在线播放| 97国产成人精品视频| 国产98色在线| 欧美夫妻性生活xx| 日韩精品视频免费专区在线播放| 亚洲美女精品久久| 国产精品一区二区三区免费视频| 国产91久久婷婷一区二区| 奇米四色中文综合久久| 久久伊人色综合| 国产欧美久久一区二区| 青青久久av北条麻妃海外网| 久久中文久久字幕| 日本精品视频在线观看| 成人黄色在线免费| www.亚洲免费视频| 69精品小视频| 亚洲精品在线视频| 久久久免费高清电视剧观看| 欧美插天视频在线播放| 国产亚洲成av人片在线观看桃| 欧美重口另类videos人妖| 日韩欧美国产激情| 国产欧美中文字幕| 欧美一性一乱一交一视频| 亚洲欧洲在线视频| 日韩一区二区久久久| 啊v视频在线一区二区三区| 国产高清在线不卡| 日韩免费视频在线观看|