C 常見知識點複習 賦值建構函式

2021-07-16 10:07:45 字數 1435 閱讀 6498

(1) 乙個空類或者空類物件的大小?

由於物件在記憶體中必須占有一定的空間,因此,即使類是空的,這個類的物件也要占用一定的空間。vs和g++中空類的大小都是1。

(2) 在空類中新增建構函式和析構函式,這個類物件的大小?

這裡要明確的是:乙個類物件在記憶體中包含哪些成員?在c++中,類物件中只有非靜態的資料成員和虛表指標(如果有的話)。也就是說,雖然函式好像包含在物件中,但是,經過編譯之後,類的函式就會編譯成像c語言一樣的全域性函式,只是通過特定的物件進行呼叫。因此,在空類中新增函式並不會引起類物件大小的變化。

(3) 複製建構函式

書中給了下面這樣的**:

class

a a(a other)

void

print()

};int

_tmain(int argc, _tchar* argv)

我們必須知道的是,複製建構函式有三個場景下會被呼叫:

錯誤: 無效的建構函式:您要的可能是『a (const a&)』
因此,複製建構函式的引數必須是const的引用,原因如下:

為下面的cmystring新增賦值運算子函式。

class

cmystring ;

賦值運算子需要注意的問題是:

因此,cmystring的賦值運算子函式如下:

cmystring& cmystring::operator=(const cmystring &str)

delete m_pdata; //釋放原來的儲存空間

m_pdata = null;

m_pdata = new

char[strlen(str.m_pdata) + ]; //分配跟引數一樣多的儲存空間,多申請乙個位元組是為了儲存'0'

strcpy(m_pdata, str.m_pdata); //將引數的內容拷貝進來

return *this;

}

那麼,什麼是異常安全性呢?

異常安全必須滿足兩個條件:

如上的**,如果在new char時,記憶體不足導致丟擲異常,那麼cmystring物件不再保有任何資料,如果物件出了作用域時,再次呼叫析構函式,就會發生未定義的錯誤。為了實現異常,主要的思路是,要使記憶體不足時,物件還是保持原來的狀態。因此,書中給出的方法是,先用引數建立乙個臨時物件,將臨時物件中的內容與物件進行交換,如果記憶體不足,就會在建立臨時物件時失敗,丟擲異常,並沒有修改物件的狀態,而且,當臨時物件出了作用域時,就會呼叫析構函式,釋放物件原來的空間。可以看出,這裡將釋放原來的儲存空間的操作和分配新儲存空間的操作都交給了這個臨時物件。

cmystring& cmystring::operator=(const cmystring &str)

return *this;

}

c 知識點 賦值運算子,構造拷貝函式

是雖然使用了 但是實際上使用物件p來建立乙個新的物件p1。也就是產生了新的物件,所以呼叫的是拷貝建構函式。首先宣告乙個物件p2,然後使用賦值運算子 將p的值複製給p2,顯然是呼叫賦值運算子,為乙個已經存在的物件賦值 說到拷貝建構函式,就不得不提深拷貝和淺拷貝。通常,預設生成的拷貝建構函式和賦值運算子...

建構函式知識點

1 建構函式必須與類名相同,並且不能有返回值 返回值也不能為void 若在建構函式前面加上void,編譯器會把它認為是方法,而不是建構函式 當然在new的時候,也不能自動呼叫 2 每個類可以有多個建構函式,如果人為定義了建構函式,編譯器不會建立預設的建構函式。3 建構函式在物件例項化的時候被自動呼叫...

C 知識點複習

static static變數只能初始化一次 include include using namespace std void fun int i int main 輸出為 0 00因為static變數只初始化一次,static int value i這句話只執行一次,也就是fun 0 的時候執行。...