首頁>技術>

1、虛擬函式指標、虛擬函式表存放位置

同一個類只有一個虛擬函式表,類的所有物件共享該類的虛擬函式表。每個物件內部都有一個指向該類虛擬函式表的指標vptr,每個vptr的存放地址與該物件的所在位置相同,但指向同一虛擬函式表vtable。windows系統中,虛擬函式表存放在可執行檔案的常量段中,http://blog.csdn.net/vicness/article/details/3962767;linux系統中,虛擬函式表存放在可執行檔案的只讀資料段中(rodata),https://blog.csdn.net/w616589292/article/details/51250285。

(ps:通常ARM編譯器生成的可執行檔案由兩部分資料組成,分別是程式碼段和資料段。程式碼段又分為可執行程式碼段(text)和只讀資料段(rodata);資料段又分為初始化資料段(data)和未初始化資料段(bss)。)

2、空類會預設有哪些函式?空類的大小?

一個空類包括預設建構函式、複製建構函式、預設賦值函式、解構函式。空類也可以例項化,在記憶體會有獨一無二的地址,編譯器規定空類的大小為1位元組;僅含有一個虛擬函式的類的大小為4位元組,因為虛表指標佔有4個位元組地址。

3、struct與class的區別

struct在C中,不能定義函式、沒有訪問許可權的設定,只能定義資料成員變數;在C++中,與class類似,可以定義函式、實現繼承以及多型,以及有public、protected、private三種訪問許可權。C++中,struct與class的唯一區別是:struct中成員預設的訪問許可權是public,class中成員預設的訪問許可權是private。

4、型別轉換

型別轉換分為兩種,隱式轉換和顯式轉換。其中,隱式轉換(implicit conversion)是程式自動執行的,無須程式設計師介入。顯式轉換是強制轉換的,常用於不同資料型別(eg:int和size_t型別)的大小比較,分為以下四種:(1)static_cast:用於編譯器無法自動執行的型別轉換(2)const_cast:將const修飾的常量轉換為非常量,一般用於過載函式中。(3)reinterpret_cast:將變數從型別1轉換為型別2,編譯器會當作型別2,真實型別為型別1(不建議使用)。(4)dynamic_cast:將一個基類指標(或引用)轉換為派生類指標(或引用),一般用於有繼承關係的類中。例如:

class Father father;class Son son;Father* pf; //基類指標Son* ps;    //派生類指標pf=&son;ps=dynamic_cast<Son*>(pf);123456

強制型別轉換干擾了正常的型別檢查,應儘量避免使用強制型別轉換。

5、函式(或類)模板宣告與函式(或類)模板實現不能分開

模板宣告與模板實現分開時,執行程式會報錯,原因是:因為在編譯時模板並不能生成真正的二進位制程式碼(.obj檔案),而是在例項化時才會去找對應的模板宣告和實現,在這種情況下編譯器是不知道實現模板類或函式的CPP檔案的存在,所以它只能找到模板類或函式的宣告而找不到實現,而只好建立一個符號寄希望於連結程式找地址。但模板類或函式的實現並不能被編譯成二進位制程式碼,結果連結程式找不到地址只好報錯。

由template< typename T> 宣告的函式或類都意味著編譯器在當時不為它分配儲存空間,它一直處於等待狀態直到被一個模板例項告知。在編譯器和聯結器的某一處,有一機制能去掉指定模板的多重定義。所以為了容易使用,幾乎總是在標頭檔案中放置全部的模板宣告和定義。

10
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 使用mysql5.7 使用虛擬列特性最佳化查詢效能