C 面試題大華 網順總結

2021-08-21 03:27:11 字數 3510 閱讀 4851

面試無疑是對自己能力的一種檢測,通過面試過程中出現的問題,知道自己的不足,從而提高。下面將對一些面試題的總結

首先考驗萬用字元的使用

int _tmain(int argc, _tchar* argv)

上面會列印出什麼?

首先看看萬用字元的的意義

%d              十進位制有符號整數 

%u 十進位制無符號整數

%f 浮點數

%s 字串

%c 單個字元

%p 指標的值

%e 指數形式的浮點數

%x, %x 無符號以十六進製制表示的整數

%0 無符號以八進位制表示的整數

%g 自動選擇合適的表示法

%3d 表示輸出3位整型數, 不夠3位右對齊。所以是空格22 333第二段程式

class a

{};class b :virtual

public a{};

printf("a.sizeof[%d]b.sizeof[%d]",sizeof(a),sizeof(b));

a是空類,其大小為1;b不是空類,其大小為4.因為含有指向虛基類的指標。列印的結果是a.sizeof[1]b.sizeof[4]其中有考察到乙個空類的大小不是0,和虛函式表所占用的空間大小。

所謂類的例項化就是在記憶體中分配一塊位址.(空類同樣可以被例項化),每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會給乙個空類隱含的加乙個位元組,這樣空類在例項化後在記憶體得到了獨一無二的位址.因為如果空類不隱含加乙個位元組的話,則空類無所謂例項化了(因為類的例項化就是在記憶體中分配一塊位址)。

知識點inux下檢視物件檔案依賴的動態庫的工具ldd,ldd可以列出乙個物件檔案所依賴的所有的動態庫。ldd不是可執行檔案,而是乙個shell指令碼。

運算子過載相關,題目如下

具體考察的就是運算子過載,建構函式,拷貝建構函式,的執行順序,

//題目:如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。

class cmystring

;

建構函式

cmystring()      // 建構函式,p指向堆中分配的一空間  

拷貝建構函式

cmystring(const a& r)

析構函式

~cmystring()     // 析構函式,釋放動態分配的空間  

}

運算子過載

cmystring & cmystring :: operator =(const cmystring & str)

return *this;

}

測試程式

int _tmain(int argc, _tchar* argv)

首先如果我們不寫建構函式,拷貝建構函式,析構函式,系統都會為我們建立乙個預設的。

而且析構函式只有乙個,不能夠過載。

關於拷貝建構函式的知識

參考 c++建構函式/析構函式/拷貝建構函式/深拷貝淺拷貝解析

-淺拷貝:所謂淺拷貝,指的是在物件複製時,只是對物件中的資料成員進行簡單的賦值,上面的例子都是屬於淺拷貝的情況,預設拷貝建構函式執行的也是淺拷貝。大多情況下「淺拷貝」已經能很好地工作了,但是一旦物件存在了動態成員,那麼淺拷貝就會出問題了。

-深拷貝在「深拷貝」的情況下,對於物件中動態成員,就不能僅僅簡單地賦值了,而應該重新動態分配空間。

-總結

拷貝建構函式中分為深拷貝和淺拷貝,一般情況下淺拷貝已經滿足需求,但是當存在動態成員時,淺拷貝就不能滿足需求了。比如乙個物件中有指標成員,只是通過簡單的淺拷貝,只能夠讓複製的物件指向同一片區域,而不是建立一片同樣大小的區域。這就需要通過深拷貝來解決。

淺拷貝測試

此處我們去掉拷貝建構函式

cmystring aa;

cmystring dd;

dd = aa; //dd物件已經例項化了,不需要構造,此時只是將a賦值給bbb,只會呼叫賦值函式運算子過載

cmystring bb = aa; // 拷貝構造複製物件

cmystring cc(aa); // 拷貝構造複製物件

從監視處可以看到,aa ,bb,cc,dd,的位址都是相同的。

dd = aa此處進行的是淺拷貝,只是對指標的拷貝,對內容沒有拷貝。他們指向的都是同一塊記憶體位址。位址都是0x00ae12c0

下面我們新增上拷貝建構函式

m_pdata = new

char(100); // 為新物件重新動態分配空間

memcpy(m_pdata, r.m_pdata, strlen(r.m_pdata));

printf("copy建構函式\n");

析構執行效果

析構的順序是cc,bb,dd,aa

拷貝建構函式何時會被呼叫?

我們假如拷貝構造函式引數不是引用型別的話,執行過程如下

總結

拷貝建構函式的引數使用引用型別不是為了減少一次記憶體拷貝, 而是避免拷貝建構函式無限制的遞迴下去。

參考 拷貝建構函式的引數為什麼必須使用引用型別

立方網面試題總結

4月27日下午去參加了某公司的系統運維工程師的面試。總結一下筆試題幾個做的不好的地方。1 如何限制普通使用者修改密碼?密碼限制的做法可以這樣實現 pwd home test 當前是普通使用者。su password 輸入高階管理員密碼 進入高階使用者狀態。chmod 711 usr bin pass...

c 面試題總結

using system class a public virtual void printfields class b a public override void printfields y x,y 當使用new b 建立b的例項時,產生什麼輸出?答 x 1,y 0 答案詳解 因為構造b之前,先...

C 面試題總結

為什麼c 的member function template不能是虛的?問題的意思是 為什麼在c 裡面,乙個類的成員函式不能既是template優勢virtual,比如,下面的 是不合法的 class animal 原因如下 1.從uuix c開始,乙個c c 程式就可以被分開編譯,然後用乙個lin...