最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++對(duì)象的淺復(fù)制和深復(fù)制詳解及簡(jiǎn)單實(shí)例

 更新時(shí)間:2017年04月06日 14:31:49   投稿:lqh  
這篇文章主要介紹了C++對(duì)象的淺復(fù)制和深復(fù)制詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下

C++對(duì)象的淺復(fù)制和深復(fù)制詳解及簡(jiǎn)單實(shí)例

淺復(fù)制:兩個(gè)對(duì)象復(fù)制完成后共享某些資源(內(nèi)存),其中一個(gè)對(duì)象的銷毀會(huì)影響另一個(gè)對(duì)象

深復(fù)制:兩個(gè)對(duì)象復(fù)制完成后不會(huì)共享任何資源,其中一個(gè)對(duì)象的銷毀不會(huì)影響另一個(gè)對(duì)象

下面我們來看一段代碼,以便直觀的理解:

#include<iostream> 
#include<string.h> 
using namespace std; 
class Student 
{ 
  int no; 
  char *pname; 
public: 
  Student(); 
  Student(int n,char* p); 
  ~Student(); 
  void display(); 
}; 
 
Student::Student(){} 
 
Student::Student(int n,char* p) 
{ 
  no=n; 
  pname=new char[10]; 
  strcpy(pname,p); 
} 
 
Student::~Student() 
{ 
  delete []pname; 
} 
 
void Student::display() 
{ 
  cout<<"學(xué)號(hào):"<<no<<",姓名:"<<pname<<endl; 
} 
 
void main() 
{ 
  Student s(10,"xiaoming"),t; 
  t=s; 
  cout<<"s="; 
  s.display(); 
  cout<<"t="; 
  t.display(); 
} 

這段程序看上去是正確的,但是執(zhí)行就會(huì)出錯(cuò),原因就是復(fù)制語句t=s,此語句執(zhí)行的復(fù)制是淺復(fù)制,s將pname指針指向的地址賦給s的pname,它們就會(huì)指向相同的內(nèi)存空間,當(dāng)t被析構(gòu)時(shí),t.pname所指的內(nèi)存空間就被釋放了,再執(zhí)行s的析構(gòu)函數(shù)就會(huì)出錯(cuò)。

如果采用深復(fù)制就可以避免這個(gè)問題,下面我們用運(yùn)算符重載函數(shù)實(shí)現(xiàn)深復(fù)制:

Student& Student::operator = (Student& s) 
{ 
  no=s.no; 
  int len=strlen(s.pname); 
  pname=new char[len+1]; 
  strcpy(pname,s.pname); 
  return *this; 
} 

在執(zhí)行t=s時(shí),運(yùn)算符重載函數(shù)內(nèi)已為t分配內(nèi)存空間。

對(duì)于上述運(yùn)算符重載函數(shù)有兩點(diǎn)說明:

1.形參一定要是引用類型,否則執(zhí)行t=s時(shí),就要先將實(shí)參s復(fù)制到形參s,這個(gè)過程是淺復(fù)制,沒有為形參s分配內(nèi)存空間,運(yùn)行會(huì)出錯(cuò);

2.返回值一定要是引用類型,因?yàn)閳?zhí)行t=s相當(dāng)于執(zhí)行t.=(s),若返回值不是引用類型,那么還要將函數(shù)的返回對(duì)象復(fù)制到t,又會(huì)出錯(cuò)

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu) 中數(shù)制轉(zhuǎn)換(棧的應(yīng)用)

    數(shù)據(jù)結(jié)構(gòu) 中數(shù)制轉(zhuǎn)換(棧的應(yīng)用)

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 中數(shù)制轉(zhuǎn)換(棧的應(yīng)用)的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • QT應(yīng)用程序cout輸出中文亂碼解決方法

    QT應(yīng)用程序cout輸出中文亂碼解決方法

    本文主要介紹了QT應(yīng)用程序cout輸出中文亂碼解決方法,文中通過圖文的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • C++11中多線程編程-std::async的深入講解

    C++11中多線程編程-std::async的深入講解

    這篇文章主要給大家介紹了關(guān)于C++11中多線程編程-std::async的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • QTableWidget設(shè)置只讓某一列可編輯的實(shí)現(xiàn)

    QTableWidget設(shè)置只讓某一列可編輯的實(shí)現(xiàn)

    本文介紹了如何將QTableWidget的某一列設(shè)置為可編輯,以便用戶可以輸入自定義數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • 詳解C++圖搜索算法之雙端隊(duì)列廣搜

    詳解C++圖搜索算法之雙端隊(duì)列廣搜

    這篇文章主要為大家介紹一下C++圖搜索算法中的雙端隊(duì)列廣搜,文中通過例題詳細(xì)介紹了雙端隊(duì)列廣搜的使用方法,感興趣的可以了解一下
    2022-06-06
  • C++模板 index_sequence使用示例詳解

    C++模板 index_sequence使用示例詳解

    這篇文章主要為大家介紹了C++模板 index_sequence使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • c++中new一個(gè)結(jié)構(gòu)體初始化過程

    c++中new一個(gè)結(jié)構(gòu)體初始化過程

    這篇文章主要介紹了c++中new一個(gè)結(jié)構(gòu)體初始化過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • C++中Boost的智能指針weak_ptr

    C++中Boost的智能指針weak_ptr

    這篇文章介紹了C++中Boost的智能指針weak_ptr,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C語言數(shù)據(jù)結(jié)構(gòu)與算法之圖的遍歷(一)

    C語言數(shù)據(jù)結(jié)構(gòu)與算法之圖的遍歷(一)

    這篇文章主要是介紹了利用深度優(yōu)先算法實(shí)現(xiàn)圖的遍歷,文中利用圖文詳細(xì)的介紹了實(shí)現(xiàn)步驟,對(duì)我們學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法有一定的幫助,需要的朋友可以參考一下
    2021-12-12
  • C語言中strspn()函數(shù)和strcspn()函數(shù)的對(duì)比使用

    C語言中strspn()函數(shù)和strcspn()函數(shù)的對(duì)比使用

    這篇文章主要介紹了C語言中strspn()函數(shù)和strcspn()函數(shù)的對(duì)比使用,strspn是計(jì)算屬于字符串的字符數(shù)而strcspn則是判斷不屬于,需要的朋友可以參考下
    2015-08-08

最新評(píng)論

湄潭县| 灵寿县| 会东县| 陵川县| 兰坪| 任丘市| 德惠市| 平泉县| 新河县| 同仁县| 安岳县| 吉木萨尔县| 江安县| 桐梓县| 会东县| 安庆市| 乃东县| 东方市| 佳木斯市| 汉川市| 曲周县| 红原县| 峡江县| 安平县| 仙游县| 贵阳市| 锡林郭勒盟| 营山县| 历史| 进贤县| 岗巴县| 伊宁市| 沽源县| 沁水县| 遵化市| 高平市| 鄂州市| 剑河县| 恩平市| 扬中市| 安福县|