1. 在C++中,不能被重載的運算符有:
2. C++語言多態(tài)性:編譯時多態(tài)和運行時多態(tài):
3. C++中,頭文件引用問題:
解析:此題考查運算符優(yōu)先級和&&使用規(guī)則,首先=優(yōu)先級低于判斷< ,有m=0,&&左側(cè)為false,則不執(zhí)行右側(cè),因此n的值不變?yōu)?;
5. 重載函數(shù)是指同一個函數(shù)名可以對應多個函數(shù)的實現(xiàn),編譯器會根據(jù)參數(shù)個數(shù)、參數(shù)類型不同而自動調(diào)用相應的函數(shù);注意函數(shù)返回值類型不能作為重載的判斷條件。
6. 運算符重載規(guī)則:
7. 循環(huán)語句問題:
8. 構造函數(shù)問題:
9. const與define:
10. 在類的const成員函數(shù)中,用mutable修飾成員變量后,就可以修改類的成員變量了~
11. 關于類型轉(zhuǎn)換:
1. 若一組待排數(shù)據(jù)有序,花費時間最多的是:快速排序,T(n)=O(n^2);
2. 有 1000 個無序的整數(shù),希望使用最快的方式找出前 50 個最大的,最佳的選擇是?
快速排序:在最理想的情況下,即劃分可以使得每次分到n/2 的兩個序列,復雜度為o(nlogn);
堆排序:無論什么情況都是o(nlogn),當然還有建堆的時間o(n),所以為n+nlogn,但是,本題只是要前五十個,所以堆排序只需要執(zhí)行50次就夠了:n+50log;
堆排序相對較好;
3. 處理哈希沖突的方法:
開放定址法(線性探測法,線性補償探測法,隨機探測法);
拉鏈法;
建立公共溢出區(qū);
再散列法;
4. 詞法分析器用于識別單詞;
5. 計算機操作系統(tǒng)出現(xiàn)死鎖的原因:若干進程因競爭資源而無休止的等待著其他進程釋放已占有的資源;
6. TCP的關閉過程,處于TIME_WAIT狀態(tài)的連接等待2MSL后真正關閉連接;
7. (智力題)賽馬,有25匹馬,每次只能5匹馬進行比賽,比賽只能得到5匹馬之間的快慢程度,而不是速度,請問,最少要比 1 次,才能獲得最快的前3匹馬?
分析:25匹馬,速度都不同,但每匹馬的速度都是定值。現(xiàn)在只有5條賽道,無法計時,即每賽一場最多只能知道5匹馬的相對快慢。問最少賽幾場可以找出25匹馬中速度最快的前3名? 每匹馬都至少要有一次參賽的機會,所以25匹馬分成5組,一開始的這5場比賽是免不了的。接下來要找冠軍也很容易,每一組的冠軍在一起賽一場就行了 (第6場)。最后就是要找第2和第3名。我們按照第6場比賽中得到的名次依次把它們在前5場比賽中所在的組命名為A、B、C、D、E。即:A組的冠軍是第 6場的第1名,B組的冠軍是第6場的第2名……每一組的5匹馬按照他們已經(jīng)賽出的成績從快到慢編號: A組:1,2,3,4,5 B組:1,2,3,4,5 C組:1,2,3,4,5 D組:1,2,3,4,5 E組:1,2,3,4,5 從現(xiàn)在所得到的信息,我們可以知道哪些馬已經(jīng)被排除在3名以外。只要已經(jīng)能確定有3匹或3匹以上的馬比這匹馬快,那么它就已經(jīng)被淘汰了??梢钥吹?, 只有上表中粗體的那5匹馬是有可能為2、3名的。即:A組的2、3名;B組的1、2名,C組的第1名。取這5匹馬進行第7場比賽,第7場比賽的前兩名就是 25匹馬中的2、3名。故一共最少要賽7場。
1. 異步通信和同步通信的區(qū)別?
同步通信要求接收端時鐘頻率和發(fā)送端時鐘頻率一致,發(fā)送端發(fā)送連續(xù)的比特流;異步通信不要求接收端時鐘和發(fā)送端時鐘同步,發(fā)送端發(fā)送完一個字節(jié)后,可以經(jīng)過任意長的時間間隔再發(fā)送下一個字節(jié);
同步通信效率高,異步通信效率低;
同步通信復雜,雙方時鐘允許的誤差小;異步通信簡單,雙方時鐘可以允許一定誤差;
同步通信可用于點對多點,異步通信只適用于點對點;
2. TCP協(xié)議的作用?三次握手?
TCP提供面向連接的可靠數(shù)據(jù)傳輸服務,依靠接收端TCP軟件按序號對收到的數(shù)據(jù)分組進行逐一確認實現(xiàn)。
三次握手過程:
第一次握手,建立連接時,客戶端發(fā)送SYN(syn=j)包到服務器,進入SYN_SEND狀態(tài),等待服務器確認;
第二次握手,服務器收到SYN包,確認客戶的SYN(ack=j+1),同時自己發(fā)送一個SYN(syn=k)包,即SYN+ACK包,此時服務器進入SYN_RECV狀態(tài);
第三次握手,客戶端收到服務器的SYN+ACK包,向服務器發(fā)送ACK(ack=k+1),此包發(fā)送完畢后,客戶端和服務器進入ESTABLISHED狀態(tài),完成三次握手;
3. 操作系統(tǒng)執(zhí)行程序時,內(nèi)存分配是怎樣的?
棧(stack)區(qū):由編譯器自動分配與釋放,存放函數(shù)的參數(shù)值,局部變量等,主要操作方式類似于數(shù)據(jù)結(jié)構中的棧;
堆(heap)區(qū):一般由程序員分配與釋放,若程序員不釋放,程序結(jié)束時,可能由OS回收。它與數(shù)據(jù)結(jié)構中的堆無關,分配方式類似于鏈表;
全局區(qū)(靜態(tài)區(qū)):全局變量和靜態(tài)變量的存儲區(qū)域,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和靜態(tài)變量在相鄰的另一塊區(qū)域,程序結(jié)束后由系統(tǒng)釋放;
文字常量區(qū):常量字符串存儲區(qū)域,程序結(jié)束后,由系統(tǒng)釋放;
程序代碼區(qū):存放函數(shù)體的二進制代碼;
4. 堆與棧的區(qū)別?
stack空間由操作系統(tǒng)自動分配與釋放,堆上的空間需要手動分配和釋放;
棧stack空間有限,堆heap有很大的自由空間;
程序在編譯期對變量和函數(shù)分配內(nèi)存都在棧上進行,且程序運行過程中函數(shù)調(diào)用參數(shù)的傳遞也在棧上進行;
5. 進程之間通信方式?
信號( sinal ) : 信號是一種比較復雜的通信方式,用于通知接收進程某個事件已經(jīng)發(fā)生;
信號量( semophore ) : 信號量是一個計數(shù)器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內(nèi)不同線程之間的同步手段。
消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內(nèi)核中并由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點。
共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進程所訪問的內(nèi)存,這段共享內(nèi)存由一個進程創(chuàng)建,但多個進程都可以訪問。共享內(nèi)存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號兩,配合使用,來實現(xiàn)進程間的同步和通信。
管道(有名管道,無名管道,高級管道):有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信;無名管道( pipe )是一種半雙工的通信方式,數(shù)據(jù)只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系;高級管道(popen)將另一個程序當做一個新的進程在當前程序進程中啟動,則它算是當前程序的子進程,這種方式我們成為高級管道方式。
套接字( socket ) : 套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用于不同機器間的進程通信。
7. 面向?qū)ο蟮娜齻€特征,分別的作用?
封裝:把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法讓可信的類或?qū)ο蟛僮鳎瑢Σ豢尚诺倪M行隱藏;
繼承:它可以使用現(xiàn)有的類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進行擴展;繼承是面向?qū)ο筌浖夹g當中的一個概念。如果一個類B繼承自另一個類A,就把這個B稱為A的子類,而把A稱為B的父類。繼承可以使得子類具有父類的各種屬性和方法,而不需要再次編寫相同的代碼。在令子類繼承父類的同時,可以重新定義某些屬性,并重寫某些方法,即覆蓋父類的原有屬性和方法,使其獲得與父類不同的功能。
多態(tài)(Polymorphisn):多態(tài)性是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之后,父對象就可以根據(jù)當前賦值給它的子對象的特性以不同的方式運作。簡單的說:允許將子類類型的指針賦值給父類類型的指針。多態(tài)性在C++中都是通過虛函數(shù)(Virtual Function)實現(xiàn)的。虛函數(shù)就是允許被其子類重新定義的成員函數(shù)。而子類重新定義父類虛函數(shù)的做法,稱為“覆蓋”或者稱為“重寫”(override)。
8. C++與Java的區(qū)別?
內(nèi)存管理:java有垃圾回收機制,jvm管理內(nèi)存;C++通過new與delete運算符由程序員控制內(nèi)存的分配與釋放;
全局變量:Java不在所有類之外定義全局變量,而是在某個類中定義一種公用靜態(tài)的變量來完成全局變量的功能。
Java不支持頭文件,面C和C++語言中都用頭文件來定義類的原型,全局變量,庫函數(shù)等,這種采用頭文件的結(jié)構使得系統(tǒng)的運行維護相當繁雜。
Java不支持宏定義,而是使用關鍵字final來定義常量,在C++中則采用宏定義來實現(xiàn)常量定義,這不得于程序的可讀性.
類型轉(zhuǎn)換不同.在C和C++中,可通過指針進行任意的類型轉(zhuǎn)換,常常帶來不安全性,而在Java中,運行時系統(tǒng)對對象的處理要進行類型相容性檢查,以防止不安全的轉(zhuǎn)換.
Java不用goto語句,而是用try-catch-finally異常處理語句來代替goto語句處理出錯的功能.
Java對每種數(shù)據(jù)類型都分配固定長度.比如,在Java中,int類型總是32位的,而在C和C++中,對于不同的平臺,同一個數(shù)據(jù)類型分配不同的字節(jié)數(shù),同樣是int類型,在PC機中為二字節(jié)即16位,而在VAX-11中,則為32位.這使得C語言造成不可移植性,而Java則具有跨平臺性(平臺無關性).
結(jié)構和聯(lián)合的處理.在C和C++中,結(jié)構和聯(lián)合的所有成員均為公有,這就帶來了安全性問題,而在Java中根本就不包含結(jié)構和聯(lián)合,所有的內(nèi)容都封裝在類里面
Java不再使用指針.指針是C和C++中最靈活,也最容易產(chǎn)生錯誤的數(shù)據(jù)類型.由指針所進行的內(nèi)存地址操作常會造成不可預知的錯誤,同時通過指針對某個內(nèi)存地址進行顯式類型轉(zhuǎn)換后,可以訪問一個C++中的私有成員,從而破壞安全性.而Java對指針進行完全地控制,程序員不能直接進行任何指針操作.
9. Windows編程中,消息機制,一個自定義消息如何實現(xiàn)?
自定義消息:#define
在頭文件中聲明函數(shù);
在消息映射中添加對應關系;
定義消息函數(shù)并實現(xiàn);
核心:函數(shù)原型,關聯(lián)消息與消息響應函數(shù)的宏,函數(shù)實現(xiàn);