【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;
  }

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