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