C++概念性總結

1.面向對象的程序設計思想是什麼?c++

答:把數據結構和對數據結構進行操做的方法封裝造成一個個的對象。程序員

2.什麼是類?編程

答:把一些具備共性的對象歸類後造成一個集合,也就是所謂的類。windows

3.對象都具備的兩方面特徵是什麼?分別是什麼含義?數組

答:對象都具備的特徵是:靜態特徵和動態特徵。安全

靜態特徵是指能描述對象的一些屬性。服務器

動態特徵是指對象表現出來的行爲 。網絡

4.在頭文件中進行類的聲明,在對應的實現文件中進行類的定義有什麼意義?數據結構

答:1.提升編譯效率,由於分開的話只須要編譯一次生成對應的.obj文件後,再次應用該類的地方,這個類就不會被再次編譯,從而大大提升了效率。socket

        2.隱藏了代碼

5.在類的內部定義成員函數的函數體,這種函數會具有那種屬性?

答:這種函數會自動爲內聯函數,這種函數在函數調用的地方,在編譯階段都會進行代碼替換。

6.成員函數經過什麼來區分不一樣對象的成員數據?爲何它可以區分?

答:經過this指針來區分的, 由於它指向的是對象的首地址

7.C++編譯器自動爲類產生的四個缺省函數是什麼?

答:默認構造函數(不帶參數的構造函數),拷貝構造函數(用於對象間的賦值),析構函數,賦值函數(等號的賦值)。

8.拷貝構造函數在哪幾種狀況下會被調用?

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

        2.若是函數的形參是類的對象,調用函數進行形參和實參結合時。

        3.若是函數的返回值是類對象,函數調用完成返回時。

9.構造函數與普通函數相比在形式上有什麼不一樣?(構造函數的做用,它的聲明形式來分析)

答:構造函數是類的一種特殊成員函數,通常狀況下,它是專門用來初始化對象成員變量的。

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

10.何時必須重寫拷貝構造函數?

答:當構造函數涉及到動態存儲分配空間時,要本身寫拷貝構造函數,而且要深拷貝。

11.構造函數的調用順序是什麼?

答:1.先調用基類構造函數

        2.按聲明順序初始化數據成員

        3.最後調用本身的構造函數。

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

答:1.類的成員是常量成員初始化。

        2.類的成員是對象成員初始化,而該對象沒有無參構造函數。

        3.類的成員常變量時。

13.什麼是常對象?

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

14.靜態函數存在的意義?

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

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

15.在類外有什麼辦法能夠訪問類的非公有成員?

答:友元,繼承,公有成員函數。

16.什麼叫抽象類?

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

17.運算符重載的意義?

答:爲了對用戶自定義數據類型的數據的操做與內定義的數據類型的數據的操做形式一致。

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

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

        2.::域運算符

        3.sizeof 長度運算符號

        4.?:條件運算符號

        5. .(成員訪問符)

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

答:普通函數,友元函數,類成員函數。

20.流運算符爲何不能經過類的成員函數重載?通常怎麼解決?

答:由於經過類的成員函數重載必須是運算符的第一個是本身,而對流運算的重載要求第一個參數是流對象。通常經過友元來解決。

21.賦值運算符和拷貝構造函數的區別與聯繫?

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

        不一樣點:拷貝構造函數涉及到要新創建一個對象。

22.在哪一種狀況下要調用該類的析構函數?

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

23.對象間是怎樣實現數據的共享的?

答:經過類的靜態成員變量來實現的。靜態成員變量佔有本身獨立的空間不爲某個對象所私有。

24.友元關係有什麼特性?

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

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

答:它的次序徹底不受它們在初始化表中次序的影響,只與成員對象在類中聲明的次序來決定的。

26.類和對象之間的關係是什麼?

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

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

答:public,protected,private。

28.const char *p和char *const p;的區別?

答:若是const位於星號的左側,則const就是用來修飾指針所指向的變量,即指針指向爲常量;

        若是const位於星號的右側,const就是修飾指針自己,即指針自己是常量。

29.是否是一個父類寫了一個virtual 函數,若是子類覆蓋它的函數不加virtual ,也能實現多態?

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

        virtual可加可不加,子類覆蓋它的函數不加virtual ,也能實現多態。

30.函數重載是什麼意思?它與虛函數的概念有什麼區別?

答:函數重載是一個同名函數完成不一樣的功能,編譯系統在編譯階段經過函數參數個數、參數類型不一樣,即實現的是靜態的多態性。可是記住:不能僅僅經過函數返回值不一樣來實現函數重載。

        而虛函數實現的是在基類中經過使用關鍵字virtual來申明一個函數爲虛函數,含義就是該函數的功能可能在未來的派生類中定義或者在基類的基礎之上進行擴展,系統只能在運行階段才能動態決定該調用哪個函數,因此實現的是動態的多態性。它體現的是一個縱向的概念,也即在基類和派生類間實現。

31.構造函數和析構函數是否能夠被重載,爲何?

答:構造函數能夠被重載,析構函數不能夠被重載。

        由於構造函數能夠有多個且能夠帶參數,而析構函數只能有一個,且不能帶參數。

32.如何定義和實現一個類的成員函數爲回調函數?

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

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

33.虛函數是怎麼實現的?

答:簡單說來使用了虛函數表.

34.抽象類不會產生實例,可是也須要有構造函數。 

35.從一個模板類能夠派生新的模板類,也能夠派生非模板類。 

36.main 函數執行之前,還會執行什麼代碼?

答案:全局對象的構造函數會在main 函數以前執行。

37.當一個類A 中沒有生命任何成員變量與成員函數,這時sizeof(A)的值是多少,若是不是零,請解釋一下編譯器爲何沒有讓它爲零。(Autodesk)

答案:確定不是零。

            舉個反例,若是是零的話,聲明一個class A[10]對象數組,而每個對象佔用的空間是零,這時就沒辦法區分A[0],A[1]了。

38.delete與 delete []區別?

答:delete只會調用一次析構函數,而delete[]會調用每個成員的析構函數。

39.子類析構時要調用父類的析構函數嗎?

答:會調用,析構函數調用的次序是先派生類的析構後基類的析構,也就是說在基類的的析構調用的時候,派生類的信息已經所有銷燬了

**************************************************************************

40. 繼承優缺點:

優勢:

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

2.類繼承能夠較方便地改變父類的實現。

缺點:

一、由於繼承在編譯時刻就定義了,因此沒法在運行時刻改變從父類繼承的實現

二、父類一般至少定義了子類的部分行爲,父類的任何改變均可能影響子類的行爲

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

41.解釋堆和棧的區別:

1.棧區(stack)—由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。

2.堆:通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。

42.一個類的構造函數和析構函數何時被調用,是否須要手工調用?

答:構造函數在建立類對象的時候被自動調用,析構函數在類對象生命期結束時,由系統自動調用。

43.什麼時候須要預編譯:

1.老是使用並且不常常改動的大型代碼體。

2.程序由多個模塊組成,全部模塊都使用一組標準的包含文件和相同的編譯選項。在這種狀況下,能夠將全部包含文件預編譯爲一個預編譯頭。

44.多態的做用?

主要是兩個:

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

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

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

答:1.虛擬函數有virtual關鍵字,有虛擬指針和虛函數表,虛擬指針就是虛擬函數的接口,而普通成員函數沒有。

        2.內聯函數和構造函數不能爲虛擬函數。

46.構造函數和析構函數的調用順序? 析構函數爲何要虛擬?

答案:1.構造函數的調用順序:基類構造函數—對象成員構造函數—派生類構造函數;析構函數的調用順序與構造函數相反。

            2.析構函數虛擬是爲了防止析構不完全,形成內存的泄漏。

47.C++中類型爲private的成員變量能夠由哪些函數訪問?

只能夠由本類中的成員函數和友員函數訪問

48.請說出類中private,protected,public三種訪問限制類型的區別:

1.private是私有類型,只有本類中的成員函數訪問。

2.protect是保護型的,本類和繼承類能夠訪問。

3.public是公有類型,任何類均可以訪問。

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

能夠經過構造函數的初始化列表或構造函數的函數體實現。

50.在何時須要使用「常引用」?

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

51.引用與指針有什麼區別?

答:1.引用必須被初始化,指針沒必要。

        2.引用初始化之後不能被改變,指針能夠改變所指的對象。

        3.不存在指向空值的引用,可是存在指向空值的指針。

52.描述實時系統的基本特性:

在特定時間內完成特定的任務,實時性與可靠性。

54.全局變量和局部變量在內存中是否有區別?若是有,是什麼區別?

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

55.堆棧溢出通常是由什麼緣由致使的?

答 、沒有回收垃圾資源

56.什麼函數不能聲明爲虛函數?

答:構造函數(constructor)

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

答 IP地址由兩部分組成,網絡號和主機號。

58..不能作switch()的參數類型是:

答 、switch的參數不能爲實型。

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

答 、能夠用引用頭文件的方式,也能夠用extern關鍵字。

        若是用引用頭文件方式來引用某個在頭文件中聲明的全局變量,假定你將那個變量寫錯了,那麼在編譯期間會報錯,若是你用extern方式引用時,假定你犯了一樣的錯誤,那麼在編譯期間不會報錯,而在鏈接期間報錯。

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

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

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

答案:不是。兩個不一樣類型的指針之間能夠強制轉換(用reinterpret cast)

63.簡述數組與指針的區別?

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

    2.指針能夠隨時指向任意類型的內存塊。

(1)修改內容上的區別

char a[] = 「hello」;

a[0] = ‘X’;

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

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

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

64.C++函數中值的傳遞方式

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

65.內存的分配方式

分配方式有三種:

1.靜態存儲區,是在程序編譯時就已經分配好的,在整個運行期間都存在,如全局變量、常量。

2. 棧上分配,函數內的局部變量就是從這分配的,但分配的內存容易有限。

3. 堆上分配,也稱動態分配,如咱們用new,malloc分配內存,用delete,free來釋放的內存。

66.extern「C」有什麼做用?

extern 「C」是由C++提供的一個鏈接交換指定符號,用於告訴C++這段代碼是C函數。

這是由於C++編譯後庫中函數名會變得很長,與C生成的不一致,形成C++不能直接調用C函數,加上extren 「c」後,C++就能直接調用C函數了。

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

67.用什麼函數開啓新進程、線程。

答:1.線程:CreateThread/AfxBeginThread等。

        2.進程:CreateProcess等。

68.SendMessage和PostMessage有什麼區別?

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

        2.PostMessage是非阻塞的,無論消息是否已被處理,代碼立刻走到PostMessage的下一行。

69.CMemoryState主要功能是什麼?

答:查看內存使用狀況,解決內存泄露問題。

70.2六、#include 和 #include 「filename.h」 有什麼區別?

答:1.對於#include ,編譯器從標準庫路徑開始搜索 filename.h

        2.對於#include 「filename.h」 ,編譯器從用戶的工做路徑開始搜索 filename.h

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

答:編譯時輸出一條錯誤信息,並停止繼續編譯。

72.#if!defined(AFX_…_HADE_H)

#define(AFX_…_HADE_H)

……

#endif做用?

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

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

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

74.數組在作函數實參的時候會轉變爲何類型?

答:數組在作實參時會變成指針類型。

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

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

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

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

76..在Win32下 char, int, float, double各佔多少位?

(1)Char佔用8位(1個字節)

(2)Int 佔用32位(4個字節)

(3)Float 佔用32位(4個字節)

(4)Double 佔用64位(8個字節)

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

答:strcpy()和memcpy()均可以用來拷貝字符串,strcpy()拷貝以’’結束,但memcpy()必須指定拷貝的長度。

78.說明define和const在語法和含義上有什麼不一樣?

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

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

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

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

80.簡述全局變量的優缺點?

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

81.總結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成員變量。

82..總結const的應用和做用?(**************************)

(1)欲阻止一個變量被改變,可使用const關鍵字。在定義該const變量時,一般須要對它進行初始化,由於之後就沒有機會再去改變它了;

(2)對指針來講,能夠指定指針自己爲const,也能夠指定指針所指的數據爲const,或兩者同時指定爲const;

(3)在一個函數聲明中,const能夠修飾形參,代表它是一個輸入參數,在函數內部不能改變其值;

(4)對於類的成員函數,若指定其爲const類型,則代表其是一個常函數,不能修改類的成員變量;voidfun_name() const {}

(5)對於類的成員函數,有時候必須指定其返回值爲const類型,以使得其返回值不爲「左值」。 const void fun_name() {}

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

答:1.指針是一個變量,該變量專門存放內存地址。

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

        3.指針變量的特色是它能夠訪問所指向的內存。

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

答:1.常指針的含義是該指針所指向的地址不能變,但該地址所指向的內容能夠變化,使用常指針能夠保證咱們的指針不能指向其它的變量。

        2.指向常變量的指針是指該指針的變量自己的地址能夠變化,能夠指向其它的變量,可是它所指的內容不能夠被修改。

85.函數指針和指針函數的區別?

答:1.函數指針是指指向一個函數入口的指針。

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

87.簡述Debug版本和Release版本的區別?

Debug版本是調試版本,Release版本是發佈給用戶的最終非調試的版本。

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

int *p[n];-----指針數組,每一個元素均爲指向整型數據的指針。

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

int (*p)[n];數組指針的正肯定義方式。

//這裏搞錯了吧!!!int (*p)[n]????????

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

int (*)p();------p爲指向函數的指針。

//下面 的是 行 列指針。

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

{

    int c[2][4];

    c[0][0] = 1;

    c[0][1] = 2;

    c[0][2] = 3;

    c[0][3] = 4;

    c[1][0] = 5;

    c[1][1] = 6;

    c[1][2] = 7;

    c[1][3] = 8;

    int (*p)[4] = c + 0;//c + 0 爲行指針!定義一個行指針 int (*p)[n],

    //int *p1 = c + 1;// 這裏會報錯。: cannot convert from 'int (*)[4]' to 'int *'

    int *pa = *c + 1;// *c+1 表示 列指針。!

    return 0;

}

  

// 關於 函數指針的概念。

void myfun( int a, int b)

{

    int c = 0;

    int d = 0;

    cout << "sdfsd" << endl;

}

void myfun1( int a, int b)

{

    int c = 0;

    int d = 0;

    cout << "sdfsd" << endl;

}typedef void (*PMYFUN)( int a, int b );

PMYFUN iFxn;//用這種新的類型去定義一個 變量!

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

{

    iFxn = myfun;//給該指針變量 賦值,代表他是指向那個函數。

    iFxn(2, 3);

    iFxn = myfun1;

    iFxn(32, 3);//y用指針去掉具體的函數。

    return 0;

}

  

// 關於 函數指針的概念。

關於 函數指針的概念。 能夠將這個 pThreadProc 理解爲一個 新的類型,只不過該類型是一個指針。

pThreadProc pfun1;// 用 pThreadProc 這種新的類型去定義的變量是一個指針。

pfun1 = myfun;// 這句就是核心的代碼,將指明調用的是那個函數。

current read

89.static函數與普通函數有什麼區別?

static函數在內存中只有一份,普通函數在每一個被調用中維持一份拷貝

90.struct(結構) 和 union(聯合)的區別?

答:1. 結構和聯合都是由多個不一樣的數據類型成員組成, 但在任何同一時刻, 聯合中只存放了一個被選中的成員(全部成員共用一塊地址空間), 而結構的全部成員都存在(不一樣成員的存放地址不一樣)。

        2. 對於聯合的不一樣成員賦值, 將會對其它成員重寫,原來成員的值就不存在了, 而對於結構的不一樣成員賦值是互不影響的。

91.class 和 struct 的區別?

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

92.簡述枚舉類型?

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

93.assert()的做用?

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

94.局部變量和全局變量是否能夠同名?

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

95.程序的局部變量存在於(棧)中,全局變量存在於(靜態區 )中,動態申請數據存在於( 堆)中。

96.在何時使用常引用?

答:若是既要利用引用提升程序的效率,又要保護傳遞給函數的數據不在函數中被改變,就應使用常引用。

97.類的聲明和實現的分開的好處?

1.起保護做用;

2.提升編譯的效率。

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

由一下3部分組成:

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

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

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

99.什麼是消息映射?

消息映射就是讓程序員指定MFC類(有消息處理能力的類)處理某個消息。而後由程序員完成對該處理函數的編寫,以實現消息處理功能。

100. 什麼是UDP和TCP的區別是什麼?

TCP的全稱爲傳輸控制協議。這種協議能夠提供面向鏈接的、可靠的、點到點的通訊。

UDP全稱爲用戶報文協議,它能夠提供非鏈接的不可靠的點到多點的通訊。

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

101. winsock創建鏈接的主要實現步驟?

答:1.服務器端:socket()創建套接字,綁定(bind)並監聽(listen),用accept()等待客戶端鏈接, accept()發現有客戶端鏈接,創建一個新的套接字,自身從新開始等待鏈接。該新產生的套接字使用send()和recv()寫讀數據,直至數據交換完畢,closesocket()關閉套接字。

        2.客戶端:socket()創建套接字,鏈接(connect)服務器,鏈接上後使用send()和recv(),在套接字上寫讀數據,直至數據交換完畢,closesocket()關閉套接字。

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

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

103. 構成Win32 API 函數的三個動態連接庫是什麼?

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

104. 建立一個窗口的步驟是?

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

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

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

2.模態對話框在沒有關閉前用戶不能進行其餘操做,而非模態對話框能夠。

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

106. 從EDIT框中取出數據給關聯的變量,已經把關聯的變量的數據顯示在EDIT框上的函數是什麼?

答: 取出 UpdateData(TRUE),顯示 Updatedata(FALSE).

107. 簡單介紹GDI?

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

108. windows消息分爲幾類?並對各種作簡單描述。

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

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

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

4.用戶自定義消息。

109. 如何自定義消息?

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

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

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

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

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

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

1.成員限定符

2.虛基類

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

在多態中,若是程序在編譯階段就能肯定實際執行動做,則稱靜態關聯,

若是等到程序運行才能肯定叫動態關聯。

113多態的兩個必要條件(*****************************************)

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

  2.虛函數

114.什麼叫智能指針?(*****************************************)

答:當一個類中,存在一個指向另外一個類對象的指針時,對指針運算符進行重載,那麼當前類對象能夠經過指針像調用自身成員同樣調用另外一個類的成員。

115.何時須要用虛析構函數?

答:當基類指針指向用new運算符生成的派生類對象時,delete基類指針時,派生類部分沒有釋放掉而形成釋放不完全現象,須要虛析構函數。

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

  CObject

117.什麼是平衡二叉樹?

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

118.語句for( ;1 ;)有什麼問題?它是什麼意思?

  答:無限循環,和while(1)相同。

119.派生新類的過程要經歷三個步驟:

  1吸取基類成員

  2.改造基類成員

  3.添加新成員

121. TCP/IP 創建鏈接的過程

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

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

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

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

122 .memset ,memcpy 的區別

memset用來對一段內存空間所有設置爲某個字符,通常用在對定義的字符串進行初始化爲''。

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

123. 在C++ 程序中調用被 C 編譯器編譯後的函數,爲何要加 extern 「C」?(*****************************************)

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

        與C 語言的不一樣。假設某個函數的原型爲: void foo(int x, int y);該函數被C 編譯器編譯後在庫中的名字爲_foo , 而C++編譯器則會產生像_foo_int_int 之類的名字。C++提供了C 鏈接交換指定符號extern「C」來解決名字匹配問題。

124怎樣定義一個純虛函數?含有純虛函數的類稱爲何?

在虛函數的後面加=0,含有虛函數的類稱爲抽象類。

 

current read

125.C++語言是在_ C _語言的基礎上發展起來的。

126.C++語言的編譯單位是擴展名爲____ .cpp______的____程序______文件。

127.行尾使用註釋的開始標記符爲____ //_____。

128.多行註釋的開始標記符和結束標記符分別爲_____/**/ _______。

129.用於輸出表達式值的標準輸出流對象是____ cout_____。

130.用於從鍵盤上爲變量輸入值的標準輸入流對象是__ cin______。

131. 一個完整程序中必須有一個名爲____ main____的函數。

132.一個函數的函數體就是一條____複合_____語句。

133.當執行cin語句時,從鍵盤上輸入每一個數據後必須接着輸入一個___空白_____符,而後才能繼續輸入下一個數據。

134.在C++程序中包含一個頭文件或程序文件的預編譯命令爲____#include ______。

135.程序中的預處理命令是指以___#___字符開頭的命令。

136.一條表達式語句必須以___分號___做爲結束符。

137.在#include命令中所包含的頭文件,能夠是系統定義的頭文件,也能夠是___用戶(或編程者_____定義的頭文件。

138.使用#include命令能夠包含一個頭文件,也能夠包含一個__程序____文件。

139.一個函數定義由__函數頭______和__函數體_____兩部分組成。

140.若一個函數的定義處於調用它的函數以前,則在程序開始能夠省去該函數的__原型(或聲明)____語句。

141.C++頭文件和源程序文件的擴展名分別爲__.h ___和___.cpp ___。

142.程序文件的編譯錯誤分爲____警告(warning)____和____致命(error) ____兩類。

143.當使用___ void ____保留字做爲函數類型時,該函數不返回任何值。

144.當函數參數表用___ void __保留字表示時,則表示該參數表爲空。

145.從一條函數原型語句「int fun1(void);」可知,該函數的返回類型爲__int____,該函數帶有___0___個參數。

146.當執行cout語句輸出endl數據項時,將使C++顯示輸出屏幕上的光標從當前位置移動到___下一行_____的開始位置。

147.假定x=5,y=6,則表達式x++*++y的值爲___35_______。

148.假定x=5,y=6,則表達式x--*--y的值爲___25_______。

149.假定x=5,y=6,則執行表達式y*=x++計算後,x和y的值分別爲___6___和___30 _____。

150.假定x=5,y=6,則執行表達式y+=x--計算後,x和y的值分別爲____4__和___11___。

151.C++常數0x145對應的十進制值爲___325 ___。

152.C++常數0345對應的十進制值爲____ 229__。

153.十進制常數245對應的十六進制的C++表示爲____0xF5___。

154.十進制常數245對應的八進制的C++表示爲___0365 ___。

155.signed char類型的值域範圍是__-128__至___+127 __之間的整數。

156.int和float類型的數據分別佔用___ 4___和____ 4___個字節。

157.float和double類型的數據分別佔用____ 4___和_____8___個字節。

158.bool和char類型的數據分別佔用_____1____和____1___個字節。

159.unsigned short int和int類型的長度分別爲____ 2___和____4___。

160.字符串」This’s a book.n」的長度爲_____ 15____。

161.字符串」nThis’s a pennn」的長度爲_____ 15_____。

162.在C++中存儲字符串」abcdef」至少須要___7 _____個字節。

163.在C++中存儲字符串」a+b=c」至少須要_____6 ___個字節。

164.假定x和y爲整型,其值分別爲16和5,則x%y和x/y的值分別爲___1_______和____3____。

165.假定x和y爲整型,其值分別爲16和5,則x/y和double(x)/y的值分別爲____3____和___3.2____。

166.假定x是一個邏輯量,則x && true的值爲___ x ____。

167.假定x是一個邏輯量,則x || true的值爲_____ true(或1)_____。

168.假定x是一個邏輯量,則x && false的值爲____ false(或0) ___。

169.假定x是一個邏輯量,則x || false的值爲x。

170.假定x是一個邏輯量,則!x || false的值爲____!x ____。

171.假定x是一個邏輯量,則x && !x的值爲____ false(或0)____。

172.假定x是一個邏輯量,則x || !x的值爲____ true(或1)___。

173.設enum Printstatus{ready,busy,error}; 則 cout<

174.設enum Printstatus{ready=2,busy,error}; 則cout<

175.常數-4.205和6.7E-9分別具備___4_____和____2___位有效數字。

176.枚舉類型中的每一個枚舉值都是一個____枚舉常量_____,它的值爲一個___整數____。

177.常數100和3.62的數據類型分別爲____ int ___和_____ double ___。

178.若x=5, y=10, 則計算y*=++x表達式後,x和y的值分別爲___6___和__60 ___。

179.假定x和ch分別爲int型和char型,則sizeof(x)和sizeof(ch)的值分別爲__4__和__1__。

180.假定x=10,則表達式x<=10?20:30的值爲__ 20 __。

181.表達式sqrt(81)和pow(6,3)的值分別爲___9 ___和___216___。

182.含隨機函數的表達式rand() 的值在___0__至___ 19 __區間內。

183.在switch語句中,每一個語句標號所含關鍵字case後面的表達式必須是___常量___。

184.在if語句中,每一個else關鍵字與它前面同層次而且最接近的____ if ____關鍵字相配套。

185.做爲語句標號使用的C++保留字case和defaule只能用於___ switch ___語句的定義體中。

186.執行switch語句時,在進行做爲條件的表達式求值後,將從某個匹配的標號位置起向下執行,當碰到下一個標號位置時(中止/不中止)___不中止__執行。

187.若while循環的「頭」爲「while(i++<=10)」,而且i的初值爲0,同時在循環體中不會修改i的值,則循環體將被重複執行__11___次後正常結束。

188.若do循環的「尾」爲「while(++i<10)」,而且i的初值爲0,同時在循環體中不會修改i的值,則循環體將被重複執行___10 ___次後正常結束。

189.當在程序中執行到break語句時,將結束本層循環類語句或switch語句的執行。

190.當在程序中執行到___ continue___語句時,將結束所在循環語句中循環體的一次執行。

191.在程序中執行到__ return ___語句時,將結束所在函數的執行過程,返回到調用該函數的位置。

192.在程序執行完____主(或main)__函數調用後,將結束整個程序的執行過程,返回到C++集成開發窗口。

193.元素類型爲int的數組a[10]共佔用___ 40___字節的存儲空間。

194.元素類型爲double的二維數組a[4][6]共佔用____192__字節的存儲空間。

195.元素類型爲char的二維數組a[10][30]共佔用___300__字節的存儲空間。

196.存儲字符’a’和字符串」a」分別須要佔用_____1___和____2 ___個字節。

197.以面向對象方法構造的系統,其基本單位是_____對象___。

198.每一個對象都是所屬類的一個__實例__。

199.C++支持兩種多態性:___編譯____時的多態性和____運行__時的多態性。

200.在C++中,編譯時的多態性是經過___重載___實現的,而運行時的多態性則是經過___虛函數____實現的。對於類中定義的任何成員,其隱含訪問權限爲___ private(或私有)__。

201.對於結構中定義的任何成員,其隱含訪問權限爲__ public(或公有)_。

202.若在類的定義體中給出了一個成員函數的完整定義,則該函數屬於__內聯__函數。

203.爲了不在調用成員函數時修改對象中的任何數據成員,則應在定義該成員函數時,在函數頭的後面加上__ const __關鍵字。

204.若只須要經過一個成員函數讀取數據成員的值,而不須要修改它,則應在函數頭的後面加上__ const __關鍵字。

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

成員函數被重載的特徵:

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

(2)函數名字相同;

(3)參數不一樣;

(4)virtual 關鍵字無關緊要。

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

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

(2)函數名字相同;

(3)參數相同;

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

「隱藏」是指派生類的函數屏蔽了與其同名的基類函數,規則以下:

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

(2)若是派生類的函數與基類的函數同名,而且參數也相同,可是基類函數沒有virtual 關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)。

1.面向對象的程序設計思想是什麼?

答:把數據結構和對數據結構進行操做的方法封裝造成一個個的對象。

2.什麼是類?

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

3.對象都具備的兩方面特徵是什麼?分別是什麼含義?

答:對象都具備的特徵是:靜態特徵和動態特徵。

靜態特徵是指能描述對象的一些屬性。

動態特徵是指對象表現出來的行爲 。

4.在頭文件中進行類的聲明,在對應的實現文件中進行類的定義有什麼意義?

答:1.提升編譯效率,由於分開的話只須要編譯一次生成對應的.obj文件後,再次應用該類的地方,這個類就不會被再次編譯,從而大大提升了效率。

        2.隱藏了代碼

5.在類的內部定義成員函數的函數體,這種函數會具有那種屬性?

答:這種函數會自動爲內聯函數,這種函數在函數調用的地方,在編譯階段都會進行代碼替換。

6.成員函數經過什麼來區分不一樣對象的成員數據?爲何它可以區分?

答:經過this指針來區分的, 由於它指向的是對象的首地址

7.C++編譯器自動爲類產生的四個缺省函數是什麼?

答:默認構造函數(不帶參數的構造函數),拷貝構造函數(用於對象間的賦值),析構函數,賦值函數(等號的賦值)。

8.拷貝構造函數在哪幾種狀況下會被調用?

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

        2.若是函數的形參是類的對象,調用函數進行形參和實參結合時。

        3.若是函數的返回值是類對象,函數調用完成返回時。

9.構造函數與普通函數相比在形式上有什麼不一樣?(構造函數的做用,它的聲明形式來分析)

答:構造函數是類的一種特殊成員函數,通常狀況下,它是專門用來初始化對象成員變量的。

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

10.何時必須重寫拷貝構造函數?

答:當構造函數涉及到動態存儲分配空間時,要本身寫拷貝構造函數,而且要深拷貝。

11.構造函數的調用順序是什麼?

答:1.先調用基類構造函數

        2.按聲明順序初始化數據成員

        3.最後調用本身的構造函數。

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

答:1.類的成員是常量成員初始化。

        2.類的成員是對象成員初始化,而該對象沒有無參構造函數。

        3.類的成員常變量時。

13.什麼是常對象?

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

14.靜態函數存在的意義?

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

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

15.在類外有什麼辦法能夠訪問類的非公有成員?

答:友元,繼承,公有成員函數。

16.什麼叫抽象類?

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

17.運算符重載的意義?

答:爲了對用戶自定義數據類型的數據的操做與內定義的數據類型的數據的操做形式一致。

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

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

        2.::域運算符

        3.sizeof 長度運算符號

        4.?:條件運算符號

        5. .(成員訪問符)

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

答:普通函數,友元函數,類成員函數。

20.流運算符爲何不能經過類的成員函數重載?通常怎麼解決?

答:由於經過類的成員函數重載必須是運算符的第一個是本身,而對流運算的重載要求第一個參數是流對象。通常經過友元來解決。

21.賦值運算符和拷貝構造函數的區別與聯繫?

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

        不一樣點:拷貝構造函數涉及到要新創建一個對象。

22.在哪一種狀況下要調用該類的析構函數?

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

23.對象間是怎樣實現數據的共享的?

答:經過類的靜態成員變量來實現的。靜態成員變量佔有本身獨立的空間不爲某個對象所私有。

24.友元關係有什麼特性?

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

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

答:它的次序徹底不受它們在初始化表中次序的影響,只與成員對象在類中聲明的次序來決定的。

26.類和對象之間的關係是什麼?

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

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

答:public,protected,private。

28.const char *p和char *const p;的區別?

答:若是const位於星號的左側,則const就是用來修飾指針所指向的變量,即指針指向爲常量;

        若是const位於星號的右側,const就是修飾指針自己,即指針自己是常量。

29.是否是一個父類寫了一個virtual 函數,若是子類覆蓋它的函數不加virtual ,也能實現多態?

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

        virtual可加可不加,子類覆蓋它的函數不加virtual ,也能實現多態。

30.函數重載是什麼意思?它與虛函數的概念有什麼區別?

答:函數重載是一個同名函數完成不一樣的功能,編譯系統在編譯階段經過函數參數個數、參數類型不一樣,即實現的是靜態的多態性。可是記住:不能僅僅經過函數返回值不一樣來實現函數重載。

        而虛函數實現的是在基類中經過使用關鍵字virtual來申明一個函數爲虛函數,含義就是該函數的功能可能在未來的派生類中定義或者在基類的基礎之上進行擴展,系統只能在運行階段才能動態決定該調用哪個函數,因此實現的是動態的多態性。它體現的是一個縱向的概念,也即在基類和派生類間實現。

31.構造函數和析構函數是否能夠被重載,爲何?

答:構造函數能夠被重載,析構函數不能夠被重載。

        由於構造函數能夠有多個且能夠帶參數,而析構函數只能有一個,且不能帶參數。

32.如何定義和實現一個類的成員函數爲回調函數?

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

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

33.虛函數是怎麼實現的?

答:簡單說來使用了虛函數表.

34.抽象類不會產生實例,可是也須要有構造函數。 

35.從一個模板類能夠派生新的模板類,也能夠派生非模板類。 

36.main 函數執行之前,還會執行什麼代碼?

答案:全局對象的構造函數會在main 函數以前執行。

37.當一個類A 中沒有生命任何成員變量與成員函數,這時sizeof(A)的值是多少,若是不是零,請解釋一下編譯器爲何沒有讓它爲零。(Autodesk)

答案:確定不是零。

            舉個反例,若是是零的話,聲明一個class A[10]對象數組,而每個對象佔用的空間是零,這時就沒辦法區分A[0],A[1]了。

38.delete與 delete []區別?

答:delete只會調用一次析構函數,而delete[]會調用每個成員的析構函數。

39.子類析構時要調用父類的析構函數嗎?

答:會調用,析構函數調用的次序是先派生類的析構後基類的析構,也就是說在基類的的析構調用的時候,派生類的信息已經所有銷燬了

**************************************************************************

40. 繼承優缺點:

優勢:

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

2.類繼承能夠較方便地改變父類的實現。

缺點:

一、由於繼承在編譯時刻就定義了,因此沒法在運行時刻改變從父類繼承的實現

二、父類一般至少定義了子類的部分行爲,父類的任何改變均可能影響子類的行爲

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

41.解釋堆和棧的區別:

1.棧區(stack)—由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。

2.堆:通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。

42.一個類的構造函數和析構函數何時被調用,是否須要手工調用?

答:構造函數在建立類對象的時候被自動調用,析構函數在類對象生命期結束時,由系統自動調用。

43.什麼時候須要預編譯:

1.老是使用並且不常常改動的大型代碼體。

2.程序由多個模塊組成,全部模塊都使用一組標準的包含文件和相同的編譯選項。在這種狀況下,能夠將全部包含文件預編譯爲一個預編譯頭。

44.多態的做用?

主要是兩個:

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

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

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

答:1.虛擬函數有virtual關鍵字,有虛擬指針和虛函數表,虛擬指針就是虛擬函數的接口,而普通成員函數沒有。

        2.內聯函數和構造函數不能爲虛擬函數。

46.構造函數和析構函數的調用順序? 析構函數爲何要虛擬?

答案:1.構造函數的調用順序:基類構造函數—對象成員構造函數—派生類構造函數;析構函數的調用順序與構造函數相反。

            2.析構函數虛擬是爲了防止析構不完全,形成內存的泄漏。

47.C++中類型爲private的成員變量能夠由哪些函數訪問?

只能夠由本類中的成員函數和友員函數訪問

48.請說出類中private,protected,public三種訪問限制類型的區別:

1.private是私有類型,只有本類中的成員函數訪問。

2.protect是保護型的,本類和繼承類能夠訪問。

3.public是公有類型,任何類均可以訪問。

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

能夠經過構造函數的初始化列表或構造函數的函數體實現。

50.在何時須要使用「常引用」?

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

51.引用與指針有什麼區別?

答:1.引用必須被初始化,指針沒必要。

        2.引用初始化之後不能被改變,指針能夠改變所指的對象。

        3.不存在指向空值的引用,可是存在指向空值的指針。

52.描述實時系統的基本特性:

在特定時間內完成特定的任務,實時性與可靠性。

54.全局變量和局部變量在內存中是否有區別?若是有,是什麼區別?

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

55.堆棧溢出通常是由什麼緣由致使的?

答 、沒有回收垃圾資源

56.什麼函數不能聲明爲虛函數?

答:構造函數(constructor)

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

答 IP地址由兩部分組成,網絡號和主機號。

58..不能作switch()的參數類型是:

答 、switch的參數不能爲實型。

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

答 、能夠用引用頭文件的方式,也能夠用extern關鍵字。

        若是用引用頭文件方式來引用某個在頭文件中聲明的全局變量,假定你將那個變量寫錯了,那麼在編譯期間會報錯,若是你用extern方式引用時,假定你犯了一樣的錯誤,那麼在編譯期間不會報錯,而在鏈接期間報錯。

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

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

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

答案:不是。兩個不一樣類型的指針之間能夠強制轉換(用reinterpret cast)

63.簡述數組與指針的區別?

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

    2.指針能夠隨時指向任意類型的內存塊。

(1)修改內容上的區別

char a[] = 「hello」;

a[0] = ‘X’;

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

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

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

64.C++函數中值的傳遞方式

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

65.內存的分配方式

分配方式有三種:

1.靜態存儲區,是在程序編譯時就已經分配好的,在整個運行期間都存在,如全局變量、常量。

2. 棧上分配,函數內的局部變量就是從這分配的,但分配的內存容易有限。

3. 堆上分配,也稱動態分配,如咱們用new,malloc分配內存,用delete,free來釋放的內存。

66.extern「C」有什麼做用?

extern 「C」是由C++提供的一個鏈接交換指定符號,用於告訴C++這段代碼是C函數。

這是由於C++編譯後庫中函數名會變得很長,與C生成的不一致,形成C++不能直接調用C函數,加上extren 「c」後,C++就能直接調用C函數了。

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

67.用什麼函數開啓新進程、線程。

答:1.線程:CreateThread/AfxBeginThread等。

        2.進程:CreateProcess等。

68.SendMessage和PostMessage有什麼區別?

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

        2.PostMessage是非阻塞的,無論消息是否已被處理,代碼立刻走到PostMessage的下一行。

69.CMemoryState主要功能是什麼?

答:查看內存使用狀況,解決內存泄露問題。

70.2六、#include 和 #include 「filename.h」 有什麼區別?

答:1.對於#include ,編譯器從標準庫路徑開始搜索 filename.h

        2.對於#include 「filename.h」 ,編譯器從用戶的工做路徑開始搜索 filename.h

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

答:編譯時輸出一條錯誤信息,並停止繼續編譯。

72.#if!defined(AFX_…_HADE_H)

#define(AFX_…_HADE_H)

……

#endif做用?

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

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

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

74.數組在作函數實參的時候會轉變爲何類型?

答:數組在作實參時會變成指針類型。

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

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

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

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

76..在Win32下 char, int, float, double各佔多少位?

(1)Char佔用8位(1個字節)

(2)Int 佔用32位(4個字節)

(3)Float 佔用32位(4個字節)

(4)Double 佔用64位(8個字節)

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

答:strcpy()和memcpy()均可以用來拷貝字符串,strcpy()拷貝以’’結束,但memcpy()必須指定拷貝的長度。

78.說明define和const在語法和含義上有什麼不一樣?

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

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

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

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

80.簡述全局變量的優缺點?

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

81.總結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成員變量。

82..總結const的應用和做用?(**************************)

(1)欲阻止一個變量被改變,可使用const關鍵字。在定義該const變量時,一般須要對它進行初始化,由於之後就沒有機會再去改變它了;

(2)對指針來講,能夠指定指針自己爲const,也能夠指定指針所指的數據爲const,或兩者同時指定爲const;

(3)在一個函數聲明中,const能夠修飾形參,代表它是一個輸入參數,在函數內部不能改變其值;

(4)對於類的成員函數,若指定其爲const類型,則代表其是一個常函數,不能修改類的成員變量;voidfun_name() const {}

(5)對於類的成員函數,有時候必須指定其返回值爲const類型,以使得其返回值不爲「左值」。 const void fun_name() {}

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

答:1.指針是一個變量,該變量專門存放內存地址。

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

        3.指針變量的特色是它能夠訪問所指向的內存。

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

答:1.常指針的含義是該指針所指向的地址不能變,但該地址所指向的內容能夠變化,使用常指針能夠保證咱們的指針不能指向其它的變量。

        2.指向常變量的指針是指該指針的變量自己的地址能夠變化,能夠指向其它的變量,可是它所指的內容不能夠被修改。

85.函數指針和指針函數的區別?

答:1.函數指針是指指向一個函數入口的指針。

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

87.簡述Debug版本和Release版本的區別?

Debug版本是調試版本,Release版本是發佈給用戶的最終非調試的版本。

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

int *p[n];-----指針數組,每一個元素均爲指向整型數據的指針。

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

int (*p)[n];數組指針的正肯定義方式。

//這裏搞錯了吧!!!int (*p)[n]????????

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

int (*)p();------p爲指向函數的指針。

//下面 的是 行 列指針。

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

{

int c[2][4];

c[0][0] = 1;

c[0][1] = 2;

c[0][2] = 3;

c[0][3] = 4;

c[1][0] = 5;

c[1][1] = 6;

c[1][2] = 7;

c[1][3] = 8;

int (*p)[4] = c + 0;//c + 0 爲行指針!定義一個行指針 int (*p)[n],

//int *p1 = c + 1;// 這裏會報錯。: cannot convert from 'int (*)[4]' to 'int *'

int *pa = *c + 1;// *c+1 表示 列指針。!

return 0;

}

// 關於 函數指針的概念。

void myfun( int a, int b)

{

int c = 0;

int d = 0;

cout << "sdfsd" << endl;

}

void myfun1( int a, int b)

{

int c = 0;

int d = 0;

cout << "sdfsd" << endl;

}

typedef void (*PMYFUN)( int a, int b );

PMYFUN iFxn;//用這種新的類型去定義一個 變量!

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

{

iFxn = myfun;//給該指針變量 賦值,代表他是指向那個函數。

iFxn(2, 3);

iFxn = myfun1;

iFxn(32, 3);//y用指針去掉具體的函數。

return 0;

}

// 關於 函數指針的概念。

關於 函數指針的概念。 能夠將這個 pThreadProc 理解爲一個 新的類型,只不過該類型是一個指針。

pThreadProc pfun1;// 用 pThreadProc 這種新的類型去定義的變量是一個指針。

pfun1 = myfun;// 這句就是核心的代碼,將指明調用的是那個函數。

current read

89.static函數與普通函數有什麼區別?

static函數在內存中只有一份,普通函數在每一個被調用中維持一份拷貝

90.struct(結構) 和 union(聯合)的區別?

答:1. 結構和聯合都是由多個不一樣的數據類型成員組成, 但在任何同一時刻, 聯合中只存放了一個被選中的成員(全部成員共用一塊地址空間), 而結構的全部成員都存在(不一樣成員的存放地址不一樣)。

        2. 對於聯合的不一樣成員賦值, 將會對其它成員重寫,原來成員的值就不存在了, 而對於結構的不一樣成員賦值是互不影響的。

91.class 和 struct 的區別?

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

92.簡述枚舉類型?

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

93.assert()的做用?

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

94.局部變量和全局變量是否能夠同名?

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

95.程序的局部變量存在於(棧)中,全局變量存在於(靜態區 )中,動態申請數據存在於( 堆)中。

96.在何時使用常引用?

答:若是既要利用引用提升程序的效率,又要保護傳遞給函數的數據不在函數中被改變,就應使用常引用。

97.類的聲明和實現的分開的好處?

1.起保護做用;

2.提升編譯的效率。

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

由一下3部分組成:

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

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

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

99.什麼是消息映射?

消息映射就是讓程序員指定MFC類(有消息處理能力的類)處理某個消息。而後由程序員完成對該處理函數的編寫,以實現消息處理功能。

100. 什麼是UDP和TCP的區別是什麼?

TCP的全稱爲傳輸控制協議。這種協議能夠提供面向鏈接的、可靠的、點到點的通訊。

UDP全稱爲用戶報文協議,它能夠提供非鏈接的不可靠的點到多點的通訊。

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

101. winsock創建鏈接的主要實現步驟?

答:1.服務器端:socket()創建套接字,綁定(bind)並監聽(listen),用accept()等待客戶端鏈接, accept()發現有客戶端鏈接,創建一個新的套接字,自身從新開始等待鏈接。該新產生的套接字使用send()和recv()寫讀數據,直至數據交換完畢,closesocket()關閉套接字。

        2.客戶端:socket()創建套接字,鏈接(connect)服務器,鏈接上後使用send()和recv(),在套接字上寫讀數據,直至數據交換完畢,closesocket()關閉套接字。

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

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

103. 構成Win32 API 函數的三個動態連接庫是什麼?

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

104. 建立一個窗口的步驟是?

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

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

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

2.模態對話框在沒有關閉前用戶不能進行其餘操做,而非模態對話框能夠。

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

106. 從EDIT框中取出數據給關聯的變量,已經把關聯的變量的數據顯示在EDIT框上的函數是什麼?

答: 取出 UpdateData(TRUE),顯示 Updatedata(FALSE).

107. 簡單介紹GDI?

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

108. windows消息分爲幾類?並對各種作簡單描述。

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

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

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

4.用戶自定義消息。

109. 如何自定義消息?

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

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

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

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

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

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

1.成員限定符

2.虛基類

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

在多態中,若是程序在編譯階段就能肯定實際執行動做,則稱靜態關聯,

若是等到程序運行才能肯定叫動態關聯。

113多態的兩個必要條件(*****************************************)

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

2.虛函數

114.什麼叫智能指針?(*****************************************)

答:當一個類中,存在一個指向另外一個類對象的指針時,對指針運算符進行重載,那麼當前類對象能夠經過指針像調用自身成員同樣調用另外一個類的成員。

115.何時須要用虛析構函數?

答:當基類指針指向用new運算符生成的派生類對象時,delete基類指針時,派生類部分沒有釋放掉而形成釋放不完全現象,須要虛析構函數。

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

CObject

117.什麼是平衡二叉樹?

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

118.語句for( ;1 ;)有什麼問題?它是什麼意思?

答:無限循環,和while(1)相同。

119.派生新類的過程要經歷三個步驟:

1吸取基類成員

2.改造基類成員

3.添加新成員

121. TCP/IP 創建鏈接的過程

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

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

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

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

122 .memset ,memcpy 的區別

memset用來對一段內存空間所有設置爲某個字符,通常用在對定義的字符串進行初始化爲''。

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

123. 在C++ 程序中調用被 C 編譯器編譯後的函數,爲何要加 extern 「C」?(*****************************************)

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

        與C 語言的不一樣。假設某個函數的原型爲: void foo(int x, int y);該函數被C 編譯器編譯後在庫中的名字爲_foo , 而C++編譯器則會產生像_foo_int_int 之類的名字。C++提供了C 鏈接交換指定符號extern「C」來解決名字匹配問題。

124怎樣定義一個純虛函數?含有純虛函數的類稱爲何?

在虛函數的後面加=0,含有虛函數的類稱爲抽象類。

 

current read

125.C++語言是在___ C ______語言的基礎上發展起來的。

126.C++語言的編譯單位是擴展名爲____ .cpp______的____程序______文件。

127.行尾使用註釋的開始標記符爲____ //_____。

128.多行註釋的開始標記符和結束標記符分別爲_____/**/ _______。

129.用於輸出表達式值的標準輸出流對象是____ cout_____。

130.用於從鍵盤上爲變量輸入值的標準輸入流對象是__ cin______。

131. 一個完整程序中必須有一個名爲____ main____的函數。

132.一個函數的函數體就是一條____複合_____語句。

133.當執行cin語句時,從鍵盤上輸入每一個數據後必須接着輸入一個___空白_____符,而後才能繼續輸入下一個數據。

134.在C++程序中包含一個頭文件或程序文件的預編譯命令爲____#include ______。

135.程序中的預處理命令是指以___#___字符開頭的命令。

136.一條表達式語句必須以___分號___做爲結束符。

137.在#include命令中所包含的頭文件,能夠是系統定義的頭文件,也能夠是___用戶(或編程者_____定義的頭文件。

138.使用#include命令能夠包含一個頭文件,也能夠包含一個__程序____文件。

139.一個函數定義由__函數頭______和__函數體_____兩部分組成。

140.若一個函數的定義處於調用它的函數以前,則在程序開始能夠省去該函數的__原型(或聲明)____語句。

141.C++頭文件和源程序文件的擴展名分別爲__.h ___和___.cpp ___。

142.程序文件的編譯錯誤分爲____警告(warning)____和____致命(error) ____兩類。

143.當使用___ void ____保留字做爲函數類型時,該函數不返回任何值。

144.當函數參數表用___ void __保留字表示時,則表示該參數表爲空。

145.從一條函數原型語句「int fun1(void);」可知,該函數的返回類型爲__int____,該函數帶有___0___個參數。

146.當執行cout語句輸出endl數據項時,將使C++顯示輸出屏幕上的光標從當前位置移動到___下一行_____的開始位置。

147.假定x=5,y=6,則表達式x++*++y的值爲___35_______。

148.假定x=5,y=6,則表達式x--*--y的值爲___25_______。

149.假定x=5,y=6,則執行表達式y*=x++計算後,x和y的值分別爲___6___和___30 _____。

150.假定x=5,y=6,則執行表達式y+=x--計算後,x和y的值分別爲____4__和___11___。

151.C++常數0x145對應的十進制值爲___325 ___。

152.C++常數0345對應的十進制值爲____ 229__。

153.十進制常數245對應的十六進制的C++表示爲____0xF5___。

154.十進制常數245對應的八進制的C++表示爲___0365 ___。

155.signed char類型的值域範圍是__-128__至___+127 __之間的整數。

156.int和float類型的數據分別佔用___ 4___和____ 4___個字節。

157.float和double類型的數據分別佔用____ 4___和_____8___個字節。

158.bool和char類型的數據分別佔用_____1____和____1___個字節。

159.unsigned short int和int類型的長度分別爲____ 2___和____4___。

160.字符串」This’s a book.n」的長度爲_____ 15____。

161.字符串」nThis’s a pennn」的長度爲_____ 15_____。

162.在C++中存儲字符串」abcdef」至少須要___7 _____個字節。

163.在C++中存儲字符串」a+b=c」至少須要_____6 ___個字節。

164.假定x和y爲整型,其值分別爲16和5,則x%y和x/y的值分別爲___1_______和____3____。

165.假定x和y爲整型,其值分別爲16和5,則x/y和double(x)/y的值分別爲____3____和___3.2____。

166.假定x是一個邏輯量,則x && true的值爲___ x ____。

167.假定x是一個邏輯量,則x || true的值爲_____ true(或1)_____。

168.假定x是一個邏輯量,則x && false的值爲____ false(或0) ___。

169.假定x是一個邏輯量,則x || false的值爲x。

170.假定x是一個邏輯量,則!x || false的值爲____!x ____。

171.假定x是一個邏輯量,則x && !x的值爲____ false(或0)____。

172.假定x是一個邏輯量,則x || !x的值爲____ true(或1)___。

173.設enum Printstatus{ready,busy,error}; 則 cout<

174.設enum Printstatus{ready=2,busy,error}; 則cout<

175.常數-4.205和6.7E-9分別具備___4_____和____2___位有效數字。

176.枚舉類型中的每一個枚舉值都是一個____枚舉常量_____,它的值爲一個___整數____。

177.常數100和3.62的數據類型分別爲____ int ___和_____ double ___。

178.若x=5, y=10, 則計算y*=++x表達式後,x和y的值分別爲___6___和__60 ___。

179.假定x和ch分別爲int型和char型,則sizeof(x)和sizeof(ch)的值分別爲__4__和__1__。

180.假定x=10,則表達式x<=10?20:30的值爲__ 20 __。

181.表達式sqrt(81)和pow(6,3)的值分別爲___9 ___和___216___。

182.含隨機函數的表達式rand() 的值在___0__至___ 19 __區間內。

183.在switch語句中,每一個語句標號所含關鍵字case後面的表達式必須是___常量___。

184.在if語句中,每一個else關鍵字與它前面同層次而且最接近的____ if ____關鍵字相配套。

185.做爲語句標號使用的C++保留字case和defaule只能用於___ switch ___語句的定義體中。

186.執行switch語句時,在進行做爲條件的表達式求值後,將從某個匹配的標號位置起向下執行,當碰到下一個標號位置時(中止/不中止)___不中止__執行。

187.若while循環的「頭」爲「while(i++<=10)」,而且i的初值爲0,同時在循環體中不會修改i的值,則循環體將被重複執行__11___次後正常結束。

188.若do循環的「尾」爲「while(++i<10)」,而且i的初值爲0,同時在循環體中不會修改i的值,則循環體將被重複執行___10 ___次後正常結束。

189.當在程序中執行到break語句時,將結束本層循環類語句或switch語句的執行。

190.當在程序中執行到___ continue___語句時,將結束所在循環語句中循環體的一次執行。

191.在程序中執行到__ return ___語句時,將結束所在函數的執行過程,返回到調用該函數的位置。

192.在程序執行完____主(或main)__函數調用後,將結束整個程序的執行過程,返回到C++集成開發窗口。

193.元素類型爲int的數組a[10]共佔用___ 40___字節的存儲空間。

194.元素類型爲double的二維數組a[4][6]共佔用____192__字節的存儲空間。

195.元素類型爲char的二維數組a[10][30]共佔用___300__字節的存儲空間。

196.存儲字符’a’和字符串」a」分別須要佔用_____1___和____2 ___個字節。

197.以面向對象方法構造的系統,其基本單位是_____對象___。

198.每一個對象都是所屬類的一個__實例__。

199.C++支持兩種多態性:___編譯____時的多態性和____運行__時的多態性。

200.在C++中,編譯時的多態性是經過___重載___實現的,而運行時的多態性則是經過___虛函數____實現的。對於類中定義的任何成員,其隱含訪問權限爲___ private(或私有)__。

201.對於結構中定義的任何成員,其隱含訪問權限爲__ public(或公有)_。

202.若在類的定義體中給出了一個成員函數的完整定義,則該函數屬於__內聯__函數。

203.爲了不在調用成員函數時修改對象中的任何數據成員,則應在定義該成員函數時,在函數頭的後面加上__ const __關鍵字。

204.若只須要經過一個成員函數讀取數據成員的值,而不須要修改它,則應在函數頭的後面加上__ const __關鍵字。

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

成員函數被重載的特徵:

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

(2)函數名字相同;

(3)參數不一樣;

(4)virtual 關鍵字無關緊要。

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

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

(2)函數名字相同;

(3)參數相同;

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

「隱藏」是指派生類的函數屏蔽了與其同名的基類函數,規則以下:

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

(2)若是派生類的函數與基類的函數同名,而且參數也相同,可是基類函數沒有virtual 關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)

做者:少帥yangjie 連接:https://www.jianshu.com/p/01721f639924 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索