真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

從String類中看C++當(dāng)中的深拷貝與淺拷貝解-創(chuàng)新互聯(lián)

   了解過(guò)C++語(yǔ)言的人,都應(yīng)該知道,C++語(yǔ)言中的構(gòu)造函數(shù),析構(gòu)函數(shù),拷貝構(gòu)造函數(shù),賦值運(yùn)算符重載函數(shù),如果不定義,編譯器會(huì)自動(dòng)生成的,當(dāng)然,生成的只是一些最基本的,在達(dá)不到我們要求的條件下,就需要我們自己重新定義這些函數(shù)。

十載的余江網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營(yíng)銷網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整余江建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“余江網(wǎng)站設(shè)計(jì)”,“余江網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

   我們現(xiàn)在說(shuō)的講的是深拷貝與淺拷貝,當(dāng)然討論這個(gè)問(wèn)題的基礎(chǔ),一般情況下是我們定義的變量是以指針形式出現(xiàn)的,原因就在于,不論賦值還是拷貝,我們要實(shí)現(xiàn)兩個(gè)指針指向的內(nèi)容一致,那我得到新的指針和原指針是指向同一塊內(nèi)存空間還是兩塊內(nèi)存空間的相同內(nèi)容。如果是指向同一塊空間,就存在了安全隱患,我們?cè)谧约汗芾砜臻g時(shí),就很有可能對(duì)一塊空間進(jìn)行了多次的釋放,有些編譯器下會(huì)報(bào)錯(cuò),甚至直接奔潰,有些編譯器雖不會(huì)拋出異常,但也會(huì)對(duì)后續(xù)的程序造成未知的錯(cuò)誤。

那么,現(xiàn)在就以String為例,看看如何解決這些問(wèn)題。

//參數(shù)列表中,pstr為char* 類型,s為String類型

//實(shí)現(xiàn)方法1:

class String
{
 friend ostream& operator<<(ostream& _out, const String& s);
public:
 String(const char* pstr) :_str(new char[strlen(pstr)+1])
 {
  strcpy(_str,pstr);
  cout << "構(gòu)造" << endl;//做標(biāo)識(shí)
 }
 String(const String& s) :_str(new char[strlen(s._str) + 1])
 {
  strcpy(_str,s._str);
  cout << "拷貝構(gòu)造"<

//*****************************************************************************************

//String類的實(shí)現(xiàn)2

class String
{
 friend ostream& operator<<(ostream& _out, const String& s);
public:
 String(const char* str) :_str(new char[strlen(str)+1])//同上
 {
  strcpy(_str,str);
 }
 //拷貝構(gòu)造
 String(const String& s) : _str(NULL)
 {
  String tmp(s._str);
  std::swap(_str,tmp._str);
 }
 //賦值運(yùn)算符重載
 //String&operator=(const String& s)
 //{
 // if (this != &s)
 // {
 //  char* tmp(s._str);//用s._str或者s實(shí)例化tmp都可以
 //  std::swap(_str,tmp);
 // }
 // return *this;
 //}
 
 //賦值運(yùn)算符重載之開(kāi)辟空間法
 String&operator=(const String& s)
 {
  if (this != &s)
  {
   char* tmp = new char[strlen(s._str) + 1];
   strcpy(tmp,s._str);
   delete[]_str;
   _str = tmp;
  }
  return *this;
 }
 //析構(gòu)
 ~String()
 {
  if (NULL == _str)
  {
   delete[] _str;
   _str = NULL;
  }
 }
private:
 char* _str;
};
//輸出運(yùn)算符重載
ostream& operator<<(ostream& _out,const String& s)
{
 _out << s._str<< endl;
 return _out;
}

// String類的實(shí)現(xiàn)3------>淺拷貝實(shí)現(xiàn)防止內(nèi)存的多次釋放

class String
{
 friend ostream& operator<<(ostream& _out, const String& s);
public:
 String(const char* pdata)
  :_str(new char[strlen(pdata)+1])
  , _count(new int)
 {
  strcpy(_str,pdata);
  *_count = 1;
 }
 String(const String& s)
  :_str(s._str)
  , _count(s._count)
 {
  _count++;
 }
 
 String& operator=(const String& s)
 {
  if (this != &s)
  {
   if (--(*_count) == 0)
   {
    delete[]_str;
    delete _count;
   }
   _count = s._count;
   _str = s._str;
   _count++;
  }
  return* this;
 }
 ~String()
 {
  if (--(*_count) == 0)
  {
   delete[] _str;
   delete _count;
  }
 }
private:
 char* _str;
 int* _count;
};
//輸出運(yùn)算符重載
ostream& operator<<(ostream& _out,const String& s)
{
 _out << s._str<< endl;
 return _out;
}

//*****************************************************************************************

友元函數(shù)受第一參數(shù)的限制,只能采用類外定義,引入友元

方法三,關(guān)于引入計(jì)數(shù)器,在面試過(guò)程中,這是最不推薦的方法,HR往往更傾向于讓你寫出深拷貝的方法。

深拷貝與淺拷貝是面試過(guò)程中經(jīng)常出現(xiàn)的題目,弄清楚這類問(wèn)題是非常必要的

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買多久送多久。


當(dāng)前題目:從String類中看C++當(dāng)中的深拷貝與淺拷貝解-創(chuàng)新互聯(lián)
文章URL:http://weahome.cn/article/dsjoeh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部