91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中的六個函數

發布時間:2020-10-22 18:29:26 來源:腳本之家 閱讀:119 作者:XNQC 欄目:編程語言

一、構造函數

   在C++中,構造函數是六個函數中的第一個,當一個對象被創建時,在它的整個周期中,是一個由生到死的過程,即構造函數創建對象,析構函數析構對象。在對象被創建時,調用構造函數創建一個對象,這是對象的創建過程。在C++中,當你創建一個對象時需要調用構造函數創建對象,在類中,有默認的構造函數,當然你也可以去使用構造函數去創建對象,對數據進行初始化。看下面的例子:

class Base 
{
  public:
    Base()
    {}
    Base(int a=0):num(a)
    {}
    Base(int a=0,int b=0):num(a),age(b)
    {}
    Base(int a=0,int b=0,double c=0.0):num(a),age(b),slaroy(c)
    {}
  private:
    int num;
    int age;
    double slaroy;
};

在上面的構造函數中,構造函數必須與類名相同,構造函數是無類型的,第一個構造函數是默認的構造函數,第二個構造函數是只對一個數據成員進行初始化,其它的數據成員是隨機值。第二個構造函數是對兩個數據成員進行初始化,其它的數據成員為隨機值。第三個構造函數是對所有的數據成員進行初始化。

二、析構函數

   在C++中,構造函數是創建一個對象時,那么析構函數則是這個對象由生到死的死亡過程。同時析構函數也在析構對象時可以將已經分配的內存空間進行回收。

class Base
{
  public:
    Base()
    {}
    Base()
    {
     p= new char[strlen("default")+1];
     strcpy(p,"default");
    }
    ~Base()
    {
      if(p != NULL)
      {
       delete[] p;
       p=NULL;
      }
    }
  private:
    char *p;
};

        析構函數如上所示,它無類型、無參數、無返回值,如果在構造對象時沒有進行空間的開辟內存的分配時,那么

析構函數如同默認的析構函數一樣,如果進行了內存的分配時,當一個對象被析構時同時還要對其所分配的內存進行回收,否則就會造成內存泄漏。

三、拷貝構造函數

  在C++中,如果在構造函數中有申請內存的操作,且在其他函數中出現對象的拷貝,那么就會需要拷貝構造函數。

class Base
{
  public:
    Base()
    {}
    Base()
    {
     p= new char[strlen("default")+1];
     strcpy(p,"default");
    }
    Base(const Base &s)
    {
     p= new char[strlen(s.p)+1];
     strcpy(p,s.p);
    }
    ~Base()
    {
      if(p != NULL)
      {
       delete[] p;
       p=NULL;
      }
    }
  private:
    char *p;
}; 
int main()
{
  Base a;
  Base b(a);
  return 0;
}

       由于在主函數中出現了對對象的拷貝賦值,那么就需要拷貝構造函數,如果沒有拷貝構造函數,則會使用默認的

拷貝構造函數,那么此時進行的是淺拷貝,那么會產生析構函數對內存重復釋放的錯誤。那么此時就需要進行深拷貝

操作,重新編寫拷貝構造函數對對象進行拷貝賦值。而在編寫拷貝構造函數時要注意參數必須是“&”引用傳遞,否則

則是語法錯誤。

四、賦值函數

   在C++中,賦值函數為第四個函數,如果在構造函數中有申請內存的操作,且在其他程序中有兩個對象直接或間接

進行賦值操作,就需要賦值函數。

class Base
{
  public:
    Base()
    {}
    Base()
    {
     p= new char[strlen("default")+1];
     strcpy(p,"default");
    }
    Base(const Base &s)
    {
     p= new char[strlen(s.p)+1];
     strcpy(p,s.p);
    }
    Base& operator=(const Base &s)
    {
      if(&s==this)
       return *this;
      delete[] p;
      p= new char[strlen(s.p)+1];
      strcpy(p,s.p);
      return *this;
    }
    ~Base()
    {
      if(p != NULL)
      {
       delete[] p;
       p=NULL;
      }
    }
  private:
    char *p;
}; 
int main()
{
  Base a,c;
  Base b(a);
  c=a;
  return 0;
}

     由于在主函數中進行了對象的賦值操作,如果沒有對“=”運算符進行重載定義,則會產生兩次釋放同一個內存的

操作的錯誤。在“=”重載操作中,如果涉及到指針操作,則必須判斷兩個對象是否為同一個對象即自賦值操作,否則

當進行釋放指針的操作時,就可能產生錯誤。然后要用delete釋放原有的內存資源,否則將造成內存泄漏。

五、對一般對象的取址函數

  在C++中,對一般對象的取址函數為第五個函數。

class Base
{
  public:
    Base* operator&()
    {
     return this;
    }
}; 

在一般對象的取址函數是直接返回該對象的地址,則為取其地址。

六、對常對象的取址函數

  在C++中,對常對象的取址函數為第六個函數。

class Base
{
  public:
    const Base* operator&() const
    {
     return this;
    }
};

   在常對象的取址函數也是直接返回該常對象的地址,則為取其地址。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长子县| 辽阳市| 江北区| 凌海市| 宜黄县| 临安市| 大兴区| 阿坝县| 英山县| 曲阳县| 南川市| 延庆县| 郑州市| 威宁| 乳山市| 巴里| 福安市| 甘泉县| 洪洞县| 澄迈县| 鄂托克前旗| 东台市| 尤溪县| 新宁县| 平果县| 长沙县| 刚察县| 汉沽区| 青河县| 浦县| 邵阳县| 仙桃市| 安乡县| 吴江市| 正蓝旗| 岚皋县| 丰顺县| 屯留县| 荥阳市| 大洼县| 成武县|