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

淺談C++對象的拷貝與賦值操作

開發 后端
本文介紹的是C++對象的拷貝與賦值操作,希望對大家有幫助,一起來看。

我發現一些同事在用C++編寫一個類時,知道什么時候需要實現拷貝構造函數賦值操作,但不知道什么時候拷貝構造函數被調用,什么時候賦值操作被調用,甚至把二者混為一談。

要弄明白這個問題,最簡單的做法莫過于寫個測試程序試一下。不過那樣做也未必是好辦法,實驗的結果往往導致以偏概全的結論。不如好好想一下,弄清楚其中的原理,再去寫程序去驗證也不遲。

拷貝構造函數,顧名思義,等于拷貝 + 構造。它肩負著創建新對象的任務,同時還要負責把另外一個對象拷貝過來。比如下面的情況就調用拷貝構造函數:

  1. cstring str = strother; 

賦值操作則只含有拷貝的意思,也就是說對象必須已經存在。比如下面的情況會調用賦值操作。

  1. str = strother; 

不過有的對象是隱式的,由編譯器產生的代碼創建,比如函數以傳值的方式傳遞一個對象時。由于看不見相關代碼,所以不太容易明白。不過我們稍微思考一下,就會想到,既然是根據一個存在的對象拷貝生成新的對象,自然是調用拷貝構造函數了。

兩者實現時有什么差別呢?我想有人會說,沒有差別。呵,如果沒有差別,那么只要實現其中一個就行了,何必要兩者都實現呢?不繞圈子了,它們的差別是:

拷貝構造函數對同一個對象來說只會調用一次,而且是在對象構造時調用。此時對象本身還沒有構造,無需要去釋放自己的一些資源。而賦值操作可能會調用多次,你在拷貝之前要釋放自己的一些資源,否則會造成資源泄露。

明白了這些道理之后,我們不防寫個測試程序來驗證一下我們的想法:

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. class cstring  
  5. {   
  6. public:  
  7. cstring();  
  8. cstring(const char* pszbuffer);  
  9. ~cstring();  
  10. cstring(const cstring& other);  
  11. const cstring& operator=(const cstring& other);  
  12. private:  
  13. char* m_pszbuffer;;  
  14. };   
  15. cstring::cstring()  
  16. {  
  17. printf("cstring::cstring\n");  
  18. m_pszbuffer = null;  
  19. return;   
  20. }   
  21. cstring::cstring(const char* pszbuffer)  
  22. {  
  23. printf("cstring::cstring(const char* pszbuffer)\n");  
  24. m_pszbuffer = pszbuffer != null ? strdup(pszbuffer) : null;  
  25. return;  
  26. }  
  27. cstring::~cstring()  
  28. {  
  29. printf("%s\n", __func__);  
  30. if(m_pszbuffer != null)  
  31. {  
  32. free(m_pszbuffer);  
  33. m_pszbuffer = null;  
  34. }  
  35. return;  
  36. }  
  37. cstring::cstring(const cstring& other)  
  38. {  
  39. if(this == &other)  
  40. {  
  41. return;  
  42. }  
  43. printf("cstring::cstring(const cstring& other)\n");  
  44. m_pszbuffer = other.m_pszbuffer != null ? strdup(other.m_pszbuffer) : null;  
  45. }  
  46. const cstring& cstring::operator=(const cstring& other)  
  47. {  
  48. printf("const cstring& cstring::operator=(const cstring& other)\n");  
  49. if(this == &other)  
  50. {  
  51. return *this;  
  52. }  
  53.  
  54. if(m_pszbuffer != null)  
  55. {  
  56. free(m_pszbuffer);  
  57. m_pszbuffer = null;  
  58. }  
  59. m_pszbuffer = other.m_pszbuffer != null ? strdup(other.m_pszbuffer) : null;  
  60. return *this;  
  61. }  
  62.  
  63. void test(cstring str)  
  64. {  
  65. cstring str1 = str;  
  66. return;  
  67. }  
  68.  
  69. int main(int argc, char* argv[])  
  70. {  
  71. cstring str;  
  72. cstring str1 = "test";  
  73. cstring str2 = str1;  
  74. str1 = str;  
  75. cstring str3 = str3;  
  76. test(str);  
  77. return 0;  

希望對你有幫助。

【編輯推薦】

  1. C++中static的用法總結
  2. C++內存管理的探討
  3. C++的輸出格式控制技巧分析
  4. C++多態技術的實現和反思
  5. C++中的指針用法匯集
責任編輯:于鐵 來源: 互聯網
相關推薦

2024-04-28 11:01:27

C++編程語言函數

2011-07-20 13:40:09

拷貝構造函數

2009-07-20 09:53:43

Java混合編程

2011-07-20 17:23:29

C++持久對象

2012-09-18 13:26:39

CC++

2022-09-30 15:03:09

C語言深拷貝淺拷貝

2009-09-02 15:41:21

C# HTTPWebR

2009-12-22 01:54:50

C++之父Bjarne Stro

2009-08-19 17:12:18

C# Connecti

2009-08-12 11:24:25

C# String對象

2009-08-31 09:37:09

C# Employee

2009-09-04 17:34:11

C#CC++

2011-04-08 09:52:44

C++C#DLL

2009-09-02 17:07:06

C#數組操作

2009-08-18 09:06:41

C#對象和集合

2009-09-02 16:36:37

C#調用Excel對象

2024-01-03 13:38:00

C++面向對象編程OOP

2010-02-02 15:59:32

C++賦值函數

2016-10-20 16:07:11

C++Modern C++異步

2010-02-06 17:09:29

C++文件拷貝
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区高清视频 | 国产成人精品一区二区三区四区 | 日韩av在线中文字幕 | 中文字幕一区二区三区四区 | 欧美在线 | 中文字幕第一页在线 | 亚洲高清在线 | 亚洲国产中文在线 | 欧美a级成人淫片免费看 | 成人在线观看免费爱爱 | 99视频免费| 精品国产久 | 日本理论片好看理论片 | 热re99久久精品国产99热 | 日韩欧美在线视频一区 | 日韩国产欧美在线观看 | 成人在线看片 | 狠狠操在线 | 毛片一区二区三区 | 99热碰| 国产欧美精品 | 亚洲欧美一区二区三区在线 | 欧美日韩国产精品一区二区 | 99精品电影 | 欧美国产中文字幕 | 四虎永久在线精品免费一区二 | 一级看片免费视频囗交动图 | 中文字幕一区二区三 | www.日本三级 | 久久国产精品无码网站 | 婷婷精品| 中文字幕成人av | 亚洲一区二区免费视频 | 日本精品久久 | 精品一区二区在线视频 | 天天操操 | 久久久久www | 国产一级网站 | 欧美日韩成人在线观看 | 日日骚网 | 97伊人 |