C++ 深拷贝
系統提供默認的拷貝構造器,一經定義不再提供。但系統提供的默認拷貝構造器是 等位拷貝,也就是通常意義上的淺拷貝。如果類中包含的數據元素全部在棧上,淺拷貝 也可以滿足需求的。但如果堆上的數據,則會發生多次析構行為。
#include <iostream> #include <cstdlib>using namespace std;int strlen(const char s[]){int len = 0;while (s[len]){len++;}return len; // 返回數組str中首個值為null的元素的下標值 }char* strcpy(char *p, const char *s){char *t = p;while (*p++ = *s++){}return t; }class Teacher{public://有參數的構造函數Teacher(int id, const char *name){cout << "調用了Teacher 的構造函數" << endl;//是給id 賦值m_id = id;//給姓名賦值int len = strlen(name);m_name = (char*)malloc(len + 1);strcpy(m_name, name);}//顯示寫一個拷貝構造函數//通過顯示拷貝構造函數提供了深拷貝的動作Teacher(const Teacher &another){m_id = another.m_id; //給id賦值int len = strlen(another.m_name);m_name = (char*)malloc(len + 1);strcpy(m_name, another.m_name);}~Teacher() {//在構造函數中, 已經開辟了內存 所以為了防止泄露//在析構函數中,在對象銷毀之前,把m_name的內存釋放掉if (m_name != NULL) {free(m_name);m_name = NULL;cout << "釋放掉了m_name" << endl;}}private:int m_id;char *m_name; };int main(void){Teacher t1(1, "vvcat");//如果不提供一個顯示的拷貝構造函數, 通過系統自帶的默認拷貝構造函數Teacher t2(t1); //會調用t2的拷貝構造函數,將t1的值拷貝給t2 }注:
如果在拷貝構造函數沒有對變量進行深拷貝的動作而使用了淺拷貝的動作,程序會報錯或者會因為 char * 變量因為沒有得到釋放,導致程序崩潰。
以下是,錯誤舉例:
總結
- 上一篇: C++ 拷贝构造函数应用场景
- 下一篇: C++ 构造函数的初始化列表