C 常考問題

2021-10-09 19:47:31 字數 3735 閱讀 1707

多型字面上即為多種形態,具體到c++中即為物件導向程式設計中針對乙個介面進行多種實現,比如使用同乙個成員名來呼叫類物件的成員函式產生不同的行為。

靜態多型是指編譯時候的多型,通過函式過載或者運算子過載實現。

真正的多型應該是動態(執行期)多型,語法上通過虛函式與基類指標共同作用實現。

虛函式通過關鍵字virtual宣告,告知編譯器不要在編譯階段將此函式靜態繫結到具體某個函式上,派生類可以重寫override基類的方法,執行期間根據具體的物件來決定函式呼叫。

底層實現上每個含有虛函式的類在記憶體中多一根指標,指向虛函式表的位置,虛函式表存放當前類各個函式的入口位址,虛表在編譯階段就構造完畢(每個類乙個)。呼叫虛函式時,通過虛指標vptr找到具體所呼叫的虛函式的入口位址,進而呼叫具體的虛函式。

可以,最好是虛的

不可以,構造開始還沒有虛表,沒法呼叫虛函式

不可以,內聯函式是個靜態行為,編譯時處理

不可以,static不屬於任何類例項,沒有this指標

不可以,構造是按繼承順序的,先基類,後派生類,如果構造期間呼叫了乙個子類的虛函式,但是子類還未構造出來,未定義行為

不可以,因為常函式是操作成員變數的,而靜態函式沒有成員變數可說

記憶體角度:指標是個存放位址的變數,有記憶體,引用是個別名,沒有記憶體

現象角度:指標執行時可以改變值,引用初始化之後不能改變指向

引用沒有const, 指標有const

引用不能為空,指標可以為空(所以需要檢查是否為空指標)所以引用效率高

在引數傳遞時,引用會做型別檢查,而指標不會

從編譯上看,程式在編譯時分別將指標和引用新增到符號表上,符號表上記錄的是變數名及變數所對應位址。指標變數在符號表上對應的位址值為指標變數的位址值,而引用在符號表上對應的位址值為引用物件的位址值。符號表生成後就不會再改,因此指標可以改變指向的物件(指標變數中的值可以改),而引用物件不能改。這是使用指標不安全而使用引用安全的主要原因。從某種意義上來說引用可以被認為是不能改變的指標。

vector即一塊動態陣列,如果陣列長度不足以存放資料就會動態擴容,其過程為重新new一塊更大的空間(教科書上寫2倍,實際不同編譯器不一樣,如1.5等),再將原有元素一一拷貝過去,同時添上新增的元素

list 底層資料結構為雙向鍊錶,支援快速增刪

map 底層資料結構為紅黑樹,有序,不重複

set 底層資料結構為紅黑樹,有序,不重複

deque 底層資料結構為乙個**控制器和多個緩衝區,詳細見stl原始碼剖析p146,支援首尾(中間不能)快速增刪,也支援隨機訪問

stack/queue 底層一般用list或deque實現,封閉頭部/尾部即可,不用vector的原因應該是容量大小有限制,擴容耗時

unordered_map/unordered_set: 雜湊表

c語言中

c++中

靜態類成員,所有同型別的物件唯一共享

靜態成員函式,與任何物件都無瓜葛,不訪問任何non-static member

修飾變數,區域性變數,全域性變數,成員變數(必須初始值列表)

修飾引用作為函式引數,保護值不會改變

修飾成員函式,類的成員函式加上const限定可以宣告此函式不會更改類物件的內容(並不牢靠)

修飾返回值,表明返回的資料是不可修改的

修飾指標,左定值,右定向,const在*左側表示所指內容是常量,在*右側表示指標本身是常量不可變

成員變數可以,成員函式不行, static不依賴於任何物件,而const成員函式強調不修改物件的成員,這兩者針對的點不同,不能同時修飾

c++編譯器在實現const的成員函式的時候為了確保該函式不能修改類的中引數的值,會在函式中新增乙個隱式的引數const this*。但當乙個成員為static的時候,該函式是沒有this指標的。也就是說此時const的用法和static是衝突的。

否, static函式操作的整個類的,不依賴於某個物件,非static函式改變的是某個物件的成員變數,static不可以呼叫非static函式

通過將指標封裝成物件,從而能自動處理堆上物件的釋放問題。

可以解決資源洩露,空懸指標等問題。

四種const_cast將const變數轉為非const

static_cast內建基本資料型別之間的相互轉換,void*轉指標,沒有執行時型別檢查

reinterpret_cast: 轉化任何內建的資料型別為其他任何的資料型別,也可以轉化指標型別為其他型別,甚至可以轉化內建的資料型別為指標,無需考慮型別安全或者常量的情形。不到萬不得已絕對不用

dynamic_cast: 執行時型別轉化,只能轉換多型類的指標和引用,比如基型別與派生類型別指標的相互轉換,成功返回轉換成功的指標,失敗返回null或者拋異常

生命期不同,棧上的物件在定義物件時即在棧空間生成,離開作用域(右大括號)後即自動呼叫析構函式銷毀

堆上的空間需要進行動態記憶體分配(new)且需要手動釋放(delete),否則會一直存在,造成記憶體洩露

編譯器處理方式:const編譯時,define預處理時

型別檢查:const有資料型別檢查,define無

記憶體空間:const在靜態區分配記憶體,只有乙個拷貝,define多個立即數替換

範圍:const可以通過extern多個檔案共享,define僅限於當前檔案

提高執行效率的語言特性:右值引、移動語義、完美**,泛化常量表示式,emplace_back減少記憶體拷貝和移動

原有語法的使用性增強:初始化列表、統一的初始化語法、型別推導、範圍for迴圈、lambda表示式、final和override、建構函式委託

語言能力的提公升:空指標nullptr、default和delete、長整數、靜態assert

c++標準庫的更新:智慧型指標、正規表示式、無序容器(雜湊表)等

eager singleton(餓漢模式)自身執行緒安全

這種實現在程式開始(靜態屬性instance初始化)的時就完成了例項的建立。

//標頭檔案中

class singleton

private:

singleton();

~singleton();

singleton(const singleton&);

singleton& operator=(const singleton&);

private:

static singleton instance;

}//實現檔案中

singleton singleton::instance;

懶漢模式(加鎖)

class singleton

static singleton* p;

static singleton* initance();

}pthread_mutex_t singleton::mutex;

singleton* singleton::p = null;

singleton* singleton::initance()

return p;

}

meyers singleton

class singleton  

private:

singleton(); //這裡將構造,析構,拷貝構造,賦值函式設為私有,杜絕了生成新例

~singleton();

singleton(const singleton&);

singleton& operator=(const singleton&);

};

資料探勘 機器學習面試 SVM常考問題

svm是一種二類分類模型。它的基本模型是在特徵空間中尋找間隔最大化的分離超平面的線性分類器。間隔最大是它有別於感知機 1 當訓練樣本線性可分時,通過硬間隔最大化,學習乙個線性分類器,即線性可分支援向量機 2 當訓練資料近似線性可分時,引入鬆弛變數,通過軟間隔最大化,學習乙個線性分類器,即線性支援向量...

MySQL 事物 鎖 引擎的一些常考問題

1.資料庫併發控制的基本單位 python sqlalchemy orm框架的事物 session.begin try itim1 session.query item get 1 itim2 session.query item get 2 item1.foo bar item2.bar foo ...

資料探勘(機器學習)面試 SVM面試常考問題

應聘資料探勘工程師或機器學習工程師,面試官經常會考量面試者對svm的理解。以下是我自己在準備面試過程中,基於個人理解,總結的一些svm面試常考問題 想到會再更新 如有錯漏,請批評指正。大神請忽視 svm的原理是什麼?svm是一種二類分類模型。它的基本模型是在特徵空間中尋找間隔最大化的分離超平面的線性...