青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

寶杉的博客

UNIX/LINUX;ACE;SNMP;C++
posts - 33, comments - 23, trackbacks - 0, articles - 0

08-14 String類

Posted on 2007-08-30 10:31 寶杉 閱讀(290) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++

定義:

     class String

     {

       public:

         String(const char *str = NULL);  // 普通構(gòu)造函數(shù)

         String(const String &other);     // 拷貝構(gòu)造函數(shù)

         ~ String(void);                       // 析構(gòu)函數(shù)

         String & operate =(const String &other);  // 賦值函數(shù)

       private:

         char     *m_data;               // 用于保存字符串

     };

 

 

普通構(gòu)造:

         // String的普通構(gòu)造函數(shù)

         String::String(const char *str)

{

     if(str==NULL)

     {

         m_data = new char[1];

         *m_data = \0;

     }   

     else

     {

         int length = strlen(str);

         m_data = new char[length+1];

         strcpy(m_data, str);

     }

}   

注意在聲明時(shí),才定義的參數(shù),且賦初值為NULL。在拷貝函數(shù)內(nèi)部,也進(jìn)行了是否為NULL的檢查,進(jìn)行特殊處理。

 

 

析構(gòu)函數(shù):

// String的析構(gòu)函數(shù)

         String::~String(void)

{

     delete [] m_data; 

// 由于m_data是內(nèi)部數(shù)據(jù)類型,也可以寫成 delete m_data;

         }

內(nèi)部數(shù)據(jù)類型,delete

外部數(shù)據(jù)類型,[ ] delete

 

拷貝構(gòu)造函數(shù)與賦值函數(shù):

拷貝函數(shù):

位拷貝:編譯器以此方式自動(dòng)生成缺省的函數(shù),比如構(gòu)造拷貝和賦值拷貝。但是,如果函數(shù)中還有指針變量,那么缺省的函數(shù)就隱含了錯(cuò)誤。

例如:

以類String的兩個(gè)對(duì)象a,b為例,假設(shè)a.m_data的內(nèi)容為“hello”,b.m_data的內(nèi)容為“world”。

現(xiàn)將a賦給b,缺省賦值函數(shù)的“位拷貝”意味著執(zhí)行b.m_data = a.m_data

這將造成三個(gè)錯(cuò)誤:

一是b.m_data原有的內(nèi)存沒被釋放,造成內(nèi)存泄露;

二是b.m_dataa.m_data指向同一塊內(nèi)存,ab任何一方變動(dòng)都會(huì)影響另一方;

三是在對(duì)象被析構(gòu)時(shí),m_data被釋放了兩次。

混淆:

String  a(hello);

String  b(world);

String  c = a;     // 調(diào)用了拷貝構(gòu)造函數(shù),最好寫成 c(a);

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

例子:

     // 拷貝構(gòu)造函數(shù)

     String::String(const String &other)

     {   

// 允許操作other的私有成員m_data

     int length = strlen(other.m_data);  

     m_data = new char[length+1];

     strcpy(m_data, other.m_data);

}

賦值函數(shù):

// 賦值函數(shù)

     String & String::operate =(const String &other)

     {   

         // (1) 檢查自賦值

         if(this == &other)

              return *this;

        

         // (2) 釋放原有的內(nèi)存資源

         delete [] m_data;

        

         // 3)分配新的內(nèi)存資源,并復(fù)制內(nèi)容

     int length = strlen(other.m_data);  

     m_data = new char[length+1];

          strcpy(m_data, other.m_data);

        

         // 4)返回本對(duì)象的引用

         return *this;

}   

賦值函數(shù)的四個(gè)步驟:

(1) 檢查自賦值

不會(huì)寫出a = a的自賦值語句,但間接自賦值有可能發(fā)生。

// 內(nèi)容自賦值

b = a;

c = b;

a = c;  

// 地址自賦值

b = &a;

a = *b;

防止:

if(this == &other)

錯(cuò)寫成為

     if( *this == other)

(2) 釋放原有的內(nèi)存資源

(3) 分配新的內(nèi)存資源,并復(fù)制內(nèi)容

(4) 返回本對(duì)象的引用

 

F:拷貝構(gòu)造和普通構(gòu)造的區(qū)別?

Q:拷貝構(gòu)造的參數(shù)是“引用”,引用不可能是NULL;普通構(gòu)造函數(shù)參數(shù)是“指針”,需要類型檢查,判斷是否是NULL

 

String的賦值函數(shù)比構(gòu)造函數(shù)復(fù)雜得多,分四步實(shí)現(xiàn):

1)第一步,檢查自賦值。你可能會(huì)認(rèn)為多此一舉,難道有人會(huì)愚蠢到寫出 a = a 這樣的自賦值語句!的確不會(huì)。但是間接的自賦值仍有可能出現(xiàn),例如

    

// 內(nèi)容自賦值

b = a;

c = b;

a = c;  

// 地址自賦值

b = &a;

a = *b;

 

也許有人會(huì)說:“即使出現(xiàn)自賦值,我也可以不理睬,大不了化點(diǎn)時(shí)間讓對(duì)象復(fù)制自己而已,反正不會(huì)出錯(cuò)!”

他真的說錯(cuò)了。看看第二步的delete,自殺后還能復(fù)制自己?jiǎn)幔克裕绻l(fā)現(xiàn)自賦值,應(yīng)該馬上終止函數(shù)。注意不要將檢查自賦值的if語句

if(this == &other)

錯(cuò)寫成為

     if( *this == other)

2)第二步,用delete釋放原有的內(nèi)存資源。如果現(xiàn)在不釋放,以后就沒機(jī)會(huì)了,將造成內(nèi)存泄露。

3)第三步,分配新的內(nèi)存資源,并復(fù)制字符串。注意函數(shù)strlen返回的是有效字符串長度,不包含結(jié)束符‘\0’。函數(shù)strcpy則連‘\0’一起復(fù)制。

4)第四步,返回本對(duì)象的引用,目的是為了實(shí)現(xiàn)象 a = b = c 這樣的鏈?zhǔn)奖磉_(dá)。注意不要將 return *this 錯(cuò)寫成 return this 。那么能否寫成return other 呢?效果不是一樣嗎?

不可以!因?yàn)槲覀儾恢绤?shù)other的生命期。有可能other是個(gè)臨時(shí)對(duì)象,在賦值結(jié)束后它馬上消失,那么return other返回的將是垃圾。

 

 

08-22

如果不想讓別人使用編譯器編寫構(gòu)造拷貝和賦值函數(shù),可以聲明為私有:

     class A

     {

       private:

         A(const A &a);                   // 私有的拷貝構(gòu)造函數(shù)

         A & operate =(const A &a);  // 私有的賦值函數(shù)

     };

 

如果有人試圖編寫如下程序:

     A  b(a); // 調(diào)用了私有的拷貝構(gòu)造函數(shù)

     b = a;        // 調(diào)用了私有的賦值函數(shù)

編譯器將指出錯(cuò)誤,因?yàn)橥饨绮豢梢圆僮?/span>A的私有函數(shù)。

但是怎樣才能使用構(gòu)造拷貝和賦值函數(shù)呢?

虛擬函數(shù)使用:C++exams\destructor

 

在編寫派生類的賦值函數(shù)時(shí),注意不要忘記對(duì)基類的數(shù)據(jù)成員重新賦值。例如:

C++exams\base_operator

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区三区**美女毛片| 亚洲女同精品视频| 玖玖视频精品| 欧美在线你懂的| 欧美一级专区免费大片| 小处雏高清一区二区三区| 午夜一级在线看亚洲| 久久爱91午夜羞羞| 久久成人精品一区二区三区| 午夜亚洲精品| 久久乐国产精品| 麻豆freexxxx性91精品| 欧美sm视频| 欧美日韩裸体免费视频| 国产精品久久999| 国产一区二区三区四区老人| 亚洲成人资源| 这里只有精品视频| 久久国产精品一区二区| 欧美国产激情| 日韩视频一区二区| 亚洲免费在线观看| 久久全国免费视频| 欧美另类久久久品| 国产一区av在线| 亚洲免费高清视频| 欧美亚洲一区二区在线| 欧美va天堂在线| 一区二区三区高清视频在线观看| 亚洲尤物精选| 欧美福利网址| 国产精品夜夜夜| 在线不卡中文字幕| 亚洲永久免费| 欧美激情一区二区三区不卡| 亚洲一区二区三区777| 蜜桃av噜噜一区| 国产日韩精品在线| 亚洲视频在线观看免费| 欧美大尺度在线| 亚洲免费在线播放| 欧美日韩精品久久| 在线高清一区| 久久狠狠一本精品综合网| 亚洲另类视频| 免费成人高清| 国内视频一区| 欧美尤物一区| 正在播放欧美视频| 欧美激情自拍| 亚洲精品久久久久久下一站| 久久婷婷久久| 香蕉成人伊视频在线观看| 欧美日韩高清区| 亚洲精品男同| 欧美激情国产日韩| 久久亚洲图片| 伊人激情综合| 国产精品视区| 亚洲一区二区三区成人在线视频精品| 欧美福利视频| 美女啪啪无遮挡免费久久网站| 国产一区视频在线观看免费| 欧美在线免费观看视频| 亚洲一级网站| 国产精品你懂的| 香蕉av777xxx色综合一区| 亚洲性xxxx| 国产精品久久久久久久久搜平片 | 午夜精品区一区二区三| 国产精品国色综合久久| 亚洲无人区一区| 亚洲天堂av在线免费观看| 国产精品大片wwwwww| 亚洲欧美日韩国产一区二区| 亚洲性视频网站| 国产精品入口日韩视频大尺度| 亚洲女优在线| 香蕉亚洲视频| 亚洲福利一区| 亚洲人成艺术| 欧美日韩中文字幕日韩欧美| 亚洲一区一卡| 欧美一区免费| 亚洲高清不卡一区| 亚洲人体影院| 欧美午夜美女看片| 欧美在线影院在线视频| 久久精品视频在线| 亚洲国产老妈| 一本一本久久a久久精品牛牛影视| 国产精品wwwwww| 久久福利视频导航| 久热精品在线视频| 在线午夜精品| 午夜精品久久久久久99热软件| 国产综合久久久久久鬼色| 欧美激情一区二区三区在线| 欧美日韩直播| 麻豆亚洲精品| 国产精品video| 另类综合日韩欧美亚洲| 欧美成人午夜激情在线| 亚洲欧美日韩天堂一区二区| 久久综合一区二区| 先锋亚洲精品| 欧美高清在线视频观看不卡| 性色一区二区三区| 欧美成人精品福利| 久久经典综合| 欧美三日本三级少妇三2023| 久久综合给合久久狠狠狠97色69| 欧美精品播放| 久久视频在线免费观看| 欧美视频一区二区在线观看| 美女诱惑黄网站一区| 国产精品久久999| 国产精品99久久久久久久vr| 欧美一级欧美一级在线播放| 亚洲乱码视频| 久久综合狠狠综合久久激情| 欧美一级在线视频| 欧美极品欧美精品欧美视频| 久久夜色精品国产亚洲aⅴ| 欧美天天视频| 亚洲精品乱码久久久久久日本蜜臀| 国产一区二区主播在线| 中国亚洲黄色| 中文久久精品| 欧美精品高清视频| 欧美成人在线免费视频| 国产在线拍揄自揄视频不卡99| aa级大片欧美三级| 99在线|亚洲一区二区| 麻豆精品国产91久久久久久| 久久久久久有精品国产| 国产精品蜜臀在线观看| 一本久久青青| 亚洲网站在线观看| 欧美日韩一区二区精品| 亚洲精品久久久久中文字幕欢迎你| 亚洲国产视频一区二区| 老司机久久99久久精品播放免费| 久久综合网hezyo| 亚洲第一区在线观看| 久久亚洲精品欧美| 欧美jjzz| 一区二区高清视频| 欧美特黄a级高清免费大片a级| 99re66热这里只有精品4| 亚洲午夜精品网| 国产精品男女猛烈高潮激情| 亚洲一区国产精品| 久久高清一区| 狠狠爱综合网| 鲁大师成人一区二区三区| 欧美黄色日本| 一区二区三区高清在线| 国产精品黄视频| 欧美一区中文字幕| 欧美成人精品高清在线播放| 亚洲精品日韩在线观看| 欧美日韩亚洲一区二区三区四区| 在线视频欧美精品| 久久久国产91| 亚洲人体偷拍| 国产精品电影观看| 久久精品综合| 亚洲精品你懂的| 久久爱另类一区二区小说| 国语自产精品视频在线看一大j8| 麻豆精品精品国产自在97香蕉| 日韩亚洲不卡在线| 久久免费国产精品| 日韩一级大片在线| 国产热re99久久6国产精品| 久久免费黄色| 一本一道久久综合狠狠老精东影业| 欧美一区二区三区在线视频| 在线播放亚洲一区| 国产精品久久一卡二卡| 久久天天综合| 国产精品99久久久久久久女警 | 在线亚洲+欧美+日本专区| 国产日韩专区| 欧美多人爱爱视频网站| 亚洲欧美日本在线| 亚洲久久视频| 国产午夜精品久久久久久久| 欧美成人免费播放| 欧美亚洲三级| 一区二区三区高清| 亚洲第一中文字幕| 久久精品国产精品亚洲| 一本色道88久久加勒比精品| 合欧美一区二区三区| 国产精品久久久久久av下载红粉 | 亚洲欧美另类国产| 亚洲精品免费观看| 在线观看欧美黄色|