十万字cpp成神总结-看完月薪25k
最近會放出cpp成神之路的所有總結,大家感興趣的可以收藏一波。
?歷史文章:
超硬核!十萬字c++題,讓你秒殺老師和面試官
位運算
若一個數m滿足 m = 2^n;那么k%m=k&(m-1)
為什么內存對齊
2、性能原因:
???????函數調用過程棧的變化,返回值和參數變量哪個先入棧?
1、調用者函數把被調函數所需要的參數按照與被調函數的形參順序相反的順序壓入棧中,即:從右向左依次把被調函數所需要的參數壓入棧;
2、調用者函數使用call指令調用被調函數,并把call指令的下一條指令的地址當成返回地址壓入棧中(這個壓棧操作隱含在call指令中);
3、在被調函數中,被調函數會先保存調用者函數的棧底地址(push ebp),然后再保存調用者函數的棧頂地址,即:當前被調函數的棧底地址(mov ebp,esp);
4、在被調函數中,從ebp的位置處開始存放被調函數中的局部變量和臨時變量,并且這些變量的地址按照定義時的順序依次減小,即:這些變量的地址是按照棧的延伸方向排列的,先定義的變量先入棧,后定義的變量后入棧;
???????怎樣判斷兩個浮點數是否相等?
對兩個浮點數判斷大小和是否相等不能直接用==來判斷,會出錯!明明相等的兩個數比較反而是不相等!對于兩個浮點數比較只能通過相減并與預先設定的精度比較,記得要取絕對值!浮點數與0的比較也應該注意。與浮點數的表示方式有關。
???????宏定義一個取兩個數中較大值的功能
#define MAX(x,y)((x>y?)x:y)
???????define、const、typedef、inline使用方法?
???????const與#define的區別:
???????#define和別名typedef的區別
???????define與inline的區別
???????printf實現原理?
在C/C++中,對函數參數的掃描是從后向前的。C/C++的函數參數是通過壓入堆棧的方式來給函數傳參數的(堆棧是一種先進后出的數據結構),最先壓入的參數最后出來,在計算機的內存中,數據有2塊,一塊是堆,一塊是棧(函數參數及局部變量在這里),而棧是從內存的高地址向低地址生長的,控制生長的就是堆棧指針了,最先壓入的參數是在最上面,就是說在所有參數的最后面,最后壓入的參數在最下面,結構上看起來是第一個,所以最后壓入的參數總是能夠被函數找到,因為它就在堆棧指針的上方。printf的第一個被找到的參數就是那個字符指針,就是被雙引號括起來的那一部分,函數通過判斷字符串里控制參數的個數來判斷參數個數及數據類型,通過這些就可算出數據需要的堆棧指針的偏移量了,下面給出printf("%d,%d",a,b);(其中a、b都是int型的)的匯編代碼.
???????#include 的順序以及尖叫括號和雙引號的區別
表示編譯器只在系統默認目錄或尖括號內的工作目錄下搜索頭文件,并不去用戶的工作目錄下尋找,所以一般尖括號用于包含標準庫文件;
表示編譯器先在用戶的工作目錄下搜索頭文件,如果搜索不到則到系統默認目錄下去尋找,所以雙引號一般用于包含用戶自己編寫的頭文件。
???????lambda函數
???????hello world 程序開始到打印到屏幕上的全過程?
1.用戶告訴操作系統執行HelloWorld程序(通過鍵盤輸入等)
2.操作系統:找到helloworld程序的相關信息,檢查其類型是否是可執行文件;并通過程序首部信息,確定代碼和數據在可執行文件中的位置并計算出對應的磁盤塊地址。
3.操作系統:創建一個新進程,將HelloWorld可執行文件映射到該進程結構,表示由該進程執行helloworld程序。
4.操作系統:為helloworld程序設置cpu上下文環境,并跳到程序開始處。
5.執行helloworld程序的第一條指令,發生缺頁異常
6.操作系統:分配一頁物理內存,并將代碼從磁盤讀入內存,然后繼續執行helloworld程序
7.helloword程序執行puts函數(系統調用),在顯示器上寫一字符串
8.操作系統:找到要將字符串送往的顯示設備,通常設備是由一個進程控制的,所以,操作系統將要寫的字符串送給該進程
9.操作系統:控制設備的進程告訴設備的窗口系統,它要顯示該字符串,窗口系統確定這是一個合法的操作,然后將字符串轉換成像素,將像素寫入設備的存儲映像區
10.視頻硬件將像素轉換成顯示器可接收和一組控制數據信號
11.顯示器解釋信號,激發液晶屏
12.OK,我們在屏幕上看到了HelloWorld
???????模板類和模板函數的區別是什么?
函數模板的實例化是由編譯程序在處理函數調用時自動完成的,而類模板的實例化必須由程序員在程序中顯式地指定。即函數模板允許隱式調用和顯式調用而類模板只能顯示調用。在使用時類模板必須加<T>,而函數模板不必
???????為什么模板類一般都是放在一個h文件中
???????C++中類成員的訪問權限和繼承權限問題。
- public:用該關鍵字修飾的成員表示公有成員,該成員不僅可以在類內可以被 ?訪問,在類外也是可以被訪問的,是類對外提供的可訪問接口;
- ?private:用該關鍵字修飾的成員表示私有成員,該成員僅在類內可以被訪問,在類體外是隱藏狀態;
- ?protected:用該關鍵字修飾的成員表示保護成員,保護成員在類體外同樣是隱藏狀態,但是對于該類的派生類來說,相當于公有成員,在派生類中可以被訪問。
- 若繼承方式是public,基類成員在派生類中的訪問權限保持不變,也就是說,基類中的成員訪問權限,在派生類中仍然保持原來的訪問權限;
- ?若繼承方式是private,基類所有成員在派生類中的訪問權限都會變為私有(private)權限;
- 若繼承方式是protected,基類的共有成員和保護成員在派生類中的訪問權限都會變為保護(protected)權限,私有成員在派生類中的訪問權限仍然是私有(private)權限。
???????cout和printf有什么區別?
cout<<是一個函數,cout<<后可以跟不同的類型是因為cout<<已存在針對各種類型數據的重載,所以會自動識別數據的類型。輸出過程會首先將輸出字符放入緩沖區,然后輸出到屏幕。
cout是有緩沖輸出:
cout < < "abc " < <endl;
或cout < < "abc\n ";cout < <flush; 這兩個才是一樣的.
endl相當于輸出回車后,再強迫緩沖輸出。
flush立即強迫緩沖輸出。
printf是無緩沖輸出。有輸出時立即輸出
???????重載運算符?
???????函數重載函數匹配原則
???????定義和聲明的區別
從編譯原理上來說,聲明是僅僅告訴編譯器,有個某類型的變量會被使用,但是編譯器并不會為它分配任何內存。而定義就是分配了內存。
聲明:一般在頭文件里,對編譯器說:這里我有一個函數叫function() 讓編譯器知道這個函數的存在。
定義:一般在源文件里,具體就是函數的實現過程 寫明函數體。
???????C++類型轉換有四種
1 . 用于類層次結構中父類和子類之間指針或引用的轉換。進行上行轉換(把子類的指針或引用轉換成父類表示)是安全的;
2 . 進行下行轉換(把父類指針或引用轉換成子類指針或引用)時,由于沒有動態類型檢查,所以是不安全的;
3 . 用于基本數據類型之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。
4 . 把void指針轉換成目標類型的指針(不安全!!)
5 . 把任何類型的表達式轉換成void類型。
??????????????全局變量和static變量的區別
1、全局變量(外部變量)的說明之前再冠以static就構成了靜態的全局變量。全局變量本身就是靜態存儲方式,靜態全局變量當然也是靜態存儲方式。
這兩者在存儲方式上并無不同。這兩者的區別在于非靜態全局變量的作用域是整個源程序,當一個源程序由多個原文件組成時,非靜態的全局變量在各個源文件中都是有效的。而靜態全局變量則限制了其作用域,即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它。由于靜態全局變量的作用域限于一個源文件內,只能為該源文件內的函數公用,因此可以避免在其他源文件中引起錯誤。static全局變量與普通的全局變量的區別是static全局變量只初始化一次,防止在其他文件單元被引用。
2.static函數與普通函數有什么區別?
static函數與普通的函數作用域不同。盡在本文件中。只在當前源文件中使用的函數應該說明為內部函數(static),內部函數應該在當前源文件中說明和定義。對于可在當前源文件以外使用的函數應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件。
??? static函數與普通函數最主要區別是static函數在內存中只有一份,普通靜態函數在每個被調用中維持一份拷貝程序的局部變量存在于(堆棧)中,全局變量存在于(靜態區)中,動態申請數據存在于(堆)
???????靜態成員與普通成員的區別
- 生命周期
靜態成員變量從類被加載開始到類被卸載,一直存在;
普通成員變量只有在類創建對象后才開始存在,對象結束,它的生命期結束;
共享方式
靜態成員變量是全類共享;普通成員變量是每個對象單獨享用的;
定義位置
普通成員變量存儲在?;蚨阎?#xff0c;而靜態成員變量存儲在靜態全局區;
初始化位置
普通成員變量在類中初始化;靜態成員變量在類外初始化;
- 默認實參
可以使用靜態成員變量作為默認實參,
?
???????說一下理解 ifdef? endif
#ifdef 標識符?
程序段1?
#else?
程序段2?
#endif
它的作用是:當標識符已經被定義過(一般是用#define命令定義),則對程序段1進行編譯,否則編譯程序段2。?
其中#else部分也可以沒有,即:?
#ifdef?
程序段1?
#denif
在一個大的軟件工程里面,可能會有多個文件同時包含一個頭文件,當這些文件編譯鏈接成一個可執行文件上時,就會出現大量“重定義”錯誤。在頭文件中使用#define、#ifndef、#ifdef、#endif能避免頭文件重定義。
???????隱式轉換,如何消除隱式轉換?
總結
以上是生活随笔為你收集整理的十万字cpp成神总结-看完月薪25k的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 未来激情狂飙《爆发赛车》游戏模式大公开
- 下一篇: 《光明之共鸣》前瞻 Tony大神笔下美女