一些典型的筆試面試題

2021-07-05 03:09:33 字數 3645 閱讀 8930

關於c/c++基礎知識的面試題

已知string類定義如下,嘗試寫出類的成員函式實現。

class string;答:

string::string(const char *str)

else

}string::string(const string &another)

string& string::operator =(const string &rhs)

string::~string()

交換變數a和b的值

#defineswap(a,b) a=a+b;b=a-b;a=a-b;

變數a和b,不用if、?:、switch或其它判斷語句,找出最大的乙個變數。

答:( ( a + b) + abs( a- b ) ) / 2

static全域性變數與普通的全域性變數有什麼區別?static區域性變數和普通區域性變數有什麼區別?static函式與普通函式有什麼區別?(20分)

static全域性變數與普通全域性變數的區別:前者在主函式之前就要被初始化,(2分)後者無要求。(2分)

static區域性變數和普通區域性變數的區別:static全句變數是所有函式共享的變數,在乙個函式使用完它後它的值會保持到下乙個函式來改變它(2分)。後者,本函式所宣告的區域性變數在本函式執行完之後會被銷毀。(2分)

static函式與普通函式的區別:static的可以用類來訪問(就是不用初始化乙個類就直接使用這個類的這個static方法);(2分)非static的只能通過物件來訪問(2分)。static的定義裡不能用到類內部非static變數值。(3分)static在迴圈中定義並賦值時,定義過程只進行一次,而不是每個迴圈1次。(3分)

堆:由malloc系列函式或new操作符分配的記憶體。其生命週期由free或delete決定。在沒有釋放之前一直存在,知道程式結束。其特點是使用靈活,空間比較大,但容易出錯。

棧:儲存區域性變數。棧上的內容只在函式的範圍內存在,當函式執行結束,這些內容也會自動被銷毀。其特點是效率高,但空間大小有限。

靜態區:儲存自動全域性變數和static變數(包括static全域性和區域性變數)。靜態區的內容在整個程式的生命週期內都存在,由編譯器在編譯的時候分配。

描述記憶體分配方式以及它們的區別?

答:1)從靜態區分配:內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static 變數。

2)在棧上建立:在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集。

3)從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new 申請任意多少的記憶體,程式設計師自己負責在何時用free 或delete 釋放記憶體。動態記憶體的生存期由程式設計師決定,使用非常靈活,但問題也最多。

更詳細的講解:

free釋放記憶體後需要做什麼?下一行**應該怎樣寫?

被free()掉的指標,我們通常叫野指標,野指標是非常危險的哦,可能導致多次釋放記憶體或者對野指標進行訪問,

這兩種情況都可能導致嚴重的安全風險。

最好的也是最簡單的解決辦法就是在釋放後,把指標設定為null或者指向另乙個合法的物件。

就像這樣:

free(ptr);

ptr = null;

鍊錶題:乙個鍊錶的結點結構。

struct node

;typedef struct node node;

(1)已知鍊錶的頭結點head,寫乙個函式把這個鍊錶逆序 ( intel)

node * reverselist(node *head) //鍊錶逆序

p2->next = p1 ;

head = p2 ;

return head;

}(2)已知兩個鍊錶head1 和head2 各自有序,請把它們合併成乙個鍊錶依然有序。(保留所有結點,即便大小相同)

node * merge(node *head1 , node *head2)

else

node *pcurrent= head ;

while ( p1!= null && p2!= null)

else

}if ( p1!= null )

pcurrent->next = p1 ;

if ( p2!= null )

pcurrent->next = p2 ;

return head;

}(3)已知兩個鍊錶head1 和head2 各自有序,請把它們合併成乙個鍊錶依然有序,這次要求用遞迴方法進行。 (autodesk)

答案:node * mergerecursive(node *head1 , node *head2)

else

return head;

}delete與delete 的區別

答: delete只會呼叫一次析構函式,而delete會呼叫每乙個成員的析構函式。在more effective  c++中有更為詳細的解釋:「當delete操作符用於陣列時,它為每個陣列元素呼叫析構函式,然後呼叫operator delete來釋放記憶體。」delete與new配套,delete 與new 配套。

下面哪種排序法對12354最快。

quick sort

buble sort(正確)

merge sort

當資料規模較小時,應選擇直接插入排序或氣泡排序。任何排序演算法在資料量小時基本體現不出來差距。我們說快排好,是指大量隨機資料下,快排效果最理想。而不是所有情況。

哪種結構,平均來講,獲取乙個值最快。

binary tree

hash table(正確)

stack

死鎖產生的原因及四個必要條件

產生死鎖的原因主要是:

(1) 因為系統資源不足。

(2) 程序執行推進的順序不合適。

(3) 資源分配不當等。

如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則

就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。

產生死鎖的四個必要條件

(1)互斥條件:乙個資源每次只能被乙個程序使用。

(2)請求與保持條件:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。

(3)不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。

(4)迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。

這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之

一不滿足,就不會發生死鎖。

C 的一些筆試面試題總結

1.實現string函式的建構函式,拷貝建構函式,析構函式,賦值運算子過載 include include using namespace std class string 通用建構函式 string string const char data else 拷貝建構函式 string string ...

一些面試題

q 您在什麼情況下會用到虛方法?它與介面有什麼不同?a 當在繼承類中想重寫某一方法時會用到虛方法 虛方法是類的成員函式,介面相當於抽象類.q override與過載有什麼區別?a override 就是覆蓋的意思,覆蓋父類的同名方法,而過載則是通過參數列來呼叫方法.q 值型別與引用型別有什麼區別?a...

一些面試題

1.如何檢視埠8080的程序 netstat anp grep 8080 lsof i 8080 2.在 tmp目錄下建立test.txt檔案,內容為 hello,world 用乙個命令寫出來。echo hello,world tmp test.txt 3.敘述下列服務的預設埠號。ftp 20,21...