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.類繼承可以較方便地改變父類的實現。
缺點:
1、因為繼承在編譯時刻就定義了,所以無法在運行時刻改變從父類繼承的實現
2、父類通常至少定義了子類的部分行為,父類的任何改變都可能影響子類的行為
3、如果繼承下來的實現不適合解決新的問題,則父類必須重寫或被其他更適合的類替換。這種依賴關系限制了靈活性并最終限制了復用性。
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.26、#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 關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)