1. 程式人生 > >嵌入式筆試面試題(1)---C++

嵌入式筆試面試題(1)---C++

C++的類的繼承與多型1、是不是一個父類寫了一個virtual 函式,如果子類覆蓋它的函式不加virtual ,也能實現多型? 能2、構造、拷貝構造和賦值運算子的概念3、struct C{C(){cout << "construct: C()" << endl;i = 0;}C(const C &c){cout << "construct: C(const C &c)" << endl;}C(int i){cout << "construct: C(int i)" << endl;this->i = i;}~C(){}C& operator = (const C &c){cout << "operator = (const C &c)" << endl;i = c.i;return *this;}int i;};void test(){C *c;c = new C(100);C c2 = *c;C c3;c3 = c2;}4、四行輸出的結果依次順序為:a. construct: C()b. construct: C(const C &c)c. construct: C(int i)d. operator = (const C &c)則輸出的正確順序為________A.c b a d;B. a c b dC. c a b dD. d b a c5、請選擇下列程式的輸出結果________class A{public:void PrintOne(){cout<<” A”};virtual void PrintSecond(){cout<<” A”};};class B: public A{public:virtual void PrintOne(){cout<<” B”};virtual void PrintSecond(){cout<<”B”};};void main(){A* a= new B;// B* b=new B;a.PrintOne(); a.PrintSecond();b.PrintOne(); b.PrintSecond();}A. A A  B BB. B B  B B C. B B  A BD. A B  B B 6、函式的各解構函式可以繼承嗎?派生類建構函式中各部分的執行次序是怎樣的?7、下列運算子函式中,肯定不屬於類Value的成員函式的是()A、Value operator/(Value)B、Value operator-(Value,Value)C、Value operator+(Value)D、Value operator*(Value)8、過載方法和重析構方法的區別9、static在C和c++中表示什麼?10、 c++的模板類有什麼用?C++的類的基礎語法(修飾符)1、C中已經有malloc/free ,為什麼在c++中還需要new/delete,並指出2、malloc/free  new/deletede 區別。3、什麼是“引用”?宣告和使用“引用”要注意哪些問題?4、巨集定義、行內函數、和普通函式的區別巨集和行內函數的區別:帶引數的巨集定義並不對引數進行運算,而是直接替換;行內函數先把引數表示式進行運算求值,然後把表示式的值傳遞給形式引數行內函數的引數型別和返回值型別在宣告中都有明確的指定;而帶引數巨集定義的引數沒有型別的概念巨集和普通函式的區別<1>巨集做的是簡單的字串替換; 函式的引數的傳遞,引數是有資料型別的,可以是各種各樣的型別.<2>巨集的引數替換是不經計算而直接處理的,而函式呼叫是將實參的值傳遞給形參,既然說是值,自然是計算得來的.<3> ,巨集佔用的是編譯的時間,而函式佔用的是執行時的時間.<4>巨集的引數是不佔記憶體空間的, 函式呼叫時的引數傳遞則是具體變數之間的資訊傳遞,形參作為函式的區域性變數,顯然是佔用記憶體的.<5>函式的呼叫是需要付出一定的時空開銷的,因為系統在呼叫函式時,要保留現場,然後轉入被呼叫函式去執行,呼叫完, 再返回主調函式,此時再恢復現場,這些操作,顯然在巨集中是沒有的.所謂"行內函數"就是將很簡單的函式"內嵌"到呼叫他的程式程式碼中,只樣做的目的是為了避免上面說到的第5點,目的旨在節約下原本函式呼叫時的時空開銷.但必須注意的是:作為行內函數,函式體必須十分簡單,不能含有迴圈、條件、選擇等複雜的結構,否則就不能做為內聯函數了。5、C ,C++中struct有什麼區別?5、使用純虛拷貝建構函式時可能會出現什麼異常6、傳常數、傳指標、傳引用是什麼7、static在C和c++中表示什麼?8、哪一個不是C++11中新增的語法()A、右鍵引用B、Lamdba表示式C、智慧指標D、Rang-base for9、靜態成員函式沒有(返回值/ this指標/指標引數/返回型別)?10、以下程式碼中的輸出語句能輸出嗎?struct  CLS{int m_i;CLS(int i):m_i(i){};CLS(){CLS(0);}};CLS obj;cout << obj.m_i <<endl;11、過載和重寫,以及隱藏的區別:Overload(過載):在C++程式中,可以將語義、功能相似的幾個函式用同一個名字表示,但引數或返回值不同(包括型別、順序不同),即函式過載。(1)相同的範圍(在同一個類中);(2)函式名字相同;(3)引數不同;(4)virtual 關鍵字可有可無。Override(覆蓋):是指派生類函式覆蓋基類函式,特徵是:(1)不同的範圍(分別位於派生類與基類);(2)函式名字相同;(3)引數相同;(4)基類函式必須有virtual 關鍵字。注:重寫基類虛擬函式的時候,會自動轉換這個函式為virtual函式,不管有沒有加virtual,因此重寫的時候不加virtual也是可以的,不過為了易讀性,還是加上比較好。Overwrite(重寫):隱藏,是指派生類的函式遮蔽了與其同名的基類函式,規則如下:(1)如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)。(2)如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)。