面試無疑是對自己能力的一種檢測,通過面試過程中出現的問題,知道自己的不足,從而提高。下面將對一些面試題的總結
首先考驗萬用字元的使用
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...