c++類和動態內存分配複習題

1.假設String類有如下私有成員:

class String
{
private:
    char  *str;
    int len;
    //...
};

請說出下面的構造函數有什麼問題。
a.

String::String(){ }

b.

String::String(const char * s)
{
    str = s;
    len = strlen(s);
}

c.

String::String(const char * s)
{
    strcpy(str,s);
    len = strlen(s);
}

答:a.句法是正確的,但該構造函數沒有將str指針初始化。該構造函數應將指針設置成NULL或使用new [ ]來初始化它。正確格式如下:

String::String()
{
    str = NULL;
    len = 0;
}

b.該構造函數沒有創建新的字符串,而只是賦值了原有字符串的地址。它應當使用new [ ]和strcpy( )。
正確格式如下:

String::String(const char * s)
{
    len = strlen(s);
    str = new char [len+1];
    strcpy(str,s);
}

c.它複製了字符串,但沒有給它分配存儲空間,應使用new char [len+1]來分配適當數量的內存。正確格式如 b 的代碼。
.
.

2.如果你定義了一個類,其指針成員是使用 new 初始化的,請你指出可能出現的3個問題以及如何糾正這些問題。

答:首先,當這種類型的對象過期時,對象的成員指針指向的數據仍將保留在內存中,這將佔用空間,同時不可訪問,因爲指針已經丟失。可以讓類析構函數刪除構造函數中 new 分配的內存,來解決這種問題。其次,析構函數釋放這種內存後,如果程序將這樣的對象初始化爲另一個對象,則析構函數將試圖釋放這些內存兩次,這是因爲將一個對象初始化爲另一個對象的默認初始化,將複製指針值,但不復制指向的數據,這將使兩個指針指向相同的數據。解決方法是,定義一個賦值構造函數,是初始化複製指向的數據。第三,將一個對象賦給另一個對象也將導致兩個指針指向相同的數據。解決方法是重載賦值操作符,使之賦值數據,而不是指針。

3.如果沒有顯示地提供類方法,編譯器將自動生成哪些類方法?請描述這些隱式生成的函數的行爲。
答:c++自動提供下面的成員函數:

  • 默認構造函數
  • 賦值構造函數
  • 賦值構造函數
  • 默認析構函數
  • 地址操作符

默認構造函數不能完成任何工作,但使得能聲明數組和未初始化的對象。
默認複製構造函數和默認賦值操作符使用成員賦值。
默認析構函數不完成任何工作。
隱式地址操作符返回調用對象的地址(即this指針的值)。

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