C 編譯器構造類的潛規則

2021-08-11 05:29:15 字數 1088 閱讀 9981

c++在設計類的時候,沒有顯式定義建構函式和析構函式時,c++編譯器會自動提供一下特殊成員函式:

1.預設建構函式

2.預設析構函式

3.複製建構函式

4.賦值運算子過載

5.位址運算子過載

他們的特性如下:

1.c++編譯器提供的預設建構函式沒有形參、函式體內也沒有任何可執行的**,只是提供了乙個空殼,供程式編譯通過。

2.c++編譯器提供的預設析構函式同樣沒有形參、函式體內也沒有任何實際可執行的**。

3.預設複製建構函式:預設複製建構函式會將已有物件中的成員資料逐個複製到被初始化的物件中,但是static成員不會被做這樣的操作,其實深入到記憶體中思考,static成員本質上並不是類中的成員。

假設實現了乙個test類,並且已經定義了乙個test t物件,則以下幾種初始化物件的方式會呼叫複製建構函式:test t1(t); test t2 = t; test t3 = test(t); test *t4 = new test(t);

預設複製建構函式引發的問題:如果乙個成員為指標變數,並且這個指標變數初始化物件呼叫建構函式時動態地申請了堆記憶體空間,顯然,當物件的作用域結束之後,需要在析構函式中釋放這段空間保證記憶體不會洩露;由於預設複製建構函式將物件中的成員挨個複製賦值,導致用存在的物件給新開闢的物件初始化時,他們會得到同樣的一段堆記憶體空間,並且這段堆記憶體空間會在這兩個物件的作用於結束之後被釋放兩次,這會給程式帶來災難性的麻煩。

4.賦值運算子:當使用已有的物件給另乙個同型別的物件賦值時,在沒有過載=運算子的情況下,c++編譯器會預設為這種**提供乙個賦值操作,即將已有物件的成員挨個賦值給被賦值物件的成員。需要注意的是,在初始化物件的時候這麼做並不一定是賦值運算子操作,這需要取決於編譯器的實現,老式的c++編譯器在編譯下述**:test t1 = 6的時候,會先建立乙個臨時的test物件,並用int型資料6初始化這個物件,然後再呼叫複製建構函式將這個臨時物件的成員挨個複製給呼叫物件。

5.取位址運算子過載模擬於ansi c結構的取位址操作。

編譯器規則

類似這樣的錯誤 c program files microsoft visual studio 10.0 vc atlmfc include afxver h 81 fatal error c1189 error please use the md switch for afxdll builds。...

編譯器的符號修飾規則

編譯器編譯源 生成目標檔案時,需要為每乙個變數 函式生成符號,儲存到符號表。在符號表中,每乙個符號必須唯一,因此要求源 中不能存在與其它檔案中的變數名 函式名相同的函式,包括使用到的庫中的函式。為了解決符號名衝突的問題,編譯器會對源 中的符號進行修飾,如unix下編譯生成的符號會在符號名前加下劃線 ...

C 編譯器 虛基類及其派生類的建構函式

c 編譯器 虛基類及其派生類的建構函式 如果虛基類中宣告了非預設形式的建構函式,並且沒有宣告預設形式的建構函式,那麼在整個繼承關係中,直接或間接繼承虛基類的所有派生類,都必須在建構函式的成員初始化類表中列出對虛基類的初始化。輸出 a1 display 1 看起來在建立c1的物件時有三次初始化a1的i...