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 關鍵字,此時,基類的函式被隱藏(注意別與覆寫混淆),
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 關鍵字,此時,基類的函式被隱藏(注意別與覆寫混淆)
作者:少帥yangjie
鏈接:https://www.jianshu.com/p/01721f639924
來源:簡書
著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請注明出處,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/252425.html
標籤:C++
上一篇:STL_list容器
