<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] 1. 判斷一段程序是什么編譯器編譯 如果編譯器在編譯cpp文件,那么`_cplusplus`就會被定義,如果是一個C文件被編譯,那么`_STDC_`就會被定義,`_STDC_`是預定義宏,當它被定義后,編譯器將按照ANSIC標準來編譯C語言程序。 2. C++函數中值的傳遞方式 * 按值傳遞(pass by value) * 地址傳遞(pass by pointer) * 引用傳遞(pass by reference) 按值傳遞方式容易理解,但形參值的改變不能對實參產生影響。 ` ` 地址傳遞方式雖然可以使得形參的改變對相應的實參有效,但如果在函數中反復利用指針進行間接訪問,會使程序容易產生錯誤且難以閱讀。 ` ` 如果以引用為參數,則既可以使得對形參的任何操作都能改變相應的數據,又使得函數調用顯得方便、自然。引用傳遞方式是在函數定義時在形參前面加上引用運算符“&”。 3. C++中虛函數問題 4. C++和C有什么不同 語法 特性 場景 效率 C:面向過程,效率高,嵌入式。如linux核心大部分是C寫的 C++:面向對象。更上層,更復雜。增加里模版泛型。 5. C和C++中struct有什么區別 | | Protection行為 | 能否定義函數 | | --- | --- | --- | --- | | C | 無 | 否,但可以有函數指針 | | C ++ | 有,默認是public | 可以 | 6. C++中struct和class有什么區別 區別在于權限問題上。 class和struct 做類型定義時只有兩點區別: 1)默認繼承權限。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理 2)成員的默認訪問權限。class的成員默認是private,struct默認是public權限。 7. int id[sizeof(unsigned long];這個對嗎?為什么? 正確 這個sizeof是編譯時運算符,編譯時就確定里可以看成和機器有關的變量。sizeof(unsigned long]) 確定的常量。 8. new in c++ is a: **key word** and **operator** 9. 變量的指針含意是指變量的**地址** 10. 多態的作用 - 1.隱藏實現細節,是的代碼能夠模塊化;擴展代碼模塊,實現代碼重用 - 2.接口重用:為了類在繼承和派生的時候,保證使用家族中任一類的實例的某一屬性時的正確調用。 11. 多態類中的虛函數表是Complie-Time,還是Run-Time時建立的? 虛函數表是在編譯時期就建立類,各個虛擬函數這時被組織成類一個虛擬函數的入口地址的數組,而對象的隱藏成員--虛擬函數表指針是在運行期--也就是構造函數被調用時進行初始化的,這是實現多態的關鍵。 12. 面向對象的三個基本特征,并簡單敘述之 封裝:將客觀事物抽象成類,每個類對自身的數據和方法是想protection(private,protected,public) 繼承:廣義的繼承有三種實現形式:實現繼承、可視繼承、接口繼承。前兩種和后一種構成類功能復用的兩種方式。 多態:是將父類對象設置成為和一個或更多的與他的自對象相等的技術,賦值之后,父對象就可以根據當前賦值給它的子對象的特征以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。 是什么? 怎么用? 為什么使用它? 13. 內聯函數在編譯時是否做參數類型檢查 內聯函數要做參數檢查,這his內聯函數跟宏相比的優勢。 14. 內存的分配方式有幾種 1) 靜態存儲區域。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量。 2)在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,到那時分配的內存容量有限。 3)從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由我們決定,使用非常靈活,但問題也最多。 15. 對于一個頻繁使用但短小函數,在C語言中應用什么實現,在C++中應用什么實現》 C用宏定義,C++用inline 16. 全局變量和局部變量有什么區別?是怎么實現的?操作系統和編譯器是怎么知道的? 生命周期:全局變量隨主程序創建而創建,隨主程序銷毀而銷毀;局部變量在局部函數內部,甚至局部循環體等內部存在,退出就不存在; 使用方式不同:通過聲明后全局變量程序的各個部分都可以用到,放在靜態數據區;局部變量只能在局部使用;分配在棧區。 操作系統和編譯器通過內存分配的位置來知道的,全局變量分配在全局數據段并且在程序開始運行的時候被加載。局部變量則分配在堆棧里。 17. 如果在申請動態內存時找不到足夠大的內存快,malloc和new將返回NULL指針,宣告內存申請失敗。你是怎么處理內存耗盡的? 如果返回nULL則什么都不做 18. 用C++寫一個程序,如何判斷一個操作系統是16位還是32位的? 標準答案:定義一個指針p。打印出sizeof(p),如果打印結果是4,則表示該操作系統是32位,打印結果是2,表示是16位。計算指針變量 19. 不用sizeof() 判斷操作系統是16位還是32位。 ``` unsign int a = ~0; if (a > 65536) { cout << "32 bit" << endl; } else { cout << "16 bit" << endl; } // 在64位操作系統中該方法不適合。需要用sizeof(指針)來計算 ``` 20. 為什么需要使用堆,使用堆空間的原因? 直到運行時才知道一個對象需要多少內存空間;不知道對象的生存周期到底有多長。 21. 若數組名作為實參而指針變量作形參,函數調用實參給形參的是() 數組第一個元素的地址 22. 有來malloc/free,為什么還要用new-delete malloc/free是C++/C語言的標準庫函數,new/delete是C++的運算符。他們都可以用于申請動態內存和釋放內存。對于非內部數據類型的對象而言,光用malloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由于malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能把執行構造函數和析構函數的任務強加于malloc/free. 因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符delete。注意new/delete不是庫函數。 23.為什么數組名作為參數,會改變數組的內容,而其他類型如int卻不會改變變量的值? 數組傳遞的是首元素的地址。 24。請講一講析構函數和虛函數的用法和作用 析構函數是特殊的類成員函數,它沒有返回類型,沒有參數,不能顯示調用,也沒有重載,只有在類對象的生命周期結束的時候,由系統自動調用。有釋放內存空間的作用。 可以是虛析構函數。 虛函數是C++多態的一種表現,使用虛函數,我們可以靈活的進行動態綁定,當然是以一定的開銷為代價。 25. 錯誤的轉義字符('091') '\091' '\\' '\0' '\' 26. 如果ClassA中定義并實現虛函數int func(void), ClassB中也實現該函數,那么上述變量a->func()將調用哪個類里面的函數? 如果int func(void)不是虛函數,情況又如何?為什么? 第一問調用的是B的。第二問調用A的。虛函數的第一個典型應用。**虛函數只能借助于指針或者引用來達到多態的效果**。 27. 引用與指針有什么區別? 參考答案: 1)引用必須被初始化,指針不必 2)(引用初始化后不能被改變),指針可以改變所指的對象。 3)不存在只想空值的引用,但是存在指向空值的指針。 28. 你覺得如果不使用常量,直接在程序中填寫數字或字符串,將會有什么麻煩? 1)程序的可讀性變差。程序員自己會忘記那些數字或字符串是什么意思,用戶則更加不知他們從何而來、表示什么。 2)在程序的很多地方輸入同樣的數字或字符串,難保不發生書寫錯誤。 3)如果要修改數字或字符串,則會在很多地方改動,既麻煩又容易出錯。 29. 在C++中有沒有純虛構造函數? 構造函數不能是虛的,只有虛的析構函數。構造函數需要指定數據類型。 30. 重復多次fclose 一個打開過一次的FILE*fp指針會有什么結果,并請解釋。 考察點:導致文件描述符結構中指針指向的內存被重復釋放,進而導致一些不可預期的異常。 31.重載和重寫、重定義(覆蓋)的區別 重載:在同一個類中。是允許存在多個同名函數,而這些函數的參數表不同。 重寫:在繼承鏈中,派生類與基類函數同名,屏蔽基類的函數(虛函數) 覆蓋:不同名字空間,用于繼承,子類重新定義復類虛函數的方法 32. C++是不是類型安全的? 不是。兩個不同類型的指針之間可以強制轉換(用reinterpret cast). 33. C++里是不是所有的動作都是main()引起的?如果不是,請距離 比如全局變量的初始化,就不是由main函數引起的。 34. main函數執行之前,還會執行什么代碼》 全局對象的構造函數會在main函數之前執行 35. C++中virtual與inline的含義分別是什么? 在基類成員函數的聲明加上virtual關鍵字,意味著將該成員函數聲明為虛函數。inline與函數的定義體放在一起,使該函數稱為內聯。inline是一種用于實現的關鍵字,而不是用于聲明的關鍵字。 虛函數的特點;用于多態、純虛函數(抽象類)。如果希望派生類能夠重新定義基類的方法,則在基類中將該方法定義為虛方法,這樣可以啟動動態聯編。 內聯函數的特點;使用內聯函數的目的是為里提高函數的運行效率。內聯函數體的代碼不能過長,因為內聯函數省去調用函數的時間是以代碼膨脹為代價的。內聯函數不能包含循環語句,因為執行循環語句要比調用函數的開銷大。 36. const關鍵字?有哪些作用 1)欲阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它里; 2)對指針來說,可以指定指針本身為const,也可以指定指針所指對數據為const,或二者同時指定為const; 3)在一個函數聲明中,const可以修飾形參,表明他是一個輸入參數,在函數內部不能改變其值; 4)對于類成員函數,若指定其為const類型,則表明其是一個常函數,不能修改類對成員變量; 5)對于類對成員函數,有時候必須指定其返回值為const類型,以使得其返回值不為“左值“。 37. VC中,編譯工具條內對Debug與Release選項是什么含義? Debug:會額外新增一些可調式的符號。 Release:把運行不相關的信息剔除掉。發布版本 38. 是不是一個父類寫類一個virtual函數,如果子類覆蓋它的函數不加virtual,也能實現多態? virtual修飾符會被隱形繼承。virtual可加可不加。子類的空間里有父類的所有變量(static除外)。同一個函數只存在一個實體(inline除外)。子類覆蓋它的函數不加virtual,也能實現多態。在子類的空間里,有父類的私有變量。私有變量不能直接訪問。 39. 一個棧的入棧序列是A,B,C,D,E,則棧的不可能的輸出順序是(DCEAB)。 棧:后進先出 40. 在不用第三方參數的情況下,交換兩個參數的值。 ``` 一: a = a+b; b = a - b; a = a - b; 二: 異或: ``` 41.打印當前源文件的文件名以及源文件的當前行號? ``` //使用預定義的兩個宏 cout << __FILE__; cout << __LINE__; ``` 42. 當一個類A中沒有聲明任何成員變量與成員函數,這時sizeof(A)的值為1 43. 下面的函數實現在一個固定的數上加上一個數,有什么錯誤。 ``` int add_n(int n) { static int i = 100; i += n; return i; } 解:因為static使得i的值會保留上次的值。以后的i會一直更新,使得第二次調用出現錯誤。去掉static就可以了。 ``` 44. 在排序方法中,關鍵碼比較次數與記錄地初始排列無關的是(D) ``` A.Shell排序 B.歸并排序 C.直接插入排序 D.選擇排序 ``` 45. 函數模版與類模版有什么區別? 函數模版的實例化是由編譯程序在處理函數調用時自動完成的,而類模版的實例化必須由程序員在程序中顯示的指定。 46、函數重載,我們靠什么來區分調用的那個函數?靠返回值判斷可以不可以? ``` 不可以。 void Function(void); int Function(void); 上述兩個函數,第一個沒有返回值,第二個的返回值是int類型。如果這樣調用函數:int x = Function(); 則可以判斷除Function是第二個函數。問題是在C++/C程序中,我們可以忽略函數的返回值。在這種情況下,編譯器和程序員都不知道哪個Function函數被調用。所以只能靠參數而不能靠返回值類型的不同來區分重載函數。 ``` 47.不能被重載的運算符 1) 不能改變C++內部數據類型(如int,float等)運算符。 2)不能重載‘.‘,因為 在類中對任何成員都有意義,已經成為標準用法。 3)不能重載目前C++運算符集合中沒有的符號,如#,@,$等。原因有兩點,一是難以理解,二是難以確定優先級。 4)對已經存在的運算符進行重載時,不能改變優先級規則,否則將引起混亂。 48.基類的析構函數不是虛函數,會帶來什么問題? ``` class B: class A { } A* a = new B(); delete a; 如果A的析構函數中不是虛函數。則在delete的時候只調用A的析構函數而不會調用B的析構函數。造成內存泄漏。 ``` 49. 介紹一下模版和容器。如何實現 模版是C++中實現泛型的一種機制 容器是一種特定用途的類 模版可以說比較古老類。但是當前的泛型編程實質上就是模版編程。它體現類了一種通用和泛化的思想 STL 有7種主要容器: vector,list,deque, map, multimap, set, multiset. 50. 深拷貝和淺拷貝的區別 深拷貝:資源拷貝。意味著拷貝類資源和指針, 淺拷貝:只進行值拷貝。淺拷貝只是拷貝了指針,沒有拷貝資源。這樣使得兩個指針指向同一份資源,造成對同一份析構兩次,程序崩潰。臨時對象的開銷比局部對象小些
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看