陈粒小梦大半百度云:浅谈C++对象的拷贝与赋值操作

来源:百度文库 编辑:九乡新闻网 时间:2024/04/27 06:34:08

浅谈C++对象的拷贝与赋值操作

2011-07-01 10:52 佚名 互联网 我要评论() 字号:T | T

本文介绍的是C++对象的拷贝与赋值操作,希望对大家有帮助,一起来看。

AD:


    我发现一些同事在用C++编写一个类时,知道什么时候需要实现拷贝构造函数赋值操作,但不知道什么时候拷贝构造函数被调用,什么时候赋值操作被调用,甚至把二者混为一谈。

    要弄明白这个问题,最简单的做法莫过于写个测试程序试一下。不过那样做也未必是好办法,实验的结果往往导致以偏概全的结论。不如好好想一下,弄清楚其中的原理,再去写程序去验证也不迟。

    拷贝构造函数,顾名思义,等于拷贝 + 构造。它肩负着创建新对象的任务,同时还要负责把另外一个对象拷贝过来。比如下面的情况就调用拷贝构造函数:

        
    1. cstring str = strother; 

    赋值操作则只含有拷贝的意思,也就是说对象必须已经存在。比如下面的情况会调用赋值操作。

        
    1. str = strother; 

    不过有的对象是隐式的,由编译器产生的代码创建,比如函数以传值的方式传递一个对象时。由于看不见相关代码,所以不太容易明白。不过我们稍微思考一下,就会想到,既然是根据一个存在的对象拷贝生成新的对象,自然是调用拷贝构造函数了。

    两者实现时有什么差别呢?我想有人会说,没有差别。呵,如果没有差别,那么只要实现其中一个就行了,何必要两者都实现呢?不绕圈子了,它们的差别是:

    拷贝构造函数对同一个对象来说只会调用一次,而且是在对象构造时调用。此时对象本身还没有构造,无需要去释放自己的一些资源。而赋值操作可能会调用多次,你在拷贝之前要释放自己的一些资源,否则会造成资源泄露。

    明白了这些道理之后,我们不防写个测试程序来验证一下我们的想法:

        
    1. #include   
    2. #include   
    3. #include   
    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++中的指针用法汇集
    【责任编辑:QiHappy TEL:(010)68476606】

    • 给力 (0票)
    • 动心 (0票)
    • 废话 (0票)