~~
下面這些是基礎題,“高手”們飄過!!!我想一般公司對語言方面,總會變著方法考下面的這些問題。這只是出現的一種形式。有啥好題歡迎大家分享,下面這些是我自己YY的。看題的兄弟只需在自己心里作答就行,一定不要忘了幾乎每題都有一個“ 為什么”。
posted on 2010-05-11 08:52 麒麟子 閱讀(3789) 評論(31) 編輯 收藏 引用 所屬分類: Programming
第一題編譯錯誤。g++ 4.4.1test.cpp: In function ‘int main()’:test.cpp:17: error: cannot convert ‘B*’ to ‘A*’ in initialization 回復 更多評論
@anonymous 哦,不好意思,忘了加繼承關系。現已修正,謝謝! 回復 更多評論
1、請問上面輸出什么,為什么! 為啥只打出 ~A 呢。。。 回復 更多評論
@楚天清秋 明白三點就知道了。 1、虛函數 2、析構函數的調用規則和時機 3、析構函數和普通成員函數也一樣,只是樣子很特別。 回復 更多評論
@楚天清秋因為A沒有定義虛析構函數 回復 更多評論
1 void* p = NULL; p++;2 char* q = NULL; q++;3 int* r = NULL; r++;7、上面的語句是否合法,如果合法,p ,q,r的值分別是多少。為什么!1 不合法,因為void類型沒有size2 q=13 r=4 回復 更多評論
3、isFailed 的值,為什么!isFailed=true,函數參數是傳值的 回復 更多評論
@北海鯤鵬 嗯,突然發現變量命名有點問題,我想你說的是對的。 回復 更多評論
@小時候可靚了 照理說析構時時先 執行自己的析構函數,然后執行父類的析構函數,如果有多繼承,按照父類的聲明順序來執行析構函數。 A* p = new B; delete p; 所以應該是 A和B的析構都執行吧? 回復 更多評論
A* p = new B; delete p; ~~~~~~~~ delete p; A的指針,但實例是B的, 到底是先執行A的析構函數,還是B的析構函數。 如果是先執行A的析構函數,A的析構函數由于不是Virtual的,所以不會執行B的析構函數,這就說得通! 回復 更多評論
@楚天清秋寫段代碼跑一下就知道了,可以找一下關于C++類型綁定的文章 回復 更多評論
class A { public: A(){cout<<"~A"<<endl;} }; class B:public A { public: B(){cout<<"~B"<<endl;} }; main() { A* p = new B; delete p; return 0; } --------------------------------- 如果上例改成構造函數的話,應該是打印 "~A" "~B" 回復 更多評論
@楚天清秋寫段代碼跑一下就知道了,可以找一下關于 C++類型綁定的文章 回復 更多評論
@北海鯤鵬 謝謝,代碼寫了也調試過,就是不明白 A* p = new B; delete p; 為什么 先執行A的析構函數,然后B的析構就不執行了。 ------------ 如果改成 B* p = new B; delete p; 結果很顯然,會打印 "~B" "~A" 回復 更多評論
第四如何做,這個不會。 回復 更多評論
析構執行是先自己再父類 但由我們是 A* p = new B; delete p; 此是delete p;實現時是 if( p != NULL) p->destructor(); 可以發現,這次調用的是A的析構。 而當我們把A的析構聲明成虛函數時。。。 由虛函數調用可知,就會調用到B的析構,在B的析構中就會調用A的析構。 析構函數除了名字特殊外,和普通函數具有同樣的特性。。。 那位把析構改成構造函數來實現兩個都輸出的,我只想說,你沒有明白這題的本意!!! 回復 更多評論
第1題,只輸出~A,因為不是虛析構函數。第2題,1,4,4,8第3題,北海鯤鵬的回答是對的。把指針傳進去,也是按傳值的。要實現題中的目標,應該用指針的指針。第5題,a=(a-abs(a))/2;第6題,不知道。第7題,北海鯤鵬的回答是對的。第8題,調用void f(int* p)成功。void f(int p[])失敗。因為p[]是數組,不可能是NULL。第9題,怎么實現都行。第10題,把float在內存中的表示強制轉換為int類型。 回復 更多評論
各位可以不用回復在此,因為我預計這每道題回答的字數還是有百來字的。 而回答在這里肯定打不了那么多。 所以,自已知道就行了。。。 但是,你只需問你自己。。 真的知道嗎? 知道到了哪種程度。。。 希望大家越來越有興趣去探究底細,發現那些總以為會很神秘的“幕后”。 回復 更多評論
第二題有問題,結果依賴編譯器。 回復 更多評論
@壞 我又沒有要你答案,你只要能知道你自已常用的那個編譯器是啥值就行了。。。 回復 更多評論
@楚天清秋 所謂的靜態綁定。調用函數的地址在可執行文件中直接寫定(這里是A的析構函數)。無需訪問虛表。 回復 更多評論
@~ 如果你有機會看到這留言,你可以說得更明白些么? 回復 更多評論
float f =1.1; int a = *(int*)&f; cout<<a<<endl; 調試了一下,并不是輸出1,輸出1066192077,不懂 回復 更多評論
@小熙 浮點和整形在內存存儲上是不一樣的,這個相當于將float指針之后的sizeof(float)的數據按整形的存儲方式去讀取,結果當然不會是1 回復 更多評論
- -一不小心我全做對了。。我的求職經驗證明。。 如果全是這樣的題目的公司,或者搬抄林銳的書的公司都是垃圾公司 回復 更多評論
@12 干,不可能說全是這種題,只可能會是其中的一道或兩道。。可以看得出來,你是我所說的“高手”。 其實不僅是要看你會不會,還要看你對待事情的態度。。 回復 更多評論
7. void test(bool bf) { typedef void (*PFUNC)(void); PFUNC fu1 = f1; PFUNC fu2 = f2; int a1 = (int)(fu1); int a2 = (int)(fu2); int a3 = a1 * bf + a2 * !bf; PFUNC F = (PFUNC)a3; F(); } : ) 回復 更多評論
7. 其實后2個結果是未定義的 8. 都是對的,函數參數中的數組已經退化為指針 回復 更多評論
@啊 嗯,我也不能說你對與錯,只要你在你熟知的編譯環境里能驗證你的答案就行。 回復 更多評論
3、isFailed 的值永遠為false,即使將void _MyNew(int* p)改為void _MyNew(int* &p),因為new失敗不返回NULL,而是拋異常bad_alloc。 回復 更多評論
void test(bool bf) { void(*ptr[2])() = {f2,f1}; ptr[bf](); } 回復 更多評論
Powered by: C++博客 Copyright © 麒麟子