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

分享

String普通構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)和賦值函數(shù)實(shí)現(xiàn)

 哈飛揚(yáng) 2013-06-04
  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; // 用于保存字符串
};


String::String(const char *str)//普通構(gòu)造函數(shù)
{
 if(NULL == str)
 {
  m_data = new char[1];
  m_data[0] = '\0';
 }
 else
 
  m_data = new char[strlen(str)+1];
  strcpy(m_data,str);
 }
}

String::~ Stirng(void)//析構(gòu)函數(shù)
{
 delete []m_data;
// delete m_data;
}

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

 m_data = new char[strlen(other.m_data)+1];
 strcpy(m_data,other.m_data); 
}

String & String::operate=(const String &other) //賦值語句
{
 if(this == &other)
 
  return *this;
 
 delete []m_data;
 
 m_data = new char[strlen(other.m_data)+1];
 strcpy(m_data,other.m_data);
 return *this;
}
說明:
1)構(gòu)造函數(shù)是一種特殊函數(shù),而拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù)。類X的構(gòu)造函數(shù)的第一個(gè)參數(shù)必須為X&,或者const X&;除了第一個(gè)參數(shù)外,構(gòu)造函數(shù)要么不存在其他參數(shù),如果存在其他參數(shù),其他參數(shù)必須有默認(rèn)值。一個(gè)類可以有多個(gè)拷貝構(gòu)造函數(shù)。
      它的形式如下:   X::X(X& x)   X::X(const X& x)   X::X(X& x, int a = 0, int b = 1…) 
2)什么時(shí)候會調(diào)用拷貝構(gòu)造函數(shù)?  
      以下三種情況出現(xiàn)時(shí),會調(diào)用一個(gè)類的拷貝構(gòu)造函數(shù): 
       a) 用一個(gè)已經(jīng)實(shí)例化了的該類對象,去實(shí)例化該類的另外一個(gè)對象;  
       b) 用該類的對象傳值的方式作為一個(gè)函數(shù)的參數(shù);  
       c) 一個(gè)函數(shù)返回值為該類的一個(gè)對象。
        例如:
                CA a;            
              // CA b();   // 不能用這種方式聲明CA的對象b!           
               CA c(10, 10);             
               CA d(c);  // 情況1) -> 調(diào)用拷貝構(gòu)造函數(shù)            
               int anInt = someFun1(c);   // 情況2) -> 調(diào)用拷貝構(gòu)造函數(shù)           
               CA e = someFun2(11, 11); // 情況3) -> 調(diào)用拷貝構(gòu)造函數(shù)
3)什么時(shí)候必須要顯式聲明拷貝構(gòu)造函數(shù)?
         如果有成員變量以指針形式存在,涉及動態(tài)內(nèi)存分配等情況下,一定要顯式聲明拷貝構(gòu)造函數(shù)。要注意到,如果需要顯式定義拷貝構(gòu)造函數(shù),那么  通常都是需要同時(shí)定義析構(gòu)函數(shù)(因?yàn)橥ǔI婕傲藙討B(tài)內(nèi)存分配),至于是否必須重載操作符“=”,要視情況而定。
        例如:
               class CA  { 
                 public:          
                        Point* _point;   
                 public:   
                       CA(const Point*);     
                       // 需要增加的拷貝構(gòu)造函數(shù)           
                       CA(const CA&);           
                       // 需要增加的析構(gòu)函數(shù)           
                       virtual ~CA();           
                       // 需要增加的拷貝賦值函數(shù)           
                       CA& operator = (const CA&); 
               };
               int main(void)  {            
                      Point apoint(1, 2);           
                     CA ca(&apoint);           
                     ca.printCoordinates();             
                     CA cb(ca);    // 調(diào)用拷貝構(gòu)造函數(shù)
                     CA cc = cb; // 調(diào)用拷貝賦值函數(shù)
                     ..............
               }
4)缺省構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、拷貝賦值操作符和析構(gòu)函數(shù)是特殊成員函數(shù)。
5)構(gòu)造函數(shù)不能有返回類型,也不能由virtual, const, static 和 volatile來修飾。但可以由inline來修飾,事實(shí)上隱式構(gòu)造函數(shù)就是用inline來修飾的。inline表示編譯時(shí)展開,通常速度塊;virtual表示運(yùn)行時(shí)綁定,通常意味著靈活。
6)類中存在虛函數(shù)或者有虛基類的情況下需要顯式聲明構(gòu)造函數(shù)。拷貝構(gòu)造函數(shù)也是如此。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多