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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

构造函数和析构函数深拷贝和浅拷贝

發(fā)布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 构造函数和析构函数深拷贝和浅拷贝 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在C++中能夠定義和使用和類名相同的成員函數(shù),這種和類名相同的成員函數(shù)叫做構(gòu)造函數(shù)
構(gòu)造函數(shù)可以有參數(shù)還可以沒有參數(shù)
構(gòu)造函數(shù)沒有返回類型的聲明
一般情況下C++編譯器會自動調(diào)用構(gòu)造函數(shù)
當然也可以手動的去調(diào)用構(gòu)造函數(shù)
C++中的類也可以定義一個特殊的成員函數(shù)清理對象,這個特殊的成員函數(shù)叫做析構(gòu)函數(shù)語法: ~className()
析構(gòu)函數(shù)沒有參數(shù)也沒有任何返回類型的聲明
析構(gòu)函數(shù)在對象銷毀之前被調(diào)用
析構(gòu)函數(shù)的調(diào)用機制,C++編譯器自動調(diào)用
構(gòu)造函數(shù)也是成員函數(shù)只不過是一種特殊的成員函數(shù)

構(gòu)造函數(shù)和析構(gòu)函數(shù)的作用

通過結(jié)果可以看出來構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行過程是構(gòu)造函數(shù)和聲明的順序相同,析構(gòu)函數(shù)和聲明的順序相反。

#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;class Test { public:Test() //構(gòu)造函數(shù){p = (char *) malloc(100); a =10;strcpy(p ,"aaaaaaaddjdjj");cout << "這是一個構(gòu)造函數(shù)" << endl;}void printP(){cout << p << endl;cout << a << endl;}~Test(){if ( p != NULL){free(p);}cout << "這是一個析構(gòu)函數(shù)" << endl;} protected: private:int a;char *p; };//給對象搭建一個舞臺研究對象的行為 void objPlay() {Test c1;c1.printP();cout << "分隔符" << endl;Test c2;c2.printP(); } int main() {objPlay();cout << "hello world!" << endl;system("pause");return 0; }

匿名構(gòu)造函數(shù)

#include <iostream> using namespace std;class Location { public:Location( int xx = 0 , int yy = 0 ) { X = xx ; Y = yy ; cout << "Constructor Object.\n" ; }//copy構(gòu)造函數(shù) 完成對象的初始化Location(const Location & obj) //copy構(gòu)造函數(shù) {X = obj.X; Y = obj.Y;}~Location() { cout << X << "," << Y << " Object destroyed." << endl ; }int GetX () { return X ; } int GetY () { return Y ; } private : int X , Y ; } ; // g函數(shù)返回一個元素 //你這么寫代碼,設(shè)計編譯器的大牛們: //我就給你返回一個新對象(沒有名字 匿名對象) //由于函數(shù)的作用域因此這樣能夠?qū)崿F(xiàn),匿名函數(shù) //g函數(shù) 返回一個元素 //結(jié)論1 : 函數(shù)的返回值是一個元素 (復雜類型的), 返回的是一個新的匿名對象(所以會調(diào)用匿名對象類的copy構(gòu)造函數(shù))Location g() {Location A(1,2);return A; //因為A是一個局部變量,因此C++編譯器是調(diào)用copy構(gòu)造函數(shù)//返回的是一個匿名構(gòu)造函數(shù) }//為了完整的展現(xiàn)對象的調(diào)用聲明周期 void objplay2() {g(); }// void objplay3() {//用匿名對象初始化m 此時c++編譯器 直接把匿名對轉(zhuǎn)成m;(扶正) 從匿名轉(zhuǎn)成有名字了mLocation m = g(); printf("匿名對象,被扶正,不會析構(gòu)掉\n");cout<<m.GetX()<<endl;; }void objplay4() {//用匿名對象 賦值給 m2后, 匿名對象被析構(gòu)Location m2(1, 2);m2 = g();printf("因為用匿名對象=給m2, 匿名對象,被析構(gòu)\n");cout<<m2.GetX()<<endl;; } int main() {objplay2();//objplay3(); // objplay4();cout<<"hello..."<<endl;system("pause");return 0; }

匿名對象的去或留

#include <iostream> using namespace std;class Location { public:Location( int xx = 0 , int yy = 0 ) { X = xx ; Y = yy ; cout << "Constructor Object.\n" ; }//copy構(gòu)造函數(shù) 完成對象的初始化Location(const Location & obj) //copy構(gòu)造函數(shù) {X = obj.X; Y = obj.Y;}~Location() { cout << X << "," << Y << " Object destroyed." << endl ; }int GetX () { return X ; } int GetY () { return Y ; } private : int X , Y ; } ;// //結(jié)論2: 有關(guān) 匿名對象的去和留 //如果用匿名對象 初始化 另外一個同類型的對象, 匿名對象 轉(zhuǎn)成有名對象 //如果用匿名對象 賦值給 另外一個同類型的對象, 匿名對象 被析構(gòu)//這樣寫代碼 C++編譯器會認為你就是想返回一個新的對象的 沒有名字所以是匿名對象 Location g() {Location A(1,2);return A; }void objplay3() {//用匿名對象初始化m 此時C++編譯器 直接把匿名對象轉(zhuǎn)成m;(扶正)從匿名對象直接轉(zhuǎn)換為有名字的mLocation m = g(); //A被析構(gòu)但是 m沒有重建,因為采用的是將匿名對象轉(zhuǎn)正為m,而不是從新生成一個mprintf("匿名對象轉(zhuǎn)正,不會被析構(gòu)掉\n");cout << m.GetX() << endl; }void objplay4() {Location m2(1,2);m2 = g();cout << "因為沒有使用匿名對象 = 給m2,匿名對象,被析構(gòu)" << endl;cout << m2.GetX() << endl; } int main() {//objplay3();cout <<endl <<endl << endl << endl << endl <<endl << endl;objplay4();cout<<"hello..."<<endl;system("pause");return 0; }

構(gòu)造函數(shù)的的調(diào)用規(guī)則

  • 當類中沒有定義任意一個構(gòu)造函數(shù)的時候C++編譯器會提供一個默認的拷貝構(gòu)造函數(shù)和無參數(shù)構(gòu)造函數(shù)
  • 當類中定義了一個拷貝構(gòu)造函數(shù)的時候,C++編譯器不會提供無參數(shù)構(gòu)造函數(shù)
  • 當類中定義了任意的非拷貝構(gòu)造函數(shù)(即無參數(shù)構(gòu)造函數(shù)或有參數(shù)構(gòu)造函數(shù)),C++編譯器不會提供無參數(shù)構(gòu)造函數(shù)
  • 默認拷貝構(gòu)造函數(shù)只對成員進行簡單的賦值
  • 總結(jié):在定義類時 只要你寫了構(gòu)造函數(shù),你就得使用

使用C++默認的拷貝構(gòu)造函數(shù)只是使用的是淺拷貝構(gòu)造函數(shù),當有指針變量的時候只會拷貝指針變量但是不會拷貝指針指向的數(shù)據(jù)

#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;class Name { public:Name(const char *myp){int len = strlen(myp);p = (char *)malloc(len + 1);strcpy(p,myp); }~Name(){if(p != NULL){free(p); //屏蔽改行程序能夠運行}} protected: private:char *p;int len; };void objplaymain() {Name obj1("agsuafujfa");Name obj2 = obj1; //執(zhí)行C++默認得到拷貝構(gòu)造函數(shù),但是C++編譯器只是一個淺拷貝,只是把指針變量的值拷貝過來沒有把指針變量指向的數(shù)據(jù)拷貝過來//釋放 obj2 的時候程序出現(xiàn)問題,說明**obj2**淺拷貝函數(shù),直接使用的是obj1的指針變量而不是拷貝 obj1指針變量所指向的數(shù)值 //這時再次調(diào)用obj1析構(gòu)函數(shù)的時候就會出現(xiàn)問題} int main() {objplaymain();cout << "hello world!" << endl;system("pause");return 0; }

例如如圖:

在必要的時候需要程序員自己寫拷貝函數(shù)
使用深拷貝實現(xiàn)對象的賦值
解決辦法就是自己編寫拷貝函數(shù)

#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;class Name { public:Name(const char *myp){m_len = strlen(myp);p = (char *)malloc(m_len + 1);strcpy(p,myp); }//Name obj2 = obj1Name(const Name& obj){m_len = obj.m_len;p = (char *)malloc(m_len + 1);strcpy(p,obj.p);}~Name(){if(p != NULL){free(p);}} protected: private:char *p;int m_len; };void objplaymain() {Name obj1("agsuafujfa");Name obj2= obj1; //執(zhí)行C++默認得到拷貝構(gòu)造函數(shù),但是C++編譯器只是一個淺拷貝,只是把指針變量的值拷貝過來沒有把指針變量指向的數(shù)據(jù)拷貝過來} int main() {objplaymain();cout << "hello world!" << endl;system("pause");return 0; }

//等號操作符,也是默認使用的是淺拷貝,因此要是使用”= “操作符對對象進行賦值的時候需要使用操作符重載

#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;class Name { public:Name(const char *myp){m_len = strlen(myp);p = (char *)malloc(m_len + 1);strcpy(p,myp); }//Name obj2 = obj1Name(const Name& obj){m_len = obj.m_len;p = (char *)malloc(m_len + 1);strcpy(p,obj.p);}~Name(){if(p != NULL){free(p);}} protected: private:char *p;int m_len; };void objplaymain() {Name obj1("agsuafujfa");//Name obj2= obj1; <==> obj2(obj1); //執(zhí)行C++默認得到拷貝構(gòu)造函數(shù),但是C++編譯器只是一個淺拷貝,只是把指針變量的值拷貝過來沒有把指針變量指向的數(shù)據(jù)拷貝過來Name obj3("obj3");obj1 = obj3; //等號操作 C++提供的等號操作也是一個淺拷貝 解決辦法是顯式的從在"=" 操作符 } int main() {objplaymain();cout << "hello world!" << endl;system("pause");return 0; }

總結(jié)

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

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

主站蜘蛛池模板: 国产精品九九 | 中文在线字幕av | 国产区视频 | 人人爽夜夜爽 | 国产精品中文久久久久久 | 成人在线不卡视频 | 日韩毛片在线观看 | 国产精品国产三级国产专播精品人 | 中文字幕丰满孑伦无码专区 | 午夜激情综合 | asian日本肉体pics| 欧美视频三区 | 一级片在线免费 | 午夜在线观看免费视频 | 亚洲中字在线 | www视频在线观看网站 | 妓院一钑片免看黄大片 | 在线日韩欧美 | 最新视频 - x88av | 波多野结衣在线观看视频 | 日韩在线视 | 爱情岛论坛自拍亚洲品质极速最新章 | 成人欧美一区二区三区黑人冫 | 中文字幕乱码人妻无码久久95 | 久久精品久久精品久久 | 亚洲天堂一区在线观看 | 日韩不卡一二三区 | 中文字幕h | 黄色特级视频 | 国产一区不卡在线 | 免费黄色av网站 | 一区不卡在线观看 | 激情一区 | 可以直接看av的网址 | 亚洲成人av综合 | 91高清国产 | av综合网站| 日韩不卡在线播放 | 亚洲香蕉在线视频 | 秋霞国产一区 | 深爱五月激情五月 | 美女aaa | 黄色大片久久 | 免费看的av | 在线播放小视频 | 国产视频自拍一区 | 亚洲欲妇| 亚洲巨乳在线 | 久久久一级片 | 日韩一级完整毛片 | 少妇太爽了太深了太硬了 | 欧美美女性视频 | 国语对白清晰刺激对白 | 日韩在线观看免费av | 亚洲精品国产精品国自产观看 | 最好看的中文字幕国语电影mv | 国产伦一区二区三区 | 午夜在线观看免费视频 | 少妇av一区二区三区无码 | 国产高潮国产高潮久久久91 | 欧美a v在线 | 国产高清一区二区 | 国产毛片毛片毛片 | 免费在线观看视频a | 中国一区二区三区 | 伊人7| 国产一区二区三区色淫影院 | 天天色天天干天天 | 久久精品亚洲天堂 | 黄页视频在线免费观看 | 强侵犯の奶水授乳羞羞漫虐 | 欧美一区二区三区激情视频 | 久久久久免费 | 四虎视频国产精品免费 | 伊人久久大香线蕉av一区 | 黄色av免费播放 | 欧美日韩高清不卡 | 久久人妖 | 久久精品色妇熟妇丰满人妻 | 玖草在线| 人妻体内射精一区二区三区 | 亚洲色图25p | 国产日韩精品视频 | 精品一区精品二区 | 综合五月婷 | 欧美sm视频 | 成人h动漫精品一区二 | 国产经典久久 | 亚洲欧美一区二区三区在线观看 | 久久综合精品国产二区无码不卡 | 亚洲情se| 日本久久成人 | 在线观看国产成人 | 欧美日韩高清一区二区 国产亚洲免费看 | 欧美日韩激情在线 | 97激情| 91视频在线视频 | 日韩一级性 | 亚洲情射 |