1.static有什麼用途?(請至少說明兩種)
1)在函數體,一個被聲明為靜態變數在這一函數被調用過程中維持其值不變。
2) 在模組內(但在函數體外),一個被聲明為靜態變數可以被模組內所用函數訪問,但不能被模組外其它函數訪問。它是一個本地的全域變數。
3) 在模組內,一個被聲明為靜態函數只可被這一模組內的其它函數調用。那就是,這個函數被限制在聲明它的模組的本地範圍內使用
2.引用與指標有什麼區別?
1) 引用必須被初始化,指標不必。
2) 引用初始化以後不能被改變,指標可以改變所指的對象。
3) 不存在指向空值的引用,但是存在指向空值的指標。
3.描述即時系統的基本特性
在特定時間內完成特定的任務,即時性與可靠性。
4.全域變數和局部變數在記憶體中是否有區別?如果有,是什麼區別?
全域變數儲存在待用資料庫,局部變數在堆棧。
5.什麼是平衡二叉樹?
左右子樹都是平衡二叉樹 且左右子樹的深度差值的絕對值不大於1。
6.堆疊溢位一般是由什麼原因導致的?
沒有回收垃圾資源。
7.什麼函數不能聲明為虛函數?
constructor函數不能聲明為虛函數。
8.冒泡排序演算法的時間複雜度是什嗎?
時間複雜度是O(n^2)。
9.寫出float x 與“零值”比較的if語句。
if(x>0.000001&&x<-0.000001)
10.Internet採用哪種網路通訊協定?該協議的主要階層?
Tcp/Ip協議
主要階層為: 應用程式層/傳輸層/網路層/資料連結層/物理層。
11.Internet物理地址和IP地址轉換採用什麼協議?
ARP (Address Resolution Protocol)(位址解析協議)
12.IP地址的編碼分為哪倆部分?
IP地址由兩部分組成,網路號和主機號。不過是要和“子網路遮罩”按位與上之後才能區分哪些是網路位哪些是主機位。
13.使用者輸入M,N值,從1至N開始順序迴圈數數,每數到M輸出該數值,直至全部輸出。寫出C程式。
迴圈鏈表,用取餘操作做
14.不能做switch()的參數類型是:
switch的參數不能為實型。
1.寫出判斷ABCD四個運算式的是否正確, 若正確, 寫出經過運算式中 a的值(3分)
int a = 4;
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);
a = ?
答:C錯誤,左側不是一個有效變數,不能賦值,可改為(++a) += a;
改後答案依次為9,10,10,11
2.某32位系統下, C++程式,請計算sizeof 的值(5分).
char str[] = “http://www.ibegroup.com/”
char *p = str ;
int n = 10;
請計算
sizeof (str ) = ?(1)
sizeof ( p ) = ?(2)
sizeof ( n ) = ?(3)
void Foo ( char str[100]){
請計算
sizeof( str ) = ?(4)
}
void *p = malloc( 100 );
請計算
sizeof ( p ) = ?(5)
答:(1)17 (2)4 (3) 4 (4)4 (5)4
3. 回答下面的問題. (4分)
(1).標頭檔中的 ifndef/define/endif 幹什麼用?預先處理
答:防止標頭檔被重複引用
(2). #i nclude 和 #i nclude “filename.h” 有什麼區別?
答:前者用來包含開發環境提供的庫標頭檔,後者用來包含自己編寫的標頭檔。
(3).在C++ 程式中調用被 C 編譯器編譯後的函數,為什麼要加 extern “C”聲明?
答:函數和變數被C++編譯後在符號庫中的名字與C語言的不同,被extern "C"修飾的變
量和函數是按照C語言方式編譯和串連的。由於編譯後的名字不同,C++程式不能直接調
用C 函數。C++提供了一個C 串連交換指定符號extern“C”來解決這個問題。
(4). switch()中不允許的資料類型是?
答:實型
4. 回答下面的問題(6分)
(1).Void GetMemory(char **p, int num){
*p = (char *)malloc(num);
}
void Test(void){
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
請問運行Test 函數會有什麼樣的結果?
答:輸出“hello”
(2). void Test(void){
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL){
strcpy(str, “world”);
printf(str);
}
}
請問運行Test 函數會有什麼樣的結果?
答:輸出“world”
(3). char *GetMemory(void){
char p[] = "hello world";
return p;
}
void Test(void){
char *str = NULL;
str = GetMemory();
printf(str);
}
請問運行Test 函數會有什麼樣的結果?
答:無效的指標,輸出不確定
5. 編寫strcat函數(6分)
已知strcat函數的原型是char *strcat (char *strDest, const char *strSrc);
其中strDest 是目的字串,strSrc 是源字串。
(1)不調用C++/C 的字串庫函數,請編寫函數 strcat
答:
VC源碼:
char * __cdecl strcat (char * dst, const char * src)
{
char * cp = dst;
while( *cp )
cp++; /* find end of dst */
while( *cp++ = *src++ ) ; /* Copy src to end of dst */
return( dst ); /* return dst */
}
(2)strcat能把strSrc 的內容串連到strDest,為什麼還要char * 類型的傳回值?
答:方便賦值給其他變數
6.MFC中CString是型別安全類嗎?
答:不是,其它資料類型轉換到CString可以使用CString的成員函數Format來轉換
7.C++中為什麼用模板類。
答:(1)可用來建立動態增長和減小的資料結構
(2)它是類型無關的,因此具有很高的可複用性。
(3)它在編譯時間而不是運行時檢查資料類型,保證了型別安全
(4)它是平台無關的,可移植性
(5)可用於基礎資料型別 (Elementary Data Type)
8.CSingleLock是幹什麼的。
答:同步多個線程對一個資料類的同時訪問
9.NEWTEXTMETRIC 是什麼。
答:物理字型結構,用來設定字型的高寬大小
10.程式什麼時候應該使用線程,什麼時候單線程效率高。
答:1.耗時的操作使用線程,提高應用程式響應
2.並行操作時使用線程,如C/S架構的伺服器端並發線程響應使用者的請求。
3.多CPU系統中,使用線程提高CPU利用率
4.改善程式結構。一個既長又複雜的進程可以考慮分為多個線程,成為幾個獨立或半獨
立的運行部分,這樣的程式會利於理解和修改。
其他情況都使用單線程。
11.Windows是核心級線程麼。
答:見下一題
12.Linux有核心級線程麼。
答:線程通常被定義為一個進程中代碼的不同執行路線。從實現方式上劃分,線程有兩
種類型:“使用者級線程”和“核心級線程”。 使用者線程指不需要核心支援而在使用者程式
中實現的線程,其不依賴於作業系統核心,應用進程利用線程庫提供建立、同步、調度
和管理線程的函數來控制使用者線程。這種線程甚至在象 DOS 這樣的作業系統中也可實現
,但線程的調度需要使用者程式完成,這有些類似 Windows 3.x 的協作式多任務。另外一
種則需要核心的參與,由核心完成線程的調度。其依賴於作業系統核心,由核心的內部
需求進行建立和撤銷,這兩種模型各有其好處和缺點。使用者線程不需要額外的核心開支
,並且使用者態線程的實現方式可以被定製或修改以適應特殊應用的要求,但是當一個線
程因 I/O 而處於等待狀態時,整個進程就會被發送器切換為等待狀態,其他線程得不
到啟動並執行機會;而核心線程則沒有各個限制,有利於發揮多處理器的並發優勢,但卻占
用了更多的系統開支。
Windows NT和OS/2支援核心線程。Linux 支援核心級的多線程
13.C++中什麼資料分配在棧或堆中,New分配資料是在近堆還是遠堆中?
答:棧: 存放局部變數,函數調用參數,函數傳回值,函數返回地址。由系統管理
堆: 程式運行時動態申請,new 和 malloc申請的記憶體就在堆上
14.使用線程是如何防止出現大的波峰。
答:意思是如何防止同時產生大量的線程,方法是使用線程池,線程池具有可以同時提
高調度效率和限制資源使用的好處,線程池中的線程達到最大數時,其他線程就會排隊
等候。
15函數模板與類模板有什麼區別?
答:函數模板的執行個體化是由編譯器在處理函數調用時自動完成的,而類模板的執行個體化
必須由程式員在程式中顯式地指定。
16一般資料庫若出現日誌滿了,會出現什麼情況,是否還能使用?
答:只能執行查詢等讀操作,不能執行更改,備份等寫操作,原因是任何寫操作都要記
錄日誌。也就是說基本上處於不能使用的狀態。
17 SQL Server是否支援行級鎖,有什麼好處?
答:支援,設立封鎖機制主要是為了對並行作業進行控制,對幹擾進行封鎖,保證資料
的一致性和準確性,行級封鎖確保在使用者取得被更新的行到該行進行更新這段時間內不
被其它使用者所修改。因而行級鎖即可保證資料的一致性又能提高資料操作的迸發性。
18如果資料庫滿了會出現什麼情況,是否還能使用?
答:見16
19 關於記憶體對齊的問題以及sizof()的輸出
答:編譯器自動對齊的原因:為了提高程式的效能,資料結構(尤其是棧)應該儘可能
地在常態範圍上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問
;然而,對齊的記憶體訪問僅需要一次訪問。
20 int i=10, j=10, k=3; k*=i+j; k最後的值是?
答:60,此題考察優先順序,實際寫成: k*=(i+j);,賦值運算子優先順序最低
21.對資料庫的一張表進行操作,同時要對另一張表進行操作,如何??
答:將操作多個表的操作放入到事務中進行處理
22.TCP/IP 建立串連的過程?(3-way shake)
答:在TCP/IP協議中,TCP協議提供可靠的串連服務,採用三向交握建立一個串連。
第一次握手:建立串連時,用戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀
態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個
SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三向交握:用戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1)
,此包發送完畢,用戶端和伺服器進入ESTABLISHED狀態,完成三向交握。
23.ICMP是什麼協議,處於哪一層?
答:Internet控制報文協議,處於網路層(IP層)
24.觸發器怎麼工作的?
答:觸發器主要是通過事件進行觸發而被執行的,當對某一表進行諸如UPDATE、 INSERT
、 DELETE 這些操作時,資料庫就會自動執行觸發器所定義的SQL 陳述式,從而確保對數
據的處理必須符合由這些SQL 陳述式所定義的規則。
25.winsock建立串連的主要實現步驟?
答:伺服器端:socker()建立通訊端,綁定(bind)並監聽(listen),用accept()
等待用戶端串連。
用戶端:socker()建立通訊端,串連(connect)伺服器,串連上後使用send()和recv(
),在通訊端上寫讀資料,直至資料交換完畢,closesocket()關閉通訊端。
伺服器端:accept()發現有用戶端串連,建立一個新的通訊端,自身重新開始等待連
接。該新產生的通訊端使用send()和recv()寫讀資料,直至資料交換完畢,closesock
et()關閉通訊端。
26.動態串連庫的兩種方式?
答:調用一個DLL中的函數有兩種方法:
1.載入時動態連結(load-time dynamic linking),模組非常明確調用某個匯出函數
,使得他們就像本地函數一樣。這需要連結時連結那些函數所在DLL的匯入庫,匯入庫向
系統提供了載入DLL時所需的資訊及DLL函數定位。
2.運行時動態連結(run-time dynamic linking),運行時可以通過LoadLibrary或Loa
dLibraryEx函數載入DLL。DLL載入後,模組可以通過調用GetProcAddress擷取DLL函數的
出口地址,然後就可以通過返回的函數指標調用DLL函數了。如此即可避免匯入庫檔案了
。
27.IP組播有那些好處?
答:Internet上產生的許多新的應用,特別是高頻寬的多媒體應用,帶來了頻寬的急劇
消耗和網路擁擠問題。組播是一種允許一個或多個寄件者(組播源)發送單一的資料包
到多個接收者(一次的,同時的)的網路技術。組播可以大大的節省網路頻寬,因為無
論有多少個目標地址,在整個網路的任何一條鏈路上只傳送單一的資料包。所以說組播
技術的核心就是針對如何節約網路資源的前提下保證服務品質。