c 開發(fā)工程師常用面試題_第1頁
c 開發(fā)工程師常用面試題_第2頁
c 開發(fā)工程師常用面試題_第3頁
c 開發(fā)工程師常用面試題_第4頁
c 開發(fā)工程師常用面試題_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1.面向?qū)ο蟮某绦蛟O計思想是什么?

答:把數(shù)據(jù)結構和對數(shù)據(jù)結構進行操作的方法封裝形成一個個的對象。

2.什么是類?

答:把一些具有共性的對象歸類后形成一個集合,也就是所謂的類。

3.對象都具有的二方面特征是什么?分別是什么含義?

答:對象都具有的特征是:靜態(tài)特征和動態(tài)特征。

靜態(tài)特征是指能描述對象的一些屬性,動態(tài)特征是指對象表現(xiàn)出來的行為

4.在頭文件中進行類的聲明,在對應的實現(xiàn)文件中進行類的定義有什么意義?

答:這樣可以提高編譯效率,因為分開的話只需要編譯一次生成對應的.obj文件后,再次應

用該類的地方,這個類就不會被再次編譯,從而大大提高了效率。

5.在類的內(nèi)部定義成員函數(shù)的函數(shù)體,這種函數(shù)會具備那種屬性?

答:這種函數(shù)會自動為內(nèi)聯(lián)函數(shù),這種函數(shù)在函數(shù)調(diào)用的地方在編譯階段都會進行代碼替換。

6.成員函數(shù)通過什么來區(qū)分不同對象的成員數(shù)據(jù)?為什么它能夠區(qū)分?

答:通過this指針來區(qū)分的,因為它指向的是對象的首地址。

7.C++編譯器自動為類產(chǎn)生的四個缺省函數(shù)是什么?

答:默認構造函數(shù),拷貝構造函數(shù),析構函數(shù),賦值函數(shù)。

8.拷貝構造函數(shù)在哪幾種情況下會被調(diào)用?

答:1.當類的一個對象去初始化該類的另一個對象時;

2.如果函數(shù)的形參是類的對象,調(diào)用函數(shù)進行形參和實參結合時;

3.如果函數(shù)的返回值是類對象,函數(shù)調(diào)用完成返回時。

9.構造函數(shù)與普通函數(shù)相比在形式上有什么不同?(構造函數(shù)的作用,它的聲明形式來分

析)

答:構造函數(shù)是類的一種特殊成員函數(shù),一般情況下,它是專門用來初始化對象成員變量的。

構造函數(shù)的名字必須與類名相同,它不具有任何類型,不返回任何值。

10.什么時候必須重寫拷貝構造函數(shù)?

答:當構造函數(shù)涉及到動態(tài)存儲分配空間時,要自己寫拷貝構造函數(shù),并且要深拷貝。

11.構造函數(shù)的調(diào)用順序是什么?

答:1.先調(diào)用基類構造函數(shù)

2.按聲明順序初始化數(shù)據(jù)成員

3.最后調(diào)用自己的構造函數(shù)。

12.哪幾種情況必須用到初始化成員列表?

答:類的成員是常量成員初始化;

類的成員是對象成員初始化,而該對象沒有無參構造函數(shù)。

類的成員為引用時。

13.什么是常對象?

答:常對象是指在任何場合都不能對其成員的值進行修改的對象。

14.靜態(tài)函數(shù)存在的意義?

答:靜態(tài)私有成員在類外不能被訪問,可通過類的靜態(tài)成員函數(shù)來訪問;

當類的構造函數(shù)是私有的時,不像普通類那樣實例化自己,只能通過靜態(tài)成員函數(shù)來調(diào)用構

造函數(shù)。

15.在類外有什么辦法可以訪問類的非公有成員?

答:友元,繼承,公有成員函數(shù)。

16.什么叫抽象類?

答:不用來定義對象而只作為一種基本類型用作繼承的類。

17.運算符重載的意義?

答:為了對用戶自定義數(shù)據(jù)類型的數(shù)據(jù)的操作與內(nèi)定義的數(shù)據(jù)類型的數(shù)據(jù)的操作形式一致。

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

答:

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

2.::域運算符

3.Sizeof長度運算符號

4.?:條件運算符號

5..(成員訪問符)

19.運算符重載的三種方式?

答:普通函數(shù),友元函數(shù),類成員函數(shù)。

20.流運算符為什么不能通過類的成員函數(shù)重載?一般怎么解決?

答:因為通過類的成員函數(shù)重載必須是運算符的第一個是自己,而對流運算的重載要求第一

個參數(shù)是流對象。一般通過友元來解決。

21.賦值運算符和拷貝構造函數(shù)的區(qū)別與聯(lián)系?

答:相同點:都是將一個對象copy到另一個中去。

不同點:拷貝構造函數(shù)涉及到要新建立一個對象。

22.在哪種情況下要調(diào)用該類的析構函數(shù)?

答:對象生命周期結束時。

23.對象間是怎樣實現(xiàn)數(shù)據(jù)的共享的?

答:通過類的靜態(tài)成員變量來實現(xiàn)的。靜態(tài)成員變量占有自己獨立的空間不為某個對象所私

有。

24.友元關系有什么特性?

答:單向的,非傳遞的,不能繼承的。

25.對對象成員進行初始化的次序是什么?

答:它的次序完全不受它們在初始化表中次序的影響,只有成員對象在類中聲明的次序來決

定的。

26.類和對象之間的關系是什么?

答:類是對象的抽象,對象是類的實例。

27.對類的成員的訪問屬性有什么?

答:public,protected,private(>

28.constchar*p,char*conslp;的區(qū)別

如果const位于星號的左側(cè),則const就是用來修飾指針所指向的變量,即指針指向為常量;

如果const位于星號的右側(cè),const就是修飾指針本身,即指針本身是常量。

29.是不是一個父類寫了一個virtual函數(shù),如果子類覆蓋它的函數(shù)不加virtual,也能實現(xiàn)多

態(tài)?

virtual修飾符會被隱形繼承的。

virtual可加可不加,子類覆蓋它的函數(shù)不加virtual,也能實現(xiàn)多態(tài)。

30.函數(shù)重載是什么意思?它與虛函數(shù)的概念有什么區(qū)別?

函數(shù)重載是一個同名函數(shù)完成不同的功能,編譯系統(tǒng)在編譯階段通過函數(shù)參數(shù)個數(shù)、參數(shù)類

型不同,函數(shù)的返回值來區(qū)分該調(diào)用哪一個函數(shù),即實現(xiàn)的是靜態(tài)的多態(tài)性。但是記?。翰?/p>

能僅僅通過函數(shù)返回值不同來實現(xiàn)函數(shù)重載。而虛函數(shù)實現(xiàn)的是在基類中通過使用關鍵字

virtual來申明一個函數(shù)為虛函數(shù),含義就是該函數(shù)的功能可能在將來的派生類中定義或者在

基類的基礎之上進行擴展,系統(tǒng)只能在運行階段才能動態(tài)決定該調(diào)用哪一個函數(shù),所以實現(xiàn)

的是動態(tài)的多態(tài)性。它體現(xiàn)的是一個縱向的概念,也即在基類和派生類間實現(xiàn)。

31.構造函數(shù)和析構函數(shù)是否可以被重載,為什么?

答:構造函數(shù)可以被重載,析構函數(shù)不可以被重載。因為構造函數(shù)可以有多個且可以帶參數(shù),

而析構函數(shù)只能有一個,且不能帶參數(shù)。

32.如何定義和實現(xiàn)一個類的成員函數(shù)為回調(diào)函數(shù)?

答:

所謂的回調(diào)函數(shù),就是預先在系統(tǒng)的對函數(shù)進行注冊,讓系統(tǒng)知道這個函數(shù)的存在,以后,

當某個事件發(fā)生時,再調(diào)用這個函數(shù)對事件進行響應。

定義一個類的成員函數(shù)時在該函數(shù)前加CALLBACK即將其定義為回調(diào)函數(shù),函數(shù)的實現(xiàn)和

普通成員函數(shù)沒有區(qū)別

33.虛函數(shù)是怎么實現(xiàn)的?

答:簡單說來使用了虛函數(shù)表.

34.抽象類不會產(chǎn)生實例,所以不需要有構造函數(shù)。錯

35.從一個模板類可以派生新的模板類,也可以派生非模板類。對

36.main函數(shù)執(zhí)行以前,還會執(zhí)行什么代碼?

答案:全局對象的構造函數(shù)會在main函數(shù)之前執(zhí)行。

37.當一個類A中沒有生命任何成員變量與成員函數(shù),這時sizeof(A)的值是多少,如果不是

零,請解釋一下編譯器為什么沒有讓它為零。(Autodesk)

答案:肯定不是零。舉個反例,如果是零的話,聲明一個classA[10]對象數(shù)組,而每一個對

象占用的空間是零,這時就沒辦法區(qū)分A[O],A[1]…了。

38.delete與delete□區(qū)另與

delete只會調(diào)用一次析構函數(shù),而delete□會調(diào)用每一個成員的析構函數(shù)。

199.子類析構時要調(diào)用父類的析構函數(shù)嗎?

會調(diào)用,

析構函數(shù)調(diào)用的次序是先派生類的析構后基類的析構,也就是說在基類的的析構調(diào)用的時候,

派生類的信息已經(jīng)全部銷毀了

40..繼承優(yōu)缺點。

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

2、類繼承可以較方便地改變父類的實現(xiàn)。

缺點:

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

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

3、如果繼承下來的實現(xiàn)不適合解決新的問題,則父類必須重寫或被其他更適合的類替換。

這種依賴關系限制了靈活性并最終限制了復用性。

41.解釋堆和棧的區(qū)別。

棧區(qū)(stack)-由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。

堆:一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。

42.一個類的構造函數(shù)和析構函數(shù)什么時候被調(diào)用,是否需要手工調(diào)用?

答:構造函數(shù)在創(chuàng)建類對象的時候被自動調(diào)用,析構函數(shù)在類對象生命期結束時,由系統(tǒng)自

動調(diào)用。

43.何時需要預編譯:

總是使用不經(jīng)常改動的大型代碼體。

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

下,可以將所有包含文件預編譯為一個預編譯頭。

44.多態(tài)的作用?

主要是兩個:

1.隱藏實現(xiàn)細節(jié),使得代碼能夠模塊化;擴展代碼模塊,實現(xiàn)代碼重用;

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

正確調(diào)用

45.虛擬函數(shù)與普通成員函數(shù)的區(qū)別?內(nèi)聯(lián)函數(shù)和構造函數(shù)能否為虛擬函數(shù)?

答案:區(qū)別:虛擬函數(shù)有virtual關鍵字,有虛擬指針和虛函數(shù)表,虛擬指針就是虛擬函數(shù)

的接口,而普通成員函數(shù)沒有。內(nèi)聯(lián)函數(shù)和構造函數(shù)不能為虛擬函數(shù)。

46.構造函數(shù)和析構函數(shù)的調(diào)用順序?析構函數(shù)為什么要虛擬?

答案:構造函數(shù)的調(diào)用順序:基類構造函數(shù)一對象成員構造函數(shù)一派生類構造函數(shù);析構函

數(shù)的調(diào)用順序與構造函數(shù)相反。析構函數(shù)虛擬是為了防止析構不徹底,造成內(nèi)存的泄漏。

47..C++中類型為private的成員變量可以由哪些函數(shù)訪問?

只可以由本類中的成員函數(shù)和友員函數(shù)訪問

48.請說出類中private,protect,public三種訪問限制類型的區(qū)別

private是私有類型,只有本類中的成員函數(shù)訪問;protect是保護型的,本類和繼承類可以訪

問;public是公有類型,任何類都可以訪問.

49.類中成員變量怎么進行初始化?

可以通過構造函數(shù)的初始化列表或構造函數(shù)的函數(shù)體實現(xiàn)。

50.在什么時候需要使用“常引用”?

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

用常引用。

51.引用與指針有什么區(qū)別?

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

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

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

52.描述實時系統(tǒng)的基本特性

答、在特定時間內(nèi)完成特定的任務,實時性與可靠性。

54.全局變量和局部變量在內(nèi)存中是否有區(qū)別?如果有,是什么區(qū)別?

答、全局變量儲存在靜態(tài)數(shù)據(jù)區(qū),局部變量在堆棧中。

55.堆棧溢出一般是由什么原因?qū)е碌模?/p>

答、沒有回收垃圾資源

56.什么函數(shù)不能聲明為虛函數(shù)?

答構造函數(shù)(constructor)

57..IP地址的編碼分為哪倆部分?

答IP地址由兩部分組成,網(wǎng)絡號和主機號。

58..不能做switch。的參數(shù)類型是:

答、switch的參數(shù)不能為實型。

59.如何引用一個已經(jīng)定義過的全局變量?

答、可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用頭文件方式來引用某

個在頭文件中聲明的全局變理,假定你將那個變寫錯了,那么在編譯期間會報錯,如果你用

extern方式引用時,假定你犯了同樣的錯誤,那么在編譯期間不會報錯,而在連接期間報錯

60.對于一個頻繁使用的短小函數(shù),在C語言中應用什么實現(xiàn),在C++中應用什么實現(xiàn)?

答、c用宏定義,C++用inline

Nm

61.C++是不是類型安全的?

答案:不是。兩個不同類型的指針之間可以強制轉(zhuǎn)換(用reinterpretcast)

62.當一個類A中沒有生命任何成員變量與成員函數(shù),這時sizeof(A)的值是多少,請解釋一

下編譯器為什么沒有讓它為零。

答案:為1。舉個反例,如果是零的話,聲明一個classA[10]對象數(shù)組,而每一個對象占用

的空間是零,這時就沒辦法區(qū)分A⑼,A[l]…了。

63.簡述數(shù)組與指針的區(qū)別?

數(shù)組要么在靜態(tài)存儲區(qū)被創(chuàng)建(如全局數(shù)組),要么在棧上被創(chuàng)建。指針可以隨時指向任意

類型的內(nèi)存塊。

(1)修改內(nèi)容上的區(qū)別

chara[]="hello”;

a[0]=,X';

char*p="world";〃注意p指向常量字符串

p[0]='X';〃編譯器不能發(fā)現(xiàn)該錯誤,運行時錯誤

(2)用運算符sizeof可以計算出數(shù)組的容量(字節(jié)數(shù))。sizeof(p),p為指針得到的是一個指

針變量的字節(jié)數(shù),而不是p所指的內(nèi)存容量.

64.C++函數(shù)中值的傳遞方式

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

65.內(nèi)存的分配方式

分配方式有三種,

1、靜態(tài)存儲區(qū),是在程序編譯時就己經(jīng)分配好的,在整個運行期間都存在,如全局變量、

常量。

2、棧上分配,函數(shù)內(nèi)的局部變量就是從這分配的,但分配的內(nèi)存容易有限。

3、堆上分配,也稱動態(tài)分配,如我們用new,malloc分配內(nèi)存,用delete,free來釋放的內(nèi)存。

66.extern"C”有什么作用?

Extern“C”是由C++提供的一個連接交換指定符號,用于告訴C++這段代碼是C函數(shù)。

這是因為C++編譯后庫中函數(shù)名會變得很長,與C生成的不一致,造成C++不能直接調(diào)

用C函數(shù),加上extren“c”后,C++就能直接調(diào)用C函數(shù)了。

Extern"C”主要使用正規(guī)DLL函數(shù)的引用和導出和在C++包含C函數(shù)或C頭文件時使

用。使用時在前面加上extern“c”關鍵字即可。

67.用什么函數(shù)開啟新進程、線程。

答案:

線程:CreateThread/AfxBeginThread等

進程:CreateProcess等

68.SendMessage和PostMessage有什么區(qū)別

答案:SendMessage是阻塞的,等消息被處理后,代碼才能走到SendMessage的下一行。

PostMessage是非阻塞的,不管消息是否已被處理,代碼馬上走到PostMessage的下一行。

69.CMemoryState主要功能是什么

答案:查看內(nèi)存使用情況,解決內(nèi)存泄露問題。

70.26、#include<filename.h>和#include"filename.h”有什么區(qū)別?

答:對于#include<fllename.h>,編譯器從標準庫路徑開始搜索filename.h

對于#include"filename.h”,編譯器從用戶的工作路徑開始搜索filename.h

71.處理器標識#error的目的是什么?

答:編譯時輸出一條錯誤信息,并中止繼續(xù)編譯。

72.#if!defined(AFX_..,_HADE_H)

#define(AFX_..,_HADE_H)

#endif作用?

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

73.在定義一個宏的時候要注意什么?

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

74.數(shù)組在做函數(shù)實參的時候會轉(zhuǎn)變?yōu)槭裁搭愋停?/p>

數(shù)組在做實參時會變成指針類型。

75.系統(tǒng)會自動打開和關閉的3個標準的文件是?

(1)標準輸入----鍵盤---stdin

(2)標準輸出----顯示器一stdout

(3)標準出錯輸出—-顯示器…stderr

T

/.在Win32下char,int,float,double各占多少位?

z

7(6口

xChar占用8位

z

(

2x)Int占用32位

z

(

3\)Float占用32位

4/)

(

,Double占用64位

77.strcpy()和memcpy()的區(qū)別?

strcpyO和memcpy()都可以用來拷貝字符串,strcpyO拷貝以'\0'結束,但memcpy()必

須指定拷貝的長度。

78.說明define和const在語法和含義上有什么不同?

(1)#define是C語法中定義符號變量的方法,符號常量只是用來表達一個值,在編譯階段

符號就被值替換了,它沒有類型;

(2)Const是C++語法中定義常變量的方法,常變量具有變量特性,它具有類型,內(nèi)存中存

在以它命名的存儲單元,可以用sizeof測出長度。

79.說出字符常量和字符串常量的區(qū)別,并使用運算符sizeof計算有什么不用?

字符常量是指單個字符,字符串常量以'\0'結束,使用運算符sizeof計算多占一字節(jié)的存

儲空間。

80.簡述全局變量的優(yōu)缺點?

全局變量也稱為外部變量,它是在函數(shù)外部定義的變量,它屬于一個源程序文件,它保存上

一次被修改后的值,便于數(shù)據(jù)共享,但不方便管理,易引起意想不到的錯誤。

81.總結static的應用和作用?

(1)函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體,不同于auto變量,該變量的內(nèi)存只被分

配一次,因此其值在下次調(diào)用時仍維持上次的值;

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

問;

(3)在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個函數(shù)的使用范圍被限

制在聲明它的模塊內(nèi);

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

(5)在類中的static成員函數(shù)屬于整個類所擁有,這個函數(shù)不接收this指針,因而只能訪

問類的static成員變量。

82..總結const的應用和作用?

(1)欲阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常需要對

它進行初始化,因為以后就沒有機會再去改變它了;

(2)對指針來說,可以指定指針本身為const,也可以指定指針所指的數(shù)據(jù)為const,或二

者同時指定為const;

(3)在一個函數(shù)聲明中,const可以修飾形參,表明它是一個輸入?yún)?shù),在函數(shù)內(nèi)部不能改

變其值;

(4)對于類的成員函數(shù),若指定其為const類型,則表明其是一個常函數(shù),不能修改類的

成員變量;

(5)對于類的成員函數(shù),有時候必須指定其返回值為const類型,以使得其返回值不為“左

83.什么是指針?談談你對指針的理解?

指針是一個變量,該變量專門存放內(nèi)存地址;

指針變量的類型取決于其指向的數(shù)據(jù)類型,在所指數(shù)據(jù)類型前加*

指針變量的特點是它可以訪問所指向的內(nèi)存。

84.什么是常指針,什么是指向常變量的指針?

常指針的含義是該指針所指向的地址不能變,但該地址所指向的內(nèi)容可以變化,使用常指針

可以保證我們的指針不能指向其它的變量,

指向常變量的指針是指該指針的變量本身的地址可以變化,可以指向其它的變量,但是它所

指的內(nèi)容不可以被修改。指向長變量的指針定義,

85.函數(shù)指針和指針函數(shù)的區(qū)別?

函數(shù)指針是指指向一個函數(shù)入口的指針;

指針函數(shù)是指函數(shù)的返回值是一個指針類型。

87.簡述Debug版本和Release版本的區(qū)別?

Debug版本是調(diào)試版本,Release版本是發(fā)布給用戶的最終非調(diào)試的版本,

88.指針的幾種典型應用情況?

int*p[n];--指針數(shù)組,每個元素均為指向整型數(shù)據(jù)的指針。

int(*)p[n];-----p為指向一維數(shù)組的指針,這個一維數(shù)組有n個整型數(shù)據(jù)。

int*p();-……函數(shù)帶回指針,指針指向返回的值。

int(*)p();------p為指向函數(shù)的指針。

89.static函數(shù)與普通函數(shù)有什么區(qū)別?

static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個被調(diào)用中維持一份拷貝

90.struct(結構)和union(聯(lián)合)的區(qū)別?

1.結構和聯(lián)合都是由多個不同的數(shù)據(jù)類型成員組成,但在任何同一時刻,聯(lián)合中只存放了

一個被選中的成員(所有成員共用一塊地址空間),而結構的所有成員都存在(不同成員的

存放地址不同)。

2.對于聯(lián)合的不同成員賦值,將會對其它成員重寫,原來成員的值就不存在了,而對于結

構的不同成員賦值是互不影響的。

91.class和struct的區(qū)別?

struct的成員默認是公有的,而類的成員默認是私有的。

92.簡述枚舉類型?

枚舉方便一次定義一組常量,使用起來很方便;

93.assert。的作用?

ASSERT。是一個調(diào)試程序時經(jīng)常使用的宏,在程序運行時它計算括號內(nèi)的表達式,如果表

達式為FALSE(0),程序?qū)蟾驽e誤,并終止執(zhí)行。如果表達式不為0,則繼續(xù)執(zhí)行后面的

語句。這個宏通常原來判斷程序中是否出現(xiàn)了明顯非法的數(shù)據(jù),如果出現(xiàn)了終止程序以免導

致嚴重后果,同時也便于查找錯誤。

94.局部變量和全局變量是否可以同名?

能,局部會屏蔽全局。要用全局變量,需要使用"::"(域運算符)。

95.程序的局部變量存在于(堆棧)中,全局變量存在于(靜態(tài)區(qū))中,動態(tài)申請數(shù)據(jù)存

在于(堆)中。

96.在什么時候使用常引用?

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

用常引用。

97.類的聲明和實現(xiàn)的分開的好處?

1.起保護作用;

2.提高編譯的效率。

98.windows消息系統(tǒng)由哪幾部分構成?

由一下3部分組成:

1.消息隊列:操作系統(tǒng)負責為進程維護一個消息隊列,程序運行時不斷從該消息隊列中獲

取消息、處理消息;

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

3.消息處理:消息循環(huán)負責將消息派發(fā)到相關的窗口上使用關聯(lián)的窗口過程函數(shù)進行處

理。

99.什么是消息映射?

消息映射就是讓程序員指定MFC類(有消息處理能力的類)處理某個消息。然后由程序員

完成對該處理函數(shù)的編寫,以實現(xiàn)消息處理功能。

100.什么是UDP和TCP的區(qū)別是什么?

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

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

用TCP還是UDP,那要看你的程序注重哪一個方面?可靠還是快速?

101.winsock建立連接的主要實現(xiàn)步驟?

答:

服務器端:socket。建立套接字,綁定(bind)并監(jiān)聽(listen),用accept()等待客戶端連

接,accept()發(fā)現(xiàn)有客戶端連接,建立一個新的套接字,自身重新開始等待連接。該新產(chǎn)

生的套接字使用send。和recv()寫讀數(shù)據(jù),直至數(shù)據(jù)交換完畢,closesocket。關閉套接字。

客戶端:socket。建立套接字,連接(connect)服務器,連接上后使用send。和recv(),在

套接字上寫讀數(shù)據(jù),直至數(shù)據(jù)交換完畢,closesockel。關閉套接字。

102.進程間主要的通訊方式?

信號量,管道,消息,共享內(nèi)存

103.構成Win32API函數(shù)的三個動態(tài)鏈接庫是什么?

答:內(nèi)核庫,用戶界面管理庫,圖形設備界面庫。

104.創(chuàng)建一個窗口的步驟是?

答:填充一個窗口類結構,注冊這個窗口類,然后再創(chuàng)建窗口,顯示窗口,更新窗口。

105.模態(tài)對話框和非模態(tài)對話框有什么區(qū)別?

答:1.調(diào)用規(guī)則不同:前者是用DoModal()調(diào)用,后者通過屬性和ShowWindow()來顯示。

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

3.非模態(tài)對話框創(chuàng)建時必須編寫自己的共有構造函數(shù),還要調(diào)用Create。函數(shù)。

106.從EDIT框中取出數(shù)據(jù)給關聯(lián)的變量,已經(jīng)把關聯(lián)的變量的數(shù)據(jù)顯示在EDIT框上的函

數(shù)是什么?

答:UpdateData(TRUE),Updatedata(FALSE).

107.簡單介紹GDI?

答;GDI是GraphicsDeviceInterface的縮寫,譯為:圖形設備接口;是一個在Windows應

用程序中執(zhí)行與設備無關的函數(shù)庫,這些函數(shù)在不同的輸出設備上產(chǎn)生圖形以及文字輸出。

108.windows消息分為幾類?并對各類做簡單描述。

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

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

3.控件通知消息:統(tǒng)一由WM_NOTIFT表示,

4.用戶自定義消息。

109.如何自定義消息?

使用WMJJSER和WM_APP兩個宏來自定義消息,

110.簡述VisualC++、Win32API和MFC之間的關系?

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

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

(3)MFC是對Win32Api的封裝,簡化了開發(fā)過程。

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

1.成員限定符

2.虛基類

112什么叫靜態(tài)關聯(lián),什么叫動態(tài)關聯(lián)

在多態(tài)中,如果程序在編譯階段就能確定實際執(zhí)行動作,則稱靜態(tài)關聯(lián),

如果等到程序運行才能確定叫動態(tài)關聯(lián)。

113多態(tài)的兩個必要條件

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

2.虛函數(shù)

114.什么叫智能指針?

當一個類中,存在一個指向另一個類對象的指針時,對指針運算符進行重載,那么當前類對

象可以通過指針像調(diào)用自身成員一樣調(diào)用另一個類的成員。

115.什么時候需要用虛析構函數(shù)?

當基類指針指向用new運算符生成的派生類對象時,delete基類指針時,派生類部分沒有釋

放掉而造成釋放不徹底現(xiàn)象,需要虛析構函數(shù)。

116.MFC中,大部分類是從哪個類繼承而來?

CObject

117.什么是平衡二叉樹?

答:左右子樹都是平衡二叉樹,而且左右子樹的深度差值的約對值不大于1

118.語句砧式;1;)有什么問題?它是什么意思?

答:無限循環(huán),和while⑴相同。

119.派生新類的過程要經(jīng)歷三個步驟

1吸收基類成員

2.改造基類成員

3.添加新成員

121.TCP/IP建立連接的過程

在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務,采用三次握手建立一個連接。

第一次握手:建立連接時,客戶端發(fā)送連接請求到服務器,并進入SYN_SEND狀態(tài),等待

服務器確認;

第二次握手:服務器收到客戶端連接請求,向客戶端發(fā)送允許連接應答,此時服務器進入

SYN_RECV狀態(tài);

第三次握手:客戶端收到服務器的允許連接應答,向服務器發(fā)送確認,客戶端和服務器進入

通信狀態(tài),完成三次握手

122..memset,memcpy的區(qū)別

memset用來對一段內(nèi)存空間全部設置為某個字符,一般用在對定義的字符串進行初始化為

'\0'?

memcpy用來做內(nèi)存拷貝,你可以拿它拷貝任何數(shù)據(jù)類型的對象,可以指定拷貝的數(shù)據(jù)長度;

123.在C++程序中調(diào)用被C編譯器編譯后的函數(shù),為什么要加extern“C”?

答:C++語言支持函數(shù)重載,C語言不支持函數(shù)重載。函數(shù)被C++編譯后在庫中的名字

與C語言的不同。假設某個函數(shù)的原型為:voidfoo(intx,inty);該函數(shù)被C編譯器編譯后

在庫中的名字為一f。。,而C++編譯器則會產(chǎn)生像一foo_int_int之類的名字。C++提供了C連

接交換指定符號extern“C”來解決名字匹配問題。

124怎樣定義一個純虛函數(shù)?含有純虛函數(shù)的類稱為什么?

在虛函數(shù)的后面加=0,含有虛函數(shù)的類稱為抽象類。

127.類成員函數(shù)的重載、覆蓋和隱藏區(qū)別

答案:

成員函數(shù)被重載的特征:

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

(2)函數(shù)名字相同;

(3)參數(shù)不同;

(4)virtual關鍵字可有可無。

覆蓋是指派生類函數(shù)覆蓋基類函數(shù),特征是:

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

(2)函數(shù)名字相同;

(3)參數(shù)相同;

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

“隱臧”是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù),規(guī)則如下:

(1)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。此時,不論有無virtual關鍵字,

基類的函數(shù)將被隱臧(注意別與重載混淆)。

(2)如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函數(shù)沒有virtual關

鍵字。此時,基類的函數(shù)被隱藏(注意別與覆蓋混淆)

128.如何打印出當前源文件的文件名以及源文件的當前行號?

答案:

cout?_FILE_;

cout?_LINE_;

_FILE_和_L1NE_是系統(tǒng)預定義宏,這種宏并不是在某個文件中定義的,而是由編譯器

定義的。

133將“引用”作為函數(shù)參數(shù)有哪些特點?

(1)傳遞引用給函數(shù)與傳遞指針的效果是一樣的。這時,被調(diào)函數(shù)的形參就成為原來主調(diào)

函數(shù)中的實參變量或?qū)ο蟮囊粋€別名來使用,所以在被調(diào)函數(shù)中對形參變量的操作就是對其

相應的目標對象(在主調(diào)函數(shù)中)的操作。

(2)使用引用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒有產(chǎn)生實參的副本,它是直接對實參操作;

而使用一般變量傳遞函數(shù)的參數(shù),當發(fā)生函數(shù)調(diào)用時,需要給形參分配存儲單元,形參變量

是實參變量的副本;如果傳遞的是對象,還將調(diào)用拷貝構造函數(shù)。因此,當參數(shù)傳遞的數(shù)據(jù)

較大時,用引用比用一般變量傳遞參數(shù)的效率和所占空間都好。

(3)使用指針作為函數(shù)的參數(shù)雖然也能達到與使用引用的效果,但是,在被調(diào)函數(shù)中同樣

要給形參分配存儲單元,且需要重復使用”*指針變量名"的形式進行運算,這很容易產(chǎn)生錯

誤且程序的閱讀性較差;另一方面,在主調(diào)函數(shù)的調(diào)用點處,必須用變量的地址作為實參。

而引用更容易使用,更清晰。

134.什么時候需要“引用”?

流操作符(<<、>>)和賦值操作符(=)的返回值、拷貝構造函數(shù)的參數(shù)、賦值操作符的參

數(shù)、其它情況都推薦使用引用。

135.面向?qū)ο蟮娜齻€基本特征,并簡單敘述之?

1.封裝:將客觀事物抽象成類,每個類對自身的數(shù)據(jù)和方法實行protection(private,

protected,public)

2.繼承:廣義的繼承有三種實現(xiàn)形式:實現(xiàn)繼承(指使用基類的屬性和方法而無需額外編

碼的能力)、可視繼承(子窗體使用父窗體的外觀和實現(xiàn)代碼)、接口繼承(僅使用屬性和方

法,實現(xiàn)滯后到子類實現(xiàn))。前兩種(類繼承)和后一種(對象組合=>接口繼承以及純虛函

數(shù))構成了功能復用的兩種方式。

3.多態(tài):是將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之后,父對象

就可以根據(jù)當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許

將子類類型的指針賦值給父類類型的指針。

140.一個單向鏈表,不知道頭節(jié)點,一個指針指向其中的一個節(jié)點,問如何刪除這個指針指向

的節(jié)點?

將這個指針指向的next節(jié)點值copy到本節(jié)點,將next指向next->next,并隨后刪除原next

指向的節(jié)點。

157、strcal能把strSrc的內(nèi)容連接到slrDest,為什么還要char*類型的返回值?

答:方便賦值給其他變量

158、MFC中CString是類型安全類么?

答:不是,其它數(shù)據(jù)類型轉(zhuǎn)換到CSlring可以使用CString的成員函數(shù)Formal來轉(zhuǎn)換

159.C++中什么數(shù)據(jù)分配在棧或堆中?

答:棧:存放局部變量,函數(shù)調(diào)用參數(shù),函數(shù)返回值,函數(shù)返回地址。由系統(tǒng)管理

堆:程序運行時動態(tài)申請,new和malloc申請的內(nèi)存就在堆上

160、函數(shù)模板與類模板有什么區(qū)別?

答:函數(shù)模板的實例化是由編譯程序在處理函數(shù)調(diào)用時自動完成的,而類模板的實例化

必須由程序員在程序中顯式地指定。

161、inti=10,j=10,k=3;k*=i+j;k最后的值是?

答:60,此題考察優(yōu)先級,實際寫成:k*=(i+j);,賦值運算符優(yōu)先級最低

162、do.......while和while........do有什么區(qū)別?

答、前一個循環(huán)一遍再判斷,后一個判斷以后再循環(huán)

187頭文件的作用是什么?

答:一、通過頭文件來調(diào)用庫功能。在很多場合,源代碼不便(或不準)向用戶公布,只要

向用戶提供頭文件和二進制的庫即可。用戶只需要按照頭文件中的接口聲明來調(diào)用庫功能,

而不必關心接口怎么實現(xiàn)的。編譯器會從庫中提取相應的代碼。

二、頭文件能加強類型安全檢查。如果某個接口被實現(xiàn)或被使用時,其方式與頭文件中的聲

明不一致,編譯器就會指出錯誤,這一簡單的規(guī)則能大大減輕程序員調(diào)試、改錯的負擔。

206.C和C++有什么不同?

從機制上:c是面向過程的(但c也可以編寫面向?qū)ο蟮某绦?;C++是面向?qū)ο蟮?,提供?/p>

類。但是,C++編寫面向?qū)ο蟮某绦虮萩容易

從適用的方向:c適合要求代碼體積小的,效率高的場合,如嵌入式;C++適合更上層的,

復雜的;Hinux核心大部分是c寫的,因為它是系統(tǒng)軟件,效率要求極高。

從名稱上也可以看出,C++比c多了+,說明C++是c的超集;那為什么不叫c+而叫C++呢,

是因為C++比

C來說擴充的東西太多了,所以就在C后面放上兩個+;于是就成了C++

C語言是結構化編程語言,C++是面向?qū)ο缶幊陶Z言。LUPA開源社區(qū)}n*r2C/M8f

C++側(cè)重于對象而不是過程,側(cè)重于類的設計而不是邏輯的設計。

298.動態(tài)連接庫的兩種方式?

答:調(diào)用一個DLL中的函數(shù)有兩種方法:

1.載入時動態(tài)鏈接(load-limedynamiclinking),模塊非常明確調(diào)用某個導出函數(shù),使得他

們就像本地函數(shù)一樣。這需要鏈接時鏈接那些函數(shù)所在DLL的導入庫,導入庫向系統(tǒng)提供

了載入DLL時所需的信息及DLL函數(shù)定位。

2.運行時動態(tài)鏈接(run-timedynamiclinking),運行時可以通過LoadLibrary或Loa

dLibraryEx函數(shù)載入DLL。DLL載入后,模塊可以通過調(diào)用GetProcAddress獲取DLL函數(shù)

的出口地址,然后就可以通過返回的函數(shù)指針調(diào)用DLL函數(shù)了。如此即可避免導入庫文件

了。

38.“引用”與多態(tài)的關系?

引用是除指針外另一個可以產(chǎn)生多態(tài)效果的手段。這意味著,一個基類的引用可以指向它的

派生類實例。

四、棧的表示和實現(xiàn)

1.順序棧

順序棧是用順序存儲結構實現(xiàn)的棧,即利用一組地址連續(xù)的存儲單元依次存放自棧

底到棧頂?shù)臄?shù)據(jù)元素,同時由于棧的操作的特殊性,還必須附設一個位置指針top(棧頂指

針)來動態(tài)地指示棧頂元素在順序棧中的位置。通常以lop=0或top=-l表示空棧。順序棧

的存儲結構可以用C語言中的一維數(shù)組來表示。棧的順序存儲結構定義如下:

#defineSTACK_INIT_SIZE100〃存儲空間初始分配量

#defineSTACKINCREMENT10〃存儲空間分配增量

typedefstruct

{SElemType*base;〃在棧構造前和銷毀后base值為NULL

SElemType*top;//棧頂指針

intstacksize;}SqStack;〃當前已分配存儲空間

或簡單定義如下:

#defineM100

ints[M];

inttop;

初態(tài):top=0;空棧,棧中無元素,

進棧:s[top]=x;top=top+1;

退棧:top=top-l;取s[top];

棧滿:top=M;棧溢出(上益),不能再進棧(錯誤狀態(tài))

top=0時不能退棧,下益(正常狀態(tài),常作控制條件)

2.順序棧基本操作的實現(xiàn)如下:

(1)構造空順序棧算法:初始化棧

StatusInitStack(SqStack&S){

//構造一個空棧S

S.base=(SElemType*)malloc(STACKJNIT_SIZE*sizeof(SElemType));

if(!S上ase)exit(OVERFLOW);//為棧分配存儲空間失敗

S.top=S.base;//令棧頂指針=棧底指針

S.stacksize=STACKJNIT_SIZE;//設置棧的當前可使用的最大容量

returnOK;

}//InitStack

程序描述:

//Thisprogramistoinitializeastack

#include<malloc.h>

#include<iostream.h>

#include<conio.h>

#defineSTACKJNIT_SIZE100

#defineSTACKINCREMENT10#

defineOK1#defineERROR0

typedefintSElemType;

typedefstruct//definest

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論