日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 深拷贝

發(fā)布時間:2025/5/22 c/c++ 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 深拷贝 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

系統(tǒng)提供默認(rèn)的拷貝構(gòu)造器,一經(jīng)定義不再提供。但系統(tǒng)提供的默認(rèn)拷貝構(gòu)造器是 等位拷貝,也就是通常意義上的淺拷貝。如果類中包含的數(shù)據(jù)元素全部在棧上,淺拷貝 也可以滿足需求的。但如果堆上的數(shù)據(jù),則會發(fā)生多次析構(gòu)行為。

#include <iostream> #include <cstdlib>using namespace std;int strlen(const char s[]){int len = 0;while (s[len]){len++;}return len; // 返回?cái)?shù)組str中首個值為null的元素的下標(biāo)值 }char* strcpy(char *p, const char *s){char *t = p;while (*p++ = *s++){}return t; }class Teacher{public://有參數(shù)的構(gòu)造函數(shù)Teacher(int id, const char *name){cout << "調(diào)用了Teacher 的構(gòu)造函數(shù)" << endl;//是給id 賦值m_id = id;//給姓名賦值int len = strlen(name);m_name = (char*)malloc(len + 1);strcpy(m_name, name);}//顯示寫一個拷貝構(gòu)造函數(shù)//通過顯示拷貝構(gòu)造函數(shù)提供了深拷貝的動作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() {//在構(gòu)造函數(shù)中, 已經(jīng)開辟了內(nèi)存 所以為了防止泄露//在析構(gòu)函數(shù)中,在對象銷毀之前,把m_name的內(nèi)存釋放掉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");//如果不提供一個顯示的拷貝構(gòu)造函數(shù), 通過系統(tǒng)自帶的默認(rèn)拷貝構(gòu)造函數(shù)Teacher t2(t1); //會調(diào)用t2的拷貝構(gòu)造函數(shù),將t1的值拷貝給t2 }

注:

  • 當(dāng)類中聲明的成員變量有char *時,在變量調(diào)用有參函數(shù)或無參函數(shù)進(jìn)行初始化的時候,需要對成員變量開辟一個存儲該變量的空間,如果在后續(xù)的操作中,有調(diào)用拷貝構(gòu)造函數(shù)需要對變量進(jìn)行深拷貝的動作,為拷貝后的變量開辟一個新的空間,使拷貝變量和被拷貝變量的空間互不影響。
    如果在拷貝構(gòu)造函數(shù)沒有對變量進(jìn)行深拷貝的動作而使用了淺拷貝的動作,程序會報(bào)錯或者會因?yàn)?char * 變量因?yàn)闆]有得到釋放,導(dǎo)致程序崩潰。
    以下是,錯誤舉例:
  • Teacher(const Teacher &another){m_id = another.m_id; //給id賦值m_name = another.m_name; // 這里會使程序報(bào)錯}
  • Teacher(int id, const char *name) 中,在一些編譯器中省略 const會出現(xiàn)報(bào)錯,而在一些編譯器中會出現(xiàn) 警告的提示,所以一般在編寫代碼中盡量不要省略。
  • 深拷貝可以防止重復(fù)釋放同一塊內(nèi)存和內(nèi)存的泄漏。
  • 總結(jié)

    以上是生活随笔為你收集整理的C++ 深拷贝的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。