程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++:默認復制構造函數 執行 淺拷貝

C++:默認復制構造函數 執行 淺拷貝

編輯:關於C++

C++, 會默認生成一個復制構造函數, 當類中出現指針時, 復制會執行淺拷貝, 即只復制指針的地址, 不會復制數據;

所以在類中, 使用指針時, 需要注意; 如果想使用深拷貝, 可以添加復制構造函數.

以下代碼, 如果不添加復制構造函數, 則會運行出錯, 但可以通過編譯,

運行時, 因為刪除(delete[])兩次str所指的同一片地址空間, 所以程序無法執行.

代碼:

/* 
 * main.cpp 
 * 
 *  Created on: 2014.4.15 
 *      Author: Spike 
 */
      
/*vs2012*/
      
#include <iostream>  
#include <cstring>  
#include <vector>  
#include <memory>  
      
using namespace std;  
      
class CDemo {  
public:  
    CDemo() : str(NULL) {};  
    ~CDemo() {  
        static int i=0;  
        if (str) {  
            std::cout << "&Demo" << i++ << " = " << (int*)this << ", str = " << (int*)str << std::endl;  
            delete[] str;  
        }  
    }  
      
    //復制構造函數  
    CDemo(const CDemo& cd) {  
        this->str = new char[strlen(cd.str) + 1];  
        strcpy(this->str, cd.str);  
    }  
      
    char* str;  
};  
      
int main () {  
    CDemo d1;  
    d1.str = new char[32];  
    strcpy(d1.str, "Caroline");  
    std::vector<CDemo>* a1 = new std::vector<CDemo>();  
    a1->push_back(d1); //執行復制構造函數  
    std::cout << "d1.str = " << d1.str << std::endl;  
    std::cout << "(*a1)[0].str  = " << (*a1)[0].str << std::endl;  
    strcpy(d1.str, "Wendy");  
    std::cout << "d1.str = " << d1.str << std::endl;  
    std::cout << "(*a1)[0].str  = " << (*a1)[0].str << std::endl;  
    delete a1;  
    return 0;  
}

輸出:

d1.str = Caroline  
(*a1)[0].str  = Caroline  
d1.str = Wendy  
(*a1)[0].str  = Wendy  
&Demo0 = 0x312570, str = 0x312548  
&Demo1 = 0x22fec8, str = 0x312548

作者:csdn博客 Spike_King

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved