程序员面试题精选100题(53)-C++/C#面试题(2)
寫在前面的話:本次選用的5道題,是我微博(http://weibo.com/zhedahht和http://t.163.com/zhedahht)中#面試每日一題#系列的第6題到第10題。有合適的題目,我會繼續收集C/C++/C#的面試題,并不定期發表到博客和大家分享。
??? 讀者請在回復中告知在沒有看答案之前能做對幾題(得出正確的答案并能給出合理的解釋),這樣我就能知道博客中選用題目的難度是否適中。
題目(六):運行下列C++代碼,輸出什么?
struct Point3D {int x;int y;int z; };int _tmain(int argc, _TCHAR* argv[]) {Point3D* pPoint = NULL;int offset = (int)(&(pPoint)->z);printf("%d", offset);return 0; }
答案:輸出8。由于在pPoint->z的前面加上了取地址符號,運行到此時的時候,會在pPoint的指針地址上加z在類型Point3D中的偏移量8。由于pPoint的地址是0,因此最終offset的值是8。
&(pPoint->z)的語意是求pPoint中變量z的地址(pPoint的地址0加z的偏移量8),并不需要訪問pPoint指向的內存。只要不訪問非法的內存,程序就不會出錯。
題目(七):運行下列C++代碼,輸出什么?
class A { public:A(){Print();}virtual void Print(){printf("A is constructed.\n");} };class B: public A { public:B(){Print();}virtual void Print(){printf("B is constructed.\n");} };int _tmain(int argc, _TCHAR* argv[]) {A* pA = new B();delete pA;return 0; }
答案:先后打印出兩行:A is constructed. B is constructed.?調用B的構造函數時,先會調用B的基類及A的構造函數。然后在A的構造函數里調用Print。由于此時實例的類型B的部分還沒有構造好,本質上它只是A的一個實例,他的虛函數表指針指向的是類型A的虛函數表。因此此時調用的Print是A::Print,而不是B::Print。接著調用類型B的構造函數,并調用Print。此時已經開始構造B,因此此時調用的Print是B::Print。
同樣是調用虛擬函數Print,我們發現在類型A的構造函數中,調用的是A::Print,在B的構造函數中,調用的是B::Print。因此虛函數在構造函數中,已經失去了虛函數的動態綁定特性。
題目(八):運行下列C#代碼,輸出是什么?
namespace ChangesOnString {class Program{static void Main(string[] args){String str = "hello";str.ToUpper();str.Insert(0, " WORLD");Console.WriteLine(str);}} }
答案:輸出是hello。由于在.NET中,String有一個非常特殊的性質:String的實例的狀態不能被改變。如果String的成員函數會修改實例的狀態,將會返回一個新的String實例。改動只會出現在返回值中,而不會修改原來的實例。所以本題中輸出仍然是原來的字符串值hello。
如果試圖改變String的內容,改變之后的值可以通過返回值拿到。用StringBuilder是更好的選擇,特別是要連續多次修改的時候。如果用String連續多次修改,每一次修改都會產生一個臨時對象,開銷太大。
題目(九):在C++和C#中,struct和class有什么不同?
答案:在C++中,如果沒有標明函數或者變量是的訪問權限級別,在struct中,是public的;而在class中,是private的。
????????????????在C#中,如果沒有標明函數或者變量的訪問權限級別,struct和class中都是private的。struct和class的區別是:struct定義值類型,其實例在棧上分配內存;class定義引用類型,其實例在堆上分配內存。
題目(十):運行下圖中的C#代碼,輸出是什么?
namespace StaticConstructor {class A{public A(string text){Console.WriteLine(text);}}class B{static A a1 = new A("a1");A a2 = new A("a2");static B(){a1 = new A("a3");}public B(){a2 = new A("a4");}}class Program{static void Main(string[] args){B b = new B();}} }
答案:打印出四行,分別是a1、a3、a2、a4。
在調用類型B的代碼之前先執行B的靜態構造函數。靜態函數先初始化類型的靜態變量,再執行靜態函數內的語句。因此先打印a1再打印a3。接下來執行B b = new B(),即調用B的普通構造函數。構造函數先初始化成員變量,在執行函數體內的語句,因此先后打印出a2、a4。
?
博主何海濤對本博客文章享有著作權。網絡轉載請注明出處http://zhedahht.blog.163.com/。整理出版物請和作者聯系。
總結
以上是生活随笔為你收集整理的程序员面试题精选100题(53)-C++/C#面试题(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员面试题精选100题(52)-C++
- 下一篇: 程序员面试题精选100题(54)-C++