小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C++_指針懸掛和賦值操作符的重載

 just_person 2012-08-17

指針懸掛:

問(wèn)題:使用new申請(qǐng)的內(nèi)存內(nèi)存空間無(wú)法訪問(wèn),也無(wú)法釋放。

原因:直接對(duì)指向new申請(qǐng)的存儲(chǔ)空間的指針變量進(jìn)行賦值修改

后果:失去了原來(lái)的地址,原來(lái)的空間無(wú)法訪問(wèn)也無(wú)法釋放,造成內(nèi)存泄漏

            還可能造成同一個(gè)內(nèi)存釋放兩次

容易引起指針懸掛的方式:對(duì)象的初始化和對(duì)象間賦值

容易引起指針懸掛的條件:類(lèi)中含有指針類(lèi)型的成員時(shí),使用默認(rèn)的拷貝構(gòu)造函數(shù)和賦值函數(shù)都會(huì)出現(xiàn)兩個(gè)指針變量互相賦值,產(chǎn)生指針懸掛的問(wèn)題。

解決方法:需要重新定義拷貝構(gòu)造函數(shù)和超載賦值運(yùn)算符

賦值操作符:    

 作用:兩個(gè)已經(jīng)存在的對(duì)象間相互賦值,產(chǎn)生兩個(gè)完全相同的內(nèi)存拷貝

 舉例:string a("hello");//調(diào)用構(gòu)造函數(shù)

             string b("would");//調(diào)用構(gòu)造函數(shù)

             string c=a;//調(diào)用拷貝構(gòu)造函數(shù)--風(fēng)格差,應(yīng)使用string c(a)

             c=b;  //調(diào)用拷貝賦值函數(shù)

重載賦值運(yùn)算符:

語(yǔ)法:

  1. X& X::operator=(const X & fm)  
  2. {  
  3.     函數(shù)體  
  4. }  

注意:

          1、第一個(gè)引用的作用(為什么使用返回函數(shù)引用):

                原因:為了實(shí)現(xiàn)對(duì)象間的連續(xù)賦值。

               使用返回函數(shù)引用的好處:結(jié)果得到的是一個(gè)變量,它既可以當(dāng)左值,也可當(dāng)右值,且采用賦值時(shí)沒(méi)有引入臨時(shí)變量,直接從原結(jié)果拷貝。

          2、第二個(gè)引用的作用:防止調(diào)用拷貝構(gòu)造函數(shù),因?yàn)榭截悩?gòu)造函數(shù)也可能引起指針懸掛

          3、const的作用:當(dāng)參數(shù)使用引用時(shí),可能會(huì)改變傳入的參數(shù),為了避免這樣,就使用const

具體代碼:

  1. class Point  
  2. {  
  3. private:  
  4.     char * name;  
  5. public:  
  6.     Point(char * className)  
  7.     {  
  8.         name = new char[strlen(className)+1];  
  9.         strcpy(name, className);  
  10.     }  
  11.     Point(const Point& p)//深拷貝  
  12.     {  
  13.         name = new char[strlen(p.name)+1];  
  14.         strcpy(name,p.name);  
  15.     }  
  16.     ~Point()  
  17.     {  
  18.         cout<<name<<endl;  
  19.         delete []name;  
  20.     }  
  21.     Point& operator=(const Point&p);  
  22. };  
  23. 系統(tǒng)自帶的等號(hào)運(yùn)算符:  
  24. Point& Point::operator=(const Point&p)  
  25. {  
  26.     name=p.name;//造成指針懸掛  
  27. }  
  28. 重載后的等號(hào)運(yùn)算符:  
  29. Point& Point::operator=(const Point&p)  
  30. {        
  31.     delete[]name;//釋放原來(lái)的        
  32.     name=new char[strlen(p.name)+1];        
  33.     strcpy(name,p.name);          
  34.     return *this;      
  35. }  

拷貝構(gòu)造函數(shù)和重載賦值運(yùn)算符的代碼對(duì)比:

  1. Point::Point(const  Point& p)//拷貝構(gòu)造函數(shù)  
  2. Point& Point::operator=(const Point&p)//重載賦值運(yùn)算符  

注意:

         1、參數(shù)都是一樣的,都有const和引用,但是帶他們的原因不同,具體見(jiàn)上面。

         2、拷貝構(gòu)造函數(shù)無(wú)返回值,而重載賦值運(yùn)算符使用 返回函數(shù)引用。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多