面試複習 C

2021-10-09 22:11:16 字數 3687 閱讀 5623

nullptr:代替null;原因:null和0有時會分不清,用nullptr專門區分空指標和0

auto和decltype:自動型別推導 ;auto可以推導變數的型別,與c語言中原有的auto功能不相同;auto宣告的變數必須初始化;auto不能宣告為返回值、不能作形參、不能被修飾為模板引數;auto對執行效率沒有影響,因為變數型別的推導在編譯時本來也要進行;decltype可以分析表示式的型別,但是不計算表示式的值,是對auto只能判斷變數型別的補充

for迴圈,支援類似c#的foreach:支援遍歷陣列、容器、string以及由begin和end定義的序列

初始化列表:建構函式的初始化列表。建構函式的執行分為初始化階段(初始化所有類成員)和計算階段(建構函式體內的賦值操作),使用初始化列表不需要呼叫預設建構函式;常量成員、引用型別、沒有預設建構函式的類必須使用初始化列表;初始化成員變數的順序是類中定義的順序,而不是初始化列表中的順序

lamda表示式,是匿名函式,構成 [捕獲區] (引數區) ;捕獲區的定義 (a複製a、&b引用b、this當前物件、&以引用捕獲所有用於 lambda 體內的自動變數,並以引用捕獲當前物件,若存在;= 以複製捕獲所有用於 lambda 體內的自動變數,並以引用捕獲當前物件,若存在;應用場景為sort等自定義比較函式、建立執行緒thread

左值:指向穩定的記憶體空間 location value

右值:指向臨時的記憶體空間 read value

左值引用:使用&,相當於給變數取乙個別名

右值引用:使用&&,相當於給臨時變數取乙個別名

左值引用只能引用左值,右值引用只能引用右值,常量左值引用可以引用所有(但是唯讀)

目的:消除兩個物件互動時不必要的物件拷貝,提公升效率;更簡明的定義泛型函式

定義:將資源從乙個物件轉移到另乙個物件;移動語義相當於剪下、拷貝語義相當於複製

實現移動語義需要增加移動建構函式和移動複製建構函式

拷貝構造的引數是常量左值引用,移動建構函式的引數是右值引用,右值將優先進入移動建構函式;移動建構函式會直接把自己的指標指向別人的物件並把別人的指標修改為空

如果想把左值進行移動構造,可以用std::move把左值轉換成右值,方便應用移動語義

完美**就是乙個函式將引數轉交給另乙個函式,它的左/右值和const/non-const屬性不發生改變

使用通用引用型別和std::forward可以實現

防止記憶體洩漏,用來管理野指標

shared_ptr 基於引用計數,計數降為0時自動釋放

weak_ptr 只引用,不計數,與shared_ptr配套使用

unique_ptr 基於獨佔語義,資源唯一地被unique_ptr占有,離開作用域時析構

定義:虛函式是基類中用virtual宣告的函式;純虛函式:基類中虛函式沒有給出函式體、

虛函式指標:指向使用者定義的虛函式,每個虛函式都會對應乙個虛函式指標

虛函式表:虛函式指標會排列在物件的位址首部,組成了一種錶狀結構,叫虛函式表;虛函式表的結構:基類-只有自己定義的虛函式 一般覆蓋繼承-繼承的虛函式指標會覆蓋原有的指標 多重繼承-按照繼承順序會有多個表項

問題:虛函式的代價-虛函式表、虛函式指標 哪些函式不能是虛函式-建構函式、內聯函式、靜態函式、友元函式、類外的普通函式 菱形繼承問題-使用虛繼承 父類的析構函式為什麼要是虛函式-b類從a類繼承的話,delete物件會呼叫a類的析構函式,b類析構函式不被呼叫,造成記憶體洩漏 建構函式為什麼不能是虛函式-虛函式需要通過虛函式表呼叫,而物件沒有例項化的時候找不到虛函式表

構造&析構函式 建構函式在建立類的新物件時執行;析構函式在刪除所建立的物件時執行

拷貝建構函式 把同乙個類的物件作為引數初始化新的物件;申請空間、拷貝值

友元函式 定義在類外部,可以訪問類的私有和保護成員;友元函式不是成員函式

內聯函式 inline,編譯時替換函式體,用於小函式

問題:空類預設新增的東西-構造、拷貝構造、析構、賦值運算子 建構函式執行順序-父類構造、成員物件構造、子類構造 析構函式執行順序-子類析構、成員物件析構、父類析構 列表初始化比賦值初始化快-列表是分配空間時初始化,賦值是分配好空間之後 建構函式只有在被需要時才會自動生成-類成員有建構函式、父類含有建構函式、類中有虛函式、虛繼承

靜態資料成員和靜態成員函式:是屬於類但不屬於該類的任何物件的變數和函式

靜態成員函式沒有this指標

靜態成員的初始化:在類體外進行,必須進行初始化

靜態成員函式僅能訪問靜態資料成員和函式(沒有this指標)

置於變數和函式,表示變數和函式定義在別的檔案中

extern 「c」,表示內容按照c語言的規則翻譯

修飾普通成員變數 該變數不可被修改

修飾非成員變數 修飾全域性變數-記憶體唯讀,第一次使用時分配記憶體 修飾區域性變數-儲存在棧中,**塊結束時釋放

修飾指標 左定值,右定向

引數傳遞 值傳遞-不需要修飾,函式會自己拷貝 指標傳遞-保證指標不被修改 自定義引數型別-拷貝時會呼叫建構函式,慢,所以用const+引用傳遞

修飾返回值 對自定義型別,在返回值加const,使之變成右值

修飾類成員函式 防止成員函式修改物件的值

不能與static同用:const對應每個例項,static靜態成員沒有this指標,不能例項化

隱式轉換 向0取整

顯示轉換有動態、靜態、const、重編譯

static_cast 無條件轉換、靜態、不進行安全檢查

dynamic_cast 動態、有安全檢查

const_cast 修改const內容的乙個方式,只能是引用和指標

reinterpret_cast 不改變二進位制,只重新解釋變數

封裝了陣列,具有一定容量,超出會resize重新分配空間(棄用當前空間)

使用3個迭代器 _myfirst第乙個元素、_mylast最後乙個元素、_myend空間的末尾位元組

雙佇列 用map陣列儲存各連續空間的指標,ma不夠用時棄用並重新分配

迭代器使用四個指標 cur當前元素、first隊首、last隊尾、node二級指標,指向map中指向當前空間的指標

使用兩個迭代器start、finish,其中的cur分別指向第乙個和最後乙個元素,first和last分別指向元素所在連續空間的首部和尾部,node指向元素對應的map指標

集合,自動去重和排序;二叉搜尋樹(紅黑樹),查詢快

不能修改值,可以查詢、插入、刪除

(key,value)形式,key不可以重複;用紅黑樹實現

雜湊表實現

堆heap實現

vector或者list實現

迭代器 一種泛化指標;是一種檢查和遍歷元素的資料型別,容器都定義了自己的迭代器型別

stl組成 容器、配接器、空間配置器、迭代器、演算法、仿函式

不允許遍歷的容器(不提供迭代器)queue、stack、heap

allocator,隱藏容器的記憶體管理工作;預設的allocator:要分配的記憶體大於128kb,直接用malloc(一級分配器),小於128kb,在一塊已經分配好的記憶體池中取一塊記憶體交付;記憶體池:由16個不同大小(8的倍數 8,16,32…128)的空閒列表組成;記憶體池優點:小物件快速分配,避免碎片生成

erase和remove erase會真正釋放空間,remove只是移到末尾

new和malloc區別 new是關鍵字:分配記憶體-建構函式-析構函式 malloc是函式,分配一定的空間

b,b+,b*樹 b:平衡多路查詢樹,關鍵字遞增,左小右大 b+:非葉子結點只保留索引 b*:以b+樹為基礎,滿節點後先向兄弟結點轉移

堆記憶體和棧記憶體的區別 堆-程式設計師手動,複雜 棧-編譯器自動,簡單

複習c語言 面試題

簡單直接排序 include intmain int n sizeof a sizeof a 0 int i,j,temp printf 原陣列為 for i 0 i i printf d a i printf n n for i 1 i n i a j temp printf 排序後陣列 for ...

面試複習鏈結整理

1.densenet詳解 2.機器學習與深度學習常見面試題 3.機器學習與深度學習核心知識點總結 4.深度卷積神經網路演化歷史及結構改進網路 5.怎樣成為一名優秀的演算法工程師 6.知識庫 技術文章 7.理解概率密度函式 9.eco efficient video understanding 10....

阿里面試複習

2.getclass方法 3.tostring方法 4.finalize方法 5.equals方法 6.hashcode方法 7.wait方法 8.notify方法 9.notifyall方法 作用域當前類 同一package 子孫類其他package public protected privat...