金山公司--面試經驗分享(2)?

1.new delete malloc free

delete會呼叫物件的解構函式,和new對應free只會釋放記憶體,

new呼叫建構函式。

malloc與free是C++/C語言的標準庫函式,new/delete是C++的運算子。它們都可用於申請動態記憶體和釋放記憶體。

對於非內部資料型別的物件而言,光用maloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行解構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制權限之內,不能夠把執行建構函式和解構函式的任務強加於malloc/free。因此C++語言需要一個能完成動態記憶體分配和初始化工作的運算子new,以及一個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。

2.delete與 delete []區別:

delete只會呼叫一次解構函式,而delete[]會呼叫每一個成員的解構函式。

在MoreEffectiveC++中有更為詳細的解釋:

“當delete操作符用於陣列時,它為每個陣列元素呼叫解構函式,然後呼叫operator delete來釋放記憶體。”

delete與New配套,delete []與new []配套

MemTest *mTest1 = new MemTest[10];

MemTest *mTest2 = new MemTest;

int *pInt1 = new int[10];

int *pInt2 = new int;

delete []pInt1; //-1-

delete []pInt2; //-2-

delete []mTest1; //-3-

delete []mTest2; //-4-

在-4-處報錯。

這就說明:對於內建簡單資料型別,delete和delete[]功能是相同的。對於自定義的複雜資料型別,delete和delete[]不能互用。

delete[] 刪除一個數組,delete刪除一個指標

簡單來說,用new 分配的記憶體用delete刪除

用new[]分配的記憶體用delete[]刪除

delete []會呼叫陣列元素的解構函式。 內部資料型別沒有解構函式,所以問題不大。

如果你在用delete時沒用括號,delete就會認為指向的是單個物件,否則,它就會認為指向的是一個數組

3.C C++ JAVA共同點,不同之處

4.繼承優缺點。

類繼承是在編譯時刻靜態定義的,且可直接使用,類繼承可以較方便地改變父類的實現。但是類繼承也有一些不足之處。首先,因為繼承在編譯時刻就定義了,所以無法在執行時刻改變從父類繼承的實現。更糟的是,父類通常至少定義了子類的部分行為,父類的任何改變都可能影響子類的行為。如果繼承下來的實現不適合解決新的問題,則父類必須重寫或被其他更適合的類替換。這種依賴關係限制了靈活性並最終限制了複用性。

(待補充)

5.C++有哪些性質(面向物件特點)

6.子類析構時要呼叫父類的解構函式嗎?

解構函式呼叫的次序是先派生類的析構後基類的析構,也就是說在基類的的析構呼叫的時候,派生類的資訊已經全部銷燬了

定義一個物件時先呼叫基類的建構函式、然後呼叫派生類的建構函式;

析構的時候恰好相反:先呼叫派生類的解構函式、然後呼叫基類的解構函式

JAVA無解構函式

深拷貝和淺拷貝

7.多型,虛擬函式,純虛擬函式

4面筆試題

1閱讀理解:某函式的使用方法;物件的使用過程,物件宣告,建立例項用NEW;找語意上下文不符的一句

2KMP演算法填空

3程式改錯:引數順序,if(值),---

4圖行矩陣:乘以一個矩陣後圖形X軸、Y軸、Z軸對稱,放大或平移

5設計:程式碼行統計,字數統計的過濾條件

應聘java:OSI七層協議,排序演算法,資料結構,二叉樹,連結串列,演算法效率和優劣

JAVA類的是Java基礎和kjava的合卷,我只做了前面的

一共是7個題目,4個選擇題,一個問答題,一個讀程題,一個程式設計題

第一個題目是考String的用法:

選出用法錯誤的:

a: Stirng a ="Gone With Wind";

String t= "Wind";

String m;

m=a-t;

B: Stirng a ="Gone With Wind";

String m ;

m=a[3]+"one";

C: Stirng a ="Gone With Wind";

Sting m;

m=a.toUpperCase();

D: 不記得了

第2題考的是變數賦值用法:

選出能正確賦值的:

public class A {

private int a;

public void change(int m) {

return m;

}

}

public class B extend A{

public int b;

public static void main() {

A aa = new A();

B bb = new B();

int k;

//px

}

}

在px處可以正確賦值的有:

A k= m; B k=b; C k=aa.a; D k=bb.change(30); E k=bb.a

第3題是考位運算的

第4題考的是垃圾回收的

具體的選項不記得了

5.問答題: 實現執行緒有兩種用法,分別為: ____________和____________

他們之間有什麼區別

6.讀程題:

class testA {

public testA(){

a1();

}

public void a1() {

System.out.println("A-a1");

}

}

public class testB extends testA{

int bb=0;

public testB() {

bb=1000;

}

public void a1() {

System.out.println("bb is"+bb);

System.out.println("B-a1");

}

public static void main(String[] args) {

new testB();

}

}

c:>java testB 的結果是:

7.程式設計題

一個short型陣列, 另有一個byte型陣列,儲存了若干short型的數,存放時short型數的低

位在前, 那麼寫一段程式,將byte陣列轉換為short陣列

(原題的標準表述不記得了,大致就是這個意思,我覺得這個有點意思,我覺得轉換時應該

考慮當byte為負數的時候)

public short[] ConvertToShort(byte[] inputData) {

//補全程式碼

}

JAVA手機的題目沒有作,

相關問題答案