類和動態內存分配

C++自動提供如下函數

  1.  默認構造函數
  2. 複製構造函數
  3. 賦值運算符
  4. 析構函數
  5. 地址運算符

複製構造函數和賦值運算符重載

每當程序生成了對象的副本,編譯器都將調用複製構造函數。具體來講,當函數按值傳遞對象或者返回對象時,都將使用複製夠着函數。 程序員

淺複製:默認複製構造函數,逐個複製非靜態成員,複製的是成員的值。 tcp

深複製:複製構造函數應當複製字符串並將副本的地址賦給str成員。不是僅僅複製字符串的地址。這樣在調用析構函數時就不會出現釋放已經釋放的字符串。 函數

複製構造函數和賦值運算符重載的幾個區別: this

1. 複製構造函數沒有返回值,賦值運算符返回對象的一個引用。 spa

2. 複製構造函數以前對象沒有分配內存,不須要delete 指針

3.複製構造函數會增長對象的個數 code

StringBad::StringBad(const StringBad &st)
{
     //對象個數 ++
     len = st.len;
     str = new char[len + 1];
     std::stcpy(str,st.str);
}
StringBad &StringBad::operator=(const StringBad &st)
{
     if (this == &st)
            return *this;
     delete []str;
     len = st.len;
     str  = new char [len + 1];
     std::strcpy(str,st.str);
     return *this;
}

能夠這樣避免編譯器生成默認的構造函數和賦值運算符重載函數 對象

class Queue
{
    private:
        Queue(const Queue &){}
        Queue &operator=(const Queue &){
           // return *this;
        }
}

c程序員一般使用NULL而不是0來表示一個指針爲空;用'\0'來指明字符串的結束,而不是0

初始化成員列表

語法:classname::func(int n,int m):mem1(n),mem2(m) {} 內存

做用:這些初始化工做是在對象建立時完成的,此時還未執行括號中任何代碼。 字符串

  1. 這種格式只能用於構造函數
  2. 必須用這個格式來初始化費靜態const成員(const成員復值將編譯不經過)
  3. 必須用這個格式來初始化一個引用數據成員

成員初始化順序於他們出如今類中的順序相同,於他們在初始化成員列表順序無關。

相關文章
相關標籤/搜索