【c++基礎】類和對象 四個默認函數

1.構造函數:初始化對象所佔內存空間(成員變量)
  函數名與類名相等,不需要返回值
  
  字符串賦值:需要開闢內存空間 
  mname = new char [strlen(name) + 1]();//對象在棧上開闢(由系統開闢和釋放),而對象中的內容在堆上開闢。堆內存由用戶     開闢和釋放
  strcpy(mname,name);
  
   1.this指針:指向對象所佔的內存(不允許修改)
   2.構造析構順序:先構造的後析構(符合棧的特性先進後出)
   3.構造函數和析構函數能不能重載
      1.構造函數:可以重載
      2.析構函數:不可重載
   4.構造函數和析構函數能不能自己調用
       構造函數:不可以自己調用  
         類的成員方法 
                    依賴對象調用
                    構造函數完成後
    
     5.默認的構造函數  默認的析構函數
      CGood()
      {
      }
      ~CGood()
      {
      }      
      1.用戶提供後 系統將不會提供
      2.默認構造調用方式
        CGood good4;  //對象生成 不加括號  調用默認構造函數
        CGood good4();//函數聲明
                       
2.析構函數:釋放對象所佔資源
                     釋放堆內存

          可以自己實現調用 但不建議調用(系統會自己調用)
           調用後會退化成一個普通的成員方法
           並且系統還會再調用一個析構函數
           即同一段內存被釋放兩次(可能出現異常)

3.拷貝構造函數
  1.用一個已存在的對象構造一個相同類型的新對象
  2.形參必須使用引用對象//防止死遞歸
  3.默認拷貝構造函數
    是一個淺拷貝,如果有指針類型存在,考慮是否實現深拷貝
  淺拷貝:
  CGoods(const CGoods& rhs)
  {
      mname = rhs.name    // 多個指針指向同一段內存
      mprice = rhs.mprice;
      mamout = rhs.mamout;
  }
  深拷貝:
  CGoods(const CGoods& rhs)
  {
      mname = new char[strlen(rhs.name)+1]();
      strcpy(mname,rhs.mname);
      mprice = rhs.mprice;
      mamout = rhs.mamout;
  }
  
4.賦值運算符的重載函數
  1.作用:用一個已存在的對象給另一個相同類型已存在的對象賦值
  2.形參使用常引用const的作用:1.防止修改實參的值
                               2.接收隱式生成的臨時對象
  3.設計流程:1.自賦值判斷 
              2.釋放舊資源 
              3.開闢新資源 
              4.賦值
  自賦值判斷
  if(this == &rhs)
  {
     return *this;
  }

  CGoods & operator=(const CGoods &rhs)
  {
      cout<<this<<" :CGoods::operator= (CGoods)"<<endl;
      if(this != &rhs)
      {
          delete[] mname;
          mname = new char[strlen(rhs.mname)+1]();
          strcpy(mname,rhs.mname);
          mprice = rhs.mprice;
          mamout = rhs.mamout;
      }
      return *this;
  }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章