8. 重載(overload)、重寫(override,有的書也叫做“覆蓋”)、重定義(redefinition)的區別? 重載:同一個空間名字, 允許存在多個同名函數,但是函數的參數表不同; 覆蓋:不同空間名字,子類重新定義父類虛函數的方法; 重定義:也叫隱藏,子類與父類的函數同名,用于隱藏父類函數; 函數重載時,我們靠什么來區別重載的函數? 只能靠參數而不能靠函數的返回值來區分重載函數; 重載運算符時應該注意什么? ·不能改變c++中內部數據類型(如int ,char 等); ·不能重載“.”,“.”對類中任何成員有效,成為一種標準用法; ·不能用c++中沒有用到的符號; ·對已存在的符號進行重載,不能改變其優先級; 9. In C++, what does "explicit" mean? what does "protected" mean? 【標準答案】c++中的explicit關鍵字用來修飾類的構造函數,表明該構造函數是顯式的,在某些情況下,我們要求類的使用者必須顯示調用類的構造函數時就需要使用explicit,反之默認類型轉換可能會造成無法預期的問題。protected控制的是一個函數對一個類的成員(包括成員變量及成員方法)的訪問權限。protected成員只有該類的成員函數及其派生類的成員函數可以訪問。 10. 重復多次fclose一個打開過一次的FILE fp指針會有什么結果,并請解釋。(等價于free(p),同一個指針不能釋放內存兩次) 【參考答案】考察點:導致文件描述符結構中指針指向的內存被重復釋放,進而導致一些不可預期的異常 11. c++中的內聯函數(inline):內聯函數省去的函數調用時間是以代碼膨脹為代價的;(內聯函數不能太長,也不能有循環語句) 對于一個頻繁使用的短小的函數, c中用宏定義,c++中用內聯函數; 12. c++中的虛函數與純虛函數(virtual ): 虛函數若果繼承類想要重新定義基類的方法,用virtual定義方法,使用動態聯編; 13. 多態類中的虛函數表是Compile-Time,還是Run-Time時建立的? 虛擬函數表是在編譯期就建立了,各個虛擬函數這時被組織成了一個虛擬函數的入口地址的數組. 而對象的隱藏成員--虛擬函數表指針是在運行期--也就是構造函數被調用時進行初始化的,這是實現多態的關鍵。 構造函數不能是虛函數,只能析構函數為虛函數;如果析構函數不是虛函數,則派生類的析構函數用不上,會導致內存泄露; 14. VC中,編譯工具條內的Debug與Release選項是什么含義? Debug是調試版本,包含調試信息,不做任何優化,以便程序員調試程序(需要相應的運行庫); Release是發布版本,經過優化,使得程序在代碼大小和運行速度上都是最優的,以便用戶很好的使用,如果不需要運行庫,可以直接運行; 15. const與#define 比較: const常量有數據類型,而宏常量沒有數據類型; 編輯器可以對const常量進行類型安全檢查,對宏只是字符替換,不能進行類型安全檢查,容易產生不可預測的錯誤; 16. 你覺得如果不使用常量,直接在程序中填寫數字或字符串,將會有什么麻煩? 【參考答案】(1)程序的可讀性(可理解性)變差。程序員自己會忘記那些數字或字符串是什么意思,用戶則更加不知它們從何處來、表示什么。 (2)在程序的很多地方輸入同樣的數字或字符串,難保不發生書寫錯誤。 (3)如果要修改數字或字符串,則會在很多地方改動,既麻煩又容易出錯。 17. 有了malloc/free,為啥還要new/delete; Malloc()和free()是c/c++的標準庫函數,無法自動執行構造和析構函數 new()/delete()是運算符,在編輯器的控制內,new可以自動完成內存分配與初始化;delete()可以自動完成清理和釋放內存工作; 18. 為什么需要使用堆,使用堆空間的原因? 【參考答案】直到運行時才知道一個對象需要多少內存空間;不知道對象的生存期到底有多長。 19. C++是不是類型安全的? 不是,不同的指針類型之間可以強制類型轉化(reinterpret cast); 20. const 符號常量; (1)const char p -> p是一個非常量指針,指向一個常量字符; (2)char const p -> 同1 (3)char const p -> p是一個常量指針,指向一個字符; 21. const float EPSINON = 0.00001; if ((x >= - EPSINON) && (x <= EPSINON) 不可將浮點變量用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”此類形式。 22. float a,b,c,問等式(a+b)+c==(b+a)+c和(a+b)+c==(a+c)+b能否成立? 【參考答案】兩者都不行。 在比較float或double時,不能簡單地比較。由于計算誤差,相等的概率很低。應判斷兩數之差是否落在區間(-e,e)內。這個e應比浮點數的精度大一個數量級 22. C++里面是不是所有的動作都是main()引起的?如果不是,請舉例。 答; 靜態變量和全局變量的分配早在main之前完成, 全局對象是在Main開始之前就分配了的 全局對象的構造函數就在Main開始之前就執行了! 23. _LINE_ , _FILE_,是系統預定義宏: 答:cout<<_FILE_< 24. sprintf()strcpy(),memcpy()函數的區別: 答:sprintf:操作對象可以是任意類型的數據,但是目的對象是字符串;可以實現其他類型數據到字符串的轉化;若原操作數是字符 串,并且指定%s格式符,也可以實現字符串的拷貝; strcpy:操作對象是字符串,完成從源字符串到目的字符串的拷貝功能; memcpy():完成內存拷貝,操作對象可以是任意數據類型;將一個內存塊的內容拷貝到另一內存塊,內存塊由其首地址和長度確定。 25.c與c++中static用法的區別: c中:見我的博文extern,static,const修飾變量的用法 c++中用static 修飾類中的函數,則該函數不能被對象調用,只能由類直接調用; 用static修飾類的數據成員,則該變量屬于類,不屬于某個對象; 編程題: 1. 用C++寫個程序,如何判斷一個操作系統是16位還是32位的? 答:定義一個指針p,打印sizeof(p);如果是4,則是32位,若是2,則是16位;(指針p所用內存額字節數通常為一個機器字長) 2. 用C++寫個程序,如何判斷一個操作系統是16位還是32位的?不能用sizeof()函數。 Int a = ~0; if( a>65536 ) { cout<<"32 bit"< } else { cout<<"16 bit"< } 3. 當一個類A 中沒有聲命任何成員變量與成員函數,這時sizeof(A)的值是多少, 如果不是零,請解釋一下編譯器為什么沒有讓它為零。 答:sizeof(A)=1; 這是被編譯器安插進去的一個字節,這樣就使得這個空類的兩個實例得以在內存中配置獨一無二的地址。如果是零的話,聲明一個class A[10]對象數組,而每一個對象占用的空間是零,這時就沒辦法區分A[0],A…了。 4. char str1[] = "abc"; char str2[] = "abc"; 在棧區,str1,str2,str3,str4是數組有不同內存地址,賦值都為abc; const char str3[] = "abc"; 同上;同時此數組的數據區不能改變; const char str4[] = "abc"; const char str5 = "abc"; 兩個不同的指針指向常量區相同的地址 const char str6 = "abc"; char str5 = "abc"; char str6 = "abc"; cout << (str1 == str2) << endl; //true or false cout << (str3 == str4) << endl; cout << (str5 == str6) << endl;