1. 程式人生 > >設計模式C++學習筆記之十一(c/c++面試筆試題)

設計模式C++學習筆記之十一(c/c++面試筆試題)

一、指標與引用有什麼區別?

1、指標會佔用記憶體,引用不佔用記憶體。

2、引用在定義時必須初始化。

3、沒有空的引用,但是有空的指標。

二、static關鍵的幾個作用

1、函式體內的static變數的作用範圍為該函式體,該變數記憶體只分配一次,因此其值在下次再呼叫該函式時仍維持上次的值。

2、在模組內的static全域性變數可以被模組內的其他函式訪問,但不能被模組外的函式訪問。

3、在模組內的static函式只能被模組內的其他函式呼叫,但不能在模組外呼叫該函式。

4、在類中的static成員變數屬於整個類擁有,對類的所有物件只有一份拷貝。

5、在類中的staitc成員函式屬於整個類擁有,這個函式不能接收this指標,因而只能訪問類的static成員變數。

三、const關鍵的幾個作用

1、可用於定義常量,用於阻止定義的變數被改變,定義時通常要進行初始化,在類中通常在建構函式中初始化。

2、const定義的指標可以指定指標本身為const不可變的,也可以指定指標所指向的資料為const不可變,還可以同時指定二者都為const不可變。

      const char *p = "Hello world!"; //指標指向的資料為常量

      char* const p = "Hello world!"; //指標本身為常量

      const char * const p = "Hello world!"; //指標本身與其所指資料都為常量

3、在一個函式的宣告中,const可修飾形參,表明是一個輸入引數,在函式內部不能改變其值。

4、對於類的成員函式,若指定為const型別,則表明該成員函式為常函式,不能修改類的資料成員。

5、對於類的成員函式,有時必須指定其返回值為const型別,以使得其返回值不為“左值”。

四、陣列與連結串列的區別

1、陣列在記憶體中是連續的,連結串列在記憶體中是不連續的,靠指標連線。

2、陣列佔用的總記憶體相對連結串列要小,因為連結串列除了要儲存資料外,還要儲存用於連線的指標。

3、陣列方便排序和查詢,但不方便刪除和插入;而連結串列則方便刪除和插入,不方便排序和查詢。

五、指標陣列與陣列指標

int *a[10];  //10個int型指標陣列

int (*a)[10];  //10個int型陣列的指標

int (*a)(int);  //帶一個int型引數,返回值為int型的函式指標

int (*a[10])(int);  //10個函式指標陣列,函式帶一個int型引數,返回值為int型

六、一下為windows NT下的32位C++程式,請計算sizeof的值

void Func(char str[100])

{

sizeof(str) = ?;    //由於str是形參,原本是陣列被降級為指標,因此此處結果為4個位元組

}

void *p = malloc(100);

sizeof(p) = ?;    //此處p為指標,因此結果為4個位元組

int a[100];

sizeof(a) = ?;    //此處a為一個100的整型陣列,因此結果為100*4,400個位元組

char *p = "aaaaaaaa";

sizeof(p) = ?;   //此處p仍然為一個指標,因此結果為4個位元組

七、STL常用類

1、向量<vector>

2、列表<list>

3、集合<set>

4、棧<stack>

5、佇列<queue>

6、對映<map>

八、C++中常用的設計模式

1、Factory Method   工廠模式

2、Strategy   策略模式

3、Singleton   單例模式

4、Iterator  迭代器模式

5、Bridge   橋接模式

6、Composite 組合模式

7、Observer  觀察者模式

8、Proxy    代理模式

9、Adepter   介面卡模式

10、Abetract Factory  抽象工廠模式

九、類與物件的區別

類與物件的卻別如人類與張三的區別,他們是一般與個別、抽象與具體、集體與個體的區別。

十、 面向物件的三大特徵:封裝、繼承、多型

1、封裝

把客觀事物封裝成抽象的類,且類可以把自己的資料和方法只讓可信的類或物件操作,對不可信的進行資訊隱藏的技術稱為封裝。

在C++中類成員的屬性有:public, protected, private,訪問許可權依次降低。

2、繼承

可以使用現有類的所有功能,並在無需重新編寫原來類的情況下對這些功能進行擴充套件的技術被稱為繼承。

繼承出來的新類被成為“子類”、“派生類”;被繼承的成為“父類”、“基類”或“超類”。

3、多型

允許將父物件設定成為和一個或多個子物件相等的技術稱為多型。

實現多型的方法:覆蓋、過載

覆蓋:指子類重新定義父類的virtual虛擬函式的做法。

過載:指允許存在多個同名函式,而這些函式的引數表不同。

十一、成員函式與友元函式的區別

1、成員函式是類定義的一部分,通過特定的物件來呼叫。成員函式可以隱式訪問呼叫物件的成員,而不須使用成員操作符。

2、友元函式不是類的組成部分,因此被成為直接函式呼叫。友元函式不能隱式訪問類成員,而必須將成員操作符用於作用引數傳遞的物件。

十二、分別給出BOOL,int,float,指標變數與“零值”比較的if語句

1、bool型變數:if(!var){}

2、int型變數:if(var == 0){}

3、float型變數:

const float EPSINON = 0.000001;

if(( x >= -EPSINON ) &&( x <= EPSINON )){}

4、指標變數:if( var == NULL ){}

十三、記憶體問題

1、記憶體分配方式有三種:

a、從靜態儲存區中分配記憶體。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數等。

b、在棧上建立。在執行函式時,函式內區域性變數的儲存但願都可以在棧上建立,函式執行結束時,這些儲存單元自動釋放。

c、從堆上分配,亦稱動態記憶體分配。程式在執行時用malloc或new申請任意多少記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。

2、記憶體分為5大區域:

a、程式碼段——原始碼程式編譯產生的二進位制資料

b、BSS區(全域性區,靜態區)——未初始化的全域性變數和靜態變數

c、資料段(常量區)——已經初始化的全域性變數和靜態變數

d、棧區——存放全域性變數,臨時變數

e、堆區——程式執行過程中,動態分配的記憶體