成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于C++默認拷貝構造函數產生的問題的討論

開發 后端
對于拷貝構造函數,我前面的博文有提起過,不過,有的時候,淺拷貝和深拷貝真的很難理解,所以,我們再進行關于拷貝構造函數的一些討論。

對于拷貝構造函數,我前面的博文有提起過,不過,有的時候,淺拷貝和深拷貝真的很難理解,所以,我們再進行關于拷貝構造函數的一些討論。
 

大家都整到拷貝構造函數分為淺拷貝深拷貝,系統默認的拷貝構造函數是淺拷貝。

默認拷貝構造函數以內存拷貝的方式將舊有對象的內存空間拷貝到新對象的內存空間。

如果類中有指針類型的類型的時候,默認拷貝構造函數只能復制指針屬性的值,而不能復制指針屬性所指向的內存,此時,如果我們自己不顯式定義拷貝構造函數,那么我們在編程的時候,可能會出現很詭異的問題。

顯式定義拷貝構造函數來完成指針屬性等需要特殊處理的屬性的拷貝工作。

The Number one :  我們先來看淺拷貝帶來的問題

---------------------我是分割線------------------------

  1. # include <iostream>   
  2. using namespace std;   
  3.     
  4. class Car   
  5. {   
  6. private:   
  7.     char*  brand;   
  8.     float  price;   
  9. public:   
  10.     Car(const char* sz, float p)          
  11.     {   
  12.         //構造函數中為brand分配內存   
  13.         brand = new char[strlen(sz)+1];   
  14.         strcpy(brand, sz);   
  15.     }   
  16.     ~Car   
  17.     {   
  18.         //析構函數中釋放申請的內存   
  19.         delete[] brand;   
  20.         cout << " Clear is over ! " << endl;           
  21.     }   
  22.     void just_print()   
  23.     {   
  24.         cout << "brand : " << brand << endl;   
  25.         cout << "price : " << price << endl;   
  26.     }   
  27. };   
  28.     
  29. int main(void)   
  30. {   
  31.     Car car_one("BMW",120);   
  32.     car_one.just_print();   
  33.     //調用默認的拷貝構造函數   
  34.     Car car_two(comp_one);   
  35.     car_two.print();   
  36.     
  37.     return 0;   

----------------------------------------------------------------------------
 

這個程序運行失敗,代碼分析:

1、car_two(car_one)等價于

         car_two.brand = car_one.brand;

         car_two.price  = car_one.price;

2、經過賦值操作后,兩個對象中的指針指向的是同一塊動態內存,當car_one和car_two撤銷時,其釋放函數都要釋放同一塊動態內存內存,可是,兩個對象撤銷有先有后,一旦一個對象被撤銷,另一個對象的brand指針變速"野指針",使用該指針再次釋放同一塊動態內存會引發內存錯誤。

不僅僅是重復釋放內存的問題,還會出現其他問題:

-------------------------------------------------------------------------------

  1. int main(void)   
  2. {   
  3.     Car car_one("Dell", 7000);   
  4.         
  5.     if(true)   
  6.     {   
  7.         car car_two(car_one);   
  8.         car_two.print();   
  9.     }   
  10.     //car_one.brand指向的動態內存此時已經被釋放   
  11.     car_one.print();   
  12.         
  13.     return 0;   

-------------------------------------------------------------------------------------------

由于car_two是在if結構中定義的局部對象,因此if結構退出時,car_two被撤銷,系統自動調用其析構函數,釋放了car_two.brand所指向的動態內存,由于car_one和car_two值相同,此時car_one.brand已無所指,成了野指針,此時,對該指針的讀寫操作都會引發無法預料的錯誤。

----------------------------------------------------------------------------

此時,我們就需要自己來定義拷貝構造函數:

----------------------------------------------------------------------------

  1. //顯式定義構造函數   
  2. # include <iostream>   
  3. # include <cstring>   
  4. using namespace std;   
  5.     
  6. class Car   
  7. {   
  8. private:   
  9.     char*    brand;   
  10.     float    price;   
  11. public:   
  12.     Car(const char*  sz, float  p)       
  13.     {   
  14.     brand = new char[strlen(sz)+1];   
  15.         strcpy(brand, sz);   
  16.         price = p;           
  17.     }   
  18.     //自定義拷貝構造函數   
  19.     Car(const  Car&  cp)   
  20.     {   
  21.     //重新為brand開辟與cp.brand同等大小的內存空間   
  22.     brand = new char[strlen(cp.brand) + 1];   
  23.         //   
  24.         strcpy(brand, cp.brand);   
  25.         price = cp.price;           
  26.     }   
  27.     ~Car()   
  28.     {   
  29.     delete[]  brand;   
  30.         cout << "clear over " <<endl;          
  31.     }   
  32.         
  33.     void print()   
  34.     {   
  35.     cout << "brand " << endl;   
  36.         cout << "price " << endl;    
  37.     }       
  38. };   
  39.     
  40. int main(void)   
  41. {   
  42.     Car car_one("Dell", 8999);   
  43.     car_one.print();   
  44.     //   
  45.     Car car_two(car_one);   
  46.     car_two.print();   
  47.     //沒有采用brand = cp.brand 這種直接直接賦值,而是重新申請動態內存,使用   
  48.     //庫函數strcpy實現了字符串的復制   
  49.     //car_one.brand和car_two.brand指向兩塊不同的內存,避免了錯誤   
  50.              
  51.     return 0;   

------------------------------------------------------------------------------------------

***提一點,自定義的拷貝構造函數,***也重載operator=運算符!

-----------------------------------------------------------------------------------------

51cto博客:http://liam2199.blog.51cto.com/2879872/1417892

責任編輯:林師授 來源: 51cto博客
相關推薦

2025-02-06 13:23:09

C++函數參數

2011-07-20 13:40:09

拷貝構造函數

2010-01-27 17:16:52

C++構造函數

2024-01-25 11:36:08

C++構造函數關鍵字

2024-04-28 11:01:27

C++編程語言函數

2010-01-25 14:43:00

C++構造函數

2010-01-25 17:05:37

C++語言

2024-12-06 12:00:00

C++構造函數

2009-08-13 17:30:30

C#構造函數

2023-11-28 11:51:01

C++函數

2010-01-28 10:49:22

C++構造函數

2010-07-13 15:36:33

2011-08-15 17:29:36

Objective-C構造函數

2010-01-25 14:00:27

C++類

2010-01-27 16:10:32

C++靜態構造函數

2010-01-27 10:13:22

C++類對象

2009-07-31 14:47:22

JavaScript函C#

2010-01-22 11:13:16

C++靜態

2011-06-11 21:36:44

C#C++

2009-11-17 09:07:55

靜態構造函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91aiai| 欧美亚洲视频在线观看 | 久久久久亚洲精品中文字幕 | 国内自拍偷拍一区 | 中文字幕免费在线 | 不卡在线视频 | 欧美成年网站 | 日韩成人精品一区二区三区 | 美女久久| 国产69精品久久久久777 | 久久精品久久久久久 | 精品毛片| 国产精品久久久亚洲 | 综合在线视频 | 日韩一二区 | 国产探花在线精品一区二区 | 粉色午夜视频 | 久久国产美女视频 | 欧美在线观看一区 | 日本午夜免费福利视频 | 日日夜夜视频 | 五月精品视频 | 免费同性女女aaa免费网站 | 中文字幕高清av | 久久久久九九九女人毛片 | 国产亚洲精品精品国产亚洲综合 | 欧美一区2区三区3区公司 | 久久精品国产免费一区二区三区 | 国产精品网页 | 九九热在线精品视频 | 天天草天天操 | 色狠狠一区 | 久草视频观看 | 日本精品一区二区三区在线观看视频 | 精品视频一区二区三区在线观看 | 国内久久 | 亚洲综合色网 | 亚洲综合国产精品 | 亚洲精品国产综合区久久久久久久 | 欧美日韩一区二区视频在线观看 | 一级爱爱片|