C C C 面試題精選(2)

2021-05-24 12:12:47 字數 2456 閱讀 2150

題目(六):執行下列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。

C C C 面試題精選(2)

題目 六 執行下列 c 輸出什麼?struct point3d int tmain int argc,tchar argv 答案 輸出 8。由於在 ppoint z 的前面加上了取位址符號,執行到此時的時候,會在 ppoint 的指標位址上加 z在型別 point3d 中的偏移量 8。由於 ppoi...

C C C 面試題精選(2)

題目 六 執行下列 c 輸出什麼?struct point3d int tmain int argc,tchar argv 答案 輸出 8。由於在 ppoint z 的前面加上了取位址符號,執行到此時的時候,會在 ppoint 的指標位址上加 z在型別 point3d 中的偏移量 8。由於 ppoi...

C C C 面試題精選(2)

題目 六 執行下列 c 輸出什麼?struct point3d int tmain int argc,tchar argv 答案 輸出 8。由於在 ppoint z 的前面加上了取位址符號,執行到此時的時候,會在 ppoint 的指標位址上加 z在型別 point3d 中的偏移量 8。由於 ppoi...