2012年8月26日學習筆記---c++筆試題之一

什麼時候需要自己定義拷貝構造函數

在C++中,下面三種對象需要調用拷貝構造函數(有時也稱“複製構造函數”):

  1) 一個對象作爲函數參數,以值傳遞的方式傳入函數體;

  2) 一個對象作爲函數返回值,以值傳遞的方式從函數返回;

  3) 一個對象用於給另外一個對象進行初始化(常稱爲複製初始化);

        通常的原則是:①對於凡是包含動態分配成員或包含指針成員的類都應該提供拷貝構造函數;②在提供拷貝構造函數的同時,還應該考慮重載"="賦值操作符號。

   深度探索c++對象模型一書中有提到:
    必須使用初始化成員列表的情況:
    1) 初始化一個reference成員
   2) 初始化一個const成員
 3) 調用一個基類的構造函數,而該函數有一組參數
 4) 調用一個數據成員對象的構造函數,而該函數有一組參數
    除了一般成員很多的時候,都要儘可能使用初始化列表
特殊數據類型成員變量的初始化  

3 什麼是常對象?
      C++常數據成員精講—const關鍵字
4

靜態函數存在的意義?

答:1靜態私有成員在類外不能被訪問,可通過類的靜態成員函數來訪問;

2當類的構造函數是私有的時,不像普通類那樣實例化自己,只能通過靜態成員函數來調用構造函數。

     C++靜態成員函數小結
   (待續...)
5

不允許重載的5個運算符是哪些?

答:1.    .*(成員指針訪問運算符號)

2.    ::域運算符

3.    sizeof長度運算符號

4.    ?:條件運算符號

5.  .(成員訪問符)

6  
   深拷貝和淺拷貝的定義可以簡單理解成:如果一個類擁有資源(堆,或者是其它系統資源),當這個類的對象發生複製過程的時候,這個過程就可以叫做深拷貝,反之對象存在資源但複製過程並未複製資源的情況視爲淺拷貝。
7  

類成員函數的重載、覆蓋和隱藏區別

答案:

成員函數被重載的特徵:

1)相同的範圍(在同一個類中);

2)函數名字相同;

3)參數不同;

4virtual關鍵字可有可無。

覆蓋是指派生類函數覆蓋基類函數,特徵是:

1)不同的範圍(分別位於派生類與基類);

2)函數名字相同;

3)參數相同;

4)基類函數必須有virtual關鍵字。

“隱藏”是指派生類的函數屏蔽了與其同名的基類函數,規則如下:

1)如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。

2)如果派生類的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)
8    如何定義和實現一個類的成員函數爲回調函數?

答:所謂的回調函數,就是預先在系統對函數進行註冊,讓系統知道這個函數的存在,以後,當某個事件發生時,再調用這個函數對事件進行響應。

定義一個類的成員函數時在該函數名前加CALLBACK即將其定義爲回調函數,函數的實現和普通成員函數沒有區別

9    抽象類不會產生實例,所以不需要有構造函數。
10  從一個模板類可以派生新的模板類,也可以派生非模板類。 對
11  delete與 delete []區別:

delete只會調用一次析構函數,而delete[]

12  繼承優缺點。會調用每一個成員的析構函數。

1、類繼承是在編譯時刻靜態定義的,且可直接使用,

2、類繼承可以較方便地改變父類的實現。

缺點:

1、因爲繼承在編譯時刻就定義了,所以無法在運行時刻改變從父類繼承的實現

2、父類通常至少定義了子類的部分行爲,父類的任何改變都可能影響子類的行爲

3、如果繼承下來的實現不適合解決新的問題,則父類必須重寫或被其他更適合的類替換。這種依賴關係限制了靈活性並最終限制了複用性。

13    一個類的構造函數和析構函數什麼時候被調用,是否需要手工調用?

答:構造函數在創建類對象的時候被自動調用,析構函數在類對象生命期結束時,由系統自動調用。
14 何時需要預編譯源代碼

預編譯代碼有助於在開發週期中縮短編譯時間,特別是在以下情況中:

  • 總是使用不經常改動的大型代碼體。

  • 程序由多個模塊組成,所有模塊都使用一組標準的包含文件和相同的編譯選項。在這種情況下,可以將所有包含文件預編譯爲一個預編譯頭。

用於創建預編譯頭文件的第一次編譯所花費的時間比後面的編譯稍長一些。通過包含預編譯代碼可以加快後面的編譯速度。

C 和 C++ 程序都可以預編譯。在 C++ 編程中,常見的做法是將類接口信息分別放到不同的頭文件中。此後就可以將這些頭文件包含在使用該類的程序中。通過預編譯這些頭文件,可以縮短程序的編譯時間。

說明:

儘管每個源文件只能使用一個預編譯頭 (.pch) 文件,但在一個項目中可以使用多個 .pch 文件。

15 多態的作用?

主要是兩個:

1. 隱藏實現細節,使得代碼能夠模塊化;擴展代碼模塊,實現代碼重用;

2. 接口重用:爲了類在繼承和派生的時候,保證使用家族中任一類的實例的某一屬性時的正確調用

16  虛擬函數與普通成員函數的區別?內聯函數和構造函數能否爲虛擬函數?

答案:區別:虛擬函數有virtual關鍵字,有虛擬指針和虛函數表,虛擬指針就是虛擬函數的接口,而普通成員函數沒有。內聯函數和構造函數不能爲虛擬函數

17 在什麼時候需要使用“常引用”? 

如果既要利用引用提高程序的效率,又要保護傳遞給函數的數據不在函數中被改變,就應使用常引用

18 引用與指針有什麼區別?

答 、1) 引用必須被初始化,指針不必

2) 引用初始化以後不能被改變,指針可以改變所指的對象。

3) 不存在指向空值的引用,但是存在指向空值的指針。

19 全局變量和局部變量在內存中是否有區別?如果有,是什麼區別?

答 、全局變量儲存在靜態數據區,局部變量在棧中。

20 SWITH(表達式),表達式可以是整型、字符型以及枚舉類型等表達式

21 如何引用一個已經定義過的全局變量?

答 、可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變量,假定你將那個變量寫錯了,那麼在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那麼在編譯期間不會報錯,而在連接期間報錯

22 對於一個頻繁使用的短小函數,在C語言中應用什麼實現,在C++中應用什麼實現?

答 、c用宏定義,c++inline
23 C++是不是類型安全的?  

答案:不是。因在存在指針,兩個不同類型的指針之間可以強制轉換(用reinterpret cast) 

24  簡述數組與指針的區別?

數組要麼在靜態存儲區被創建(如全局數組),要麼在棧上被創建

指針可以隨時指向任意類型的內存塊。

(1)修改內容上的區別

char a[] = “hello”;

a[0] = ‘X’;

char *p = “world”; // 注意p 指向常量字符串

p[0] = X; //編譯器不能發現該錯誤,運行時錯誤 ******************

(2) 用運算符sizeof 可以計算出數組的容量(字節數)。sizeof(p),p 爲指針得到的是一個指針變量的字節數,而不是p 所指的內存容量。

25 C++函數中值的傳遞方式

有三種方式:值傳遞、指針傳遞、引用傳遞

26  extern“C”有什麼作用?

extern C”是由C++提供的一個連接交換指定符號,用於告訴C++這段代碼是C函數。這是因爲C++編譯後庫中函數名會變得很長,與C生成的不一致,造成C++不能直接調用C函數,加上extrenc”後,C++就能直接調用C函數了。

extern C”主要使用正規DLL函數的引用和導出C++包含C函數或C頭文件時使用。使用時在前面加上externc關鍵字即可。

27 SendMessage和PostMessage有什麼區別

答案:SendMessage是阻塞的,等消息被處理後,代碼才能走到SendMessage的下一行。PostMessage是非阻塞的,不管消息是否已被處理,代碼馬上走到PostMessage的下一行。

28    #if!defined(AFX_…_HADE_H)

#define(AFX_…_HADE_H)

……

#endif作用?

防止該頭文件被重複引用。

29  在定義一個宏的時候要注意什麼?

       定義部分的每個形參和整個表達式都必須用括號括起來,以避免不可預料的錯誤發生

30 strcpy()和memcpy()的區別?

       strcpy()和memcpy()都可以用來拷貝字符串,strcpy()拷貝以’\0’結束,但memcpy()必須指定拷貝的長度

31 說明define和const在語法和含義上有什麼不同?

(1)   #define是C語法中定義符號變量的方法,符號常量只是用來表達一個值,在編譯階段符號就被值替換了,它沒有類型;

(2)   Const是C++語法中定義常變量的方法,常變量具有變量特性,它具有類型,內存中存在以它命名的存儲單元,可以用sizeof測出長度。

32  說出字符常量和字符串常量的區別,並使用運算符sizeof計算有什麼不用?

字符常量是指單個字符,字符串常量以‘\0’結束,使用運算符sizeof計算多佔一字節的存儲空間。

33  簡述全局變量的優缺點?

全局變量也稱爲外部變量,它是在函數外部定義的變量,它屬於一個源程序文件,它保存上一次被修改後的值,便於數據共享但不方便管理,易引起意想不到的錯誤

34 總結static的應用和作用?(**************************)

(1)函數體內static變量的作用範圍爲該函數體,不同於auto變量,該變量的內存只被分配一次,因此其值在下次調用時仍維持上次的值;

void fun1()

{

       static int a = 0;

       int b = 0;

 

       int sum_a  = 0;

       sum_a = sum_a + a++;

 

       int sum_b = 0;

       sum_b =sum_b + b++;

       cout << sum_a << "     " << sum_b << endl;

}

 

int main(int argc, char*argv[])

{

       int i = 0;

       while( i < 10 )

       {

              fun1();

              i++;

       }

       return 0;

} //  這個例子中 sum_a是一直在累加。而sum_b 一直是0

(2)在模塊內的static全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問;

(3)在模塊內的static函數只可被這一模塊內的其它函數調用,這個函數的使用範圍被限制在聲明它的模塊內;

(4)在類中的static成員變量屬於整個類所擁有,對類的所有對象只有一份拷貝;

(5)在類中的static成員函數屬於整個類所擁有,這個函數不接收this指針,因而只能訪問類的static成員變量。

35   什麼是指針?談談你對指針的理解?

指針是一個變量,該變量專門存放內存地址;

指針變量的類型取決於其指向的數據類型,在所指數據類型前加*

指針變量的特點是它可以訪問所指向的內存。
36  什麼是常指針,什麼是指向常變量的指針?

常指針的含義是該指針所指向的地址不能變,但該地址所指向的內容可以變化,使用常指針可以保證我們的指針不能指向其它的變量,

指向常變量的指針是指該指針的變量本身的地址可以變化,可以指向其它的變量,但是它所指的內容不可以被修改。指向長變量的指針定義。

37  函數指針和指針函數的區別?

函數指針是指指向一個函數入口的指針;

指針函數是指函數的返回值是一個指針類型。

Debug版本和Release版本的區別

38  assert()的作用?

ASSERT()是一個調試程序時經常使用的宏,在程序運行時它計算括號內的表達式,如果表達式爲FALSE (0), 程序將報告錯誤,並終止執行。如果表達式不爲0,則繼續執行後面的語句。這個宏通常用來判斷程序中是否出現了明顯非法的數據,如果出現了終止程序以免導致嚴重後果,同時也便於查找錯誤。

39 類的聲明和實現的分開的好處

40  windows消息系統由哪幾部分構成?

由一下3部分組成:

1.    消息隊列:操作系統負責爲進程維護一個消息隊列,程序運行時不斷從該消息隊列中獲取消息、處理消息;

2.    消息循環:應用程序通過消息循環不斷獲取消息、處理消息。

3.    消息處理:消息循環負責將消息派發到相關的窗口上使用關聯的窗口過程函數進行處理。

41 什麼是UDP和TCP的區別是什麼?

TCP的全稱爲傳輸控制協議。這種協議可以提供面向連接的、可靠的、點到點的通信。

UDP全稱爲用戶報文協議,它可以提供非連接的不可靠的點到多點的通信。

42  進程間主要的通訊方式?

信號量,管道,消息,共享內存

43  構成Win32 API 函數的三個動態鏈接庫是什麼?

答:內核庫,用戶界面管理庫,圖形設備界面庫。

44 創建一個窗口的步驟是?

答:填充一個窗口類結構->註冊這個窗口類->然後再創建窗口->顯示窗口->更新窗口。

45  模態對話框和非模態對話框有什麼區別?

答:1.調用規則不同:前者是用DoModal()調用,後者通過屬性和ShowWindow()來顯示。

2.模態對話框在沒有關閉前用戶不能進行其他操作,而非模態對話框可以。

3.非模態對話框創建時必須編寫自己的共有構造函數,還要調用Create()函數。

46   簡單介紹GDI?

答;GDI是Graphics Device Interface 的縮寫,譯爲:圖形設備接口;是一個在Windows應用程序中執行與設備無關的函數庫,這些函數在不同的輸出設備上產生圖形以及文字輸出。

47   windows消息分爲幾類?並對各類做簡單描述。

1.窗口消息:與窗口相關的消息,除WM_COMMAND之外的所有以WM_開頭的消息;

2.命令消息;用於處理用戶請求,以WM_COMMAND表示的消息;

3.控件通知消息:統一由WM_NOTIFT表示,

4.用戶自定義消息

48   簡述Visual C++ 、Win32 API和MFC之間的關係?

(1)   VisualC+是一個以C++程序設計語言爲基礎的、集成的、可視化的編程環境;

(2)   Win32API是32位Windows操作系以C/C++形式提供的一組應用程序接口;

(3)   MFC是對Win32 API的封裝,簡化了開發過程。

49 多重繼承中二義性的消除

50 怎樣消除多重繼承中的二義性?

1.成員限定符

2.虛基類

51  什麼叫靜態關聯,什麼叫動態關聯

在多態中,如果程序在編譯階段就能確定實際執行動作,則稱靜態關聯

如果等到程序運行才能確定叫動態關聯。

52 多態的兩個必要條件

1.一個基類的指針或引用指向一個派生類對象,

2.虛函數

53  什麼叫智能指針?

當一個類中,存在一個指向另一個類對象的指針時,對指針運算符進行重載,那麼當前類對象可以通過指針像調用自身成員一樣調用另一個類的成員。

54  派生新類的過程要經歷三個步驟

1吸收基類成員

2.改造基類成員

3.添加新成員

55   TCP/IP 建立連接的過程

在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接

第一次握手:建立連接時,客戶端發送連接請求到服務器,並進入SYN_SEND狀態,等待服務器確認;

第二次握手:服務器收到客戶端連接請求,向客戶端發送允許連接應答,此時服務器進入SYN_RECV狀態;

第三次握手:客戶端收到服務器的允許連接應答,向服務器發送確認,客戶端和服務器進入通信狀態,完成三次握手

56  memset ,memcpy 的區別

memset用來對一段內存空間全部設置爲某個字符,一般用在對定義的字符串進行初始化爲'\0'。

memcpy用來做內存拷貝,你可以拿它拷貝任何數據類型的對象,可以指定拷貝的數據長度;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章