1.編寫類string的建構函式、拷貝建構函式、析構函式和賦值函式
class string
;//編寫類string的建構函式、析構函式和賦值函式,已知類string的原型為:
class string
;
//1、建構函式
/*1、建構函式在構造物件時使用;
2、傳入引數的判斷;
3、物件的初始化問題。
*/
string::string(const char *str)
注意:函式過載和多型無關
那麼剛剛**中提到了typename,那麼它和class有什麼區別呢?
首先,typename可以用來定義模板,就像上面那樣,此時是可以與class替換的,他只不過是引入與class區分的關鍵字而已。
第二:就是typename可以使用為巢狀依賴型別,
class myarray
templatevoid mymethod( t myarr )
這個時候typename的作用就是告訴c++編譯器,typename後面的字串為乙個型別名稱,而不是成員函式或者成員變數,這個時候如果前面沒有typename,編譯器沒有任何辦法知道t::lengthtype是乙個型別還是乙個成員名稱(靜態資料成員或者靜態函式),所以編譯不能夠通過。
純虛函式:virtual void fun()=0;即抽象類!必須在子類實現這個函式,即先有名稱,沒有內容,在派生類實現內容。
從編譯的角度來看:
c++編譯器在編譯的時候,要確定每個物件呼叫的函式(非虛函式)的位址,這稱為早期繫結,當我們將son類的物件son的位址賦給pfather時,c++編譯器進行了型別轉換,此時c++編譯器認為變數pfather儲存的就是father物件的位址,當在main函式中執行pfather->say(),呼叫的當然就是father物件的say函式。
那麼如何定位虛表呢?編譯器另外還為每個物件提供了乙個虛表指標(即vptr),這個指標指向了物件所屬類的虛表,在程式執行時,根據物件的型別去初始化vptr,從而讓vptr正確的指向了所屬類的虛表,從而在呼叫虛函式的時候,能夠找到正確的函式,對於第二段**程式,由於pfather實際指向的物件型別是son,因此vptr指向的son類的vtable,當呼叫pfather->son()時,根據虛表中的函式位址找到的就是son類的say()函式.
正是由於每個物件呼叫的虛函式都是通過虛表指標來索引的,也就決定了虛表指標的正確初始化是非常重要的,換句話說,在虛表指標沒有正確初始化之前,我們不能夠去呼叫虛函式,那麼虛表指標是在什麼時候,或者什麼地方初始化呢?
答案是在建構函式中進行虛表的建立和虛表指標的初始化,在構造子類物件時,要先呼叫父類的建構函式,此時編譯器只「看到了」父類,並不知道後面是否還有繼承者,它初始化父類物件的虛表指標,該虛表指標指向父類的虛表,當執行子類的建構函式時,子類物件的虛表指標被初始化,指向自身的虛表。
乙個空的虛函式,具體的函式在子類中分別定義,程式一般執行時,找到類,如果它有基類,再找到它的基類,最後執行的是基類中的函式,這時,它在基類中找到的是virtual標識的函式,它就會再回到子類中找同名函式,派生類也叫子類,基類也叫父類,這就是虛函式的產生,和類的多型性的體現。
**3. 標頭檔案種的ifndef/define/endif **
防止標頭檔案被重複包含
面試總結(二)
前兩天面試了乙個嵌入式驅動開發的小夥子。碩士畢業2年左右。他做過linux和wince方面的移植工作。之前做的是車載 的方案。具體深入問下去,主要做的是一些驗證的工作,在研發上的經驗仍然不足。後來在和同去的面試官交流的時候,我其實還是願意給他機會進來的。不過他給了否定意見。原因就是他這塊經驗確實不足...
面試總結(二)
nginx四層 七層負載均衡的區別 所謂四層就是基於ip 埠的負載均衡,通過虛擬ip 埠接收請求,然後再分配到真實的伺服器 七層通過虛擬的url或主機名接收請求,然後再分配到真實的伺服器七層就是基於url等應用層資訊的負載均衡。七層負載 root www cat etc nginx conf.d t...
面試總結二
執行緒獨佔 虛擬機器棧,本地方法棧,程式計數器 執行緒共享 方法區。堆 oom out of memory 就是記憶體溢位 volatile是jvm提供的乙個輕量級的同步機制。有兩個作用 保證可見性 快取一致性協議mesi,保證有序性 禁止指令重排優化 volatile是在彙編層面加lock,使用快...