派生類和基類中有同名的函數(shù),但非虛函數(shù)。基類指針會(huì)調(diào)用哪個(gè)的函數(shù),如何調(diào)用另一個(gè)類的這個(gè)函數(shù)呢。如果是虛函數(shù)有會(huì)怎樣呢?
答:派生類和基類中有同名的函數(shù),但非虛函數(shù)?;愔羔槙?huì)調(diào)用基類的函數(shù)。當(dāng)如果是虛函數(shù)的話,則要看基類指針指向的是派生類還是基類。是誰就調(diào)用誰的。子類不是現(xiàn)基類的函數(shù)。會(huì)調(diào)用基類的函數(shù),基類指針指向子類對(duì)象,調(diào)用非虛函數(shù)函數(shù)時(shí),會(huì)調(diào)用基類函數(shù)?;愔羔樋梢酝ㄟ^子類的虛函數(shù)調(diào)用子類的非虛函數(shù)。
虛函數(shù)表指針在頭部還是在哪 跟編譯器有關(guān)嗎?
** 答:****虛函數(shù)的地址存放于虛函數(shù)表之中。運(yùn)行期多態(tài)就是通過虛函數(shù)和虛函數(shù)表實(shí)現(xiàn)的。**
類的對(duì)象內(nèi)部會(huì)有指向類內(nèi)部的虛表地址的指針。通過這個(gè)指針調(diào)用虛函數(shù)。目前gcc 和微軟的編譯器都是將vptr放在對(duì)象內(nèi)存布局的最前面。
函數(shù)重載的條件
答:同一個(gè)作用域下 ****函數(shù)名稱相同 ****函數(shù)參數(shù)類型不同 或者 個(gè)數(shù)不同 或者 順序不同 函數(shù)的返回值不可以作為函數(shù)重載的條件
STL容器常見的時(shí)間復(fù)雜度。
map, set, multimap, and multiset
上述四種容器采用紅黑樹實(shí)現(xiàn),紅黑樹是平衡二叉樹的一種。不同操作的時(shí)間復(fù)雜度近似為:
插入: O(logN) ****查看:O(logN) ****刪除:O(logN)
hash_map, hash_set, hash_multimap, and hash_multiset
上述四種容器采用哈希表實(shí)現(xiàn),不同操作的時(shí)間復(fù)雜度為:
插入:O(1),最壞情況O(N)。 ****查看:O(1),最壞情況O(N)。 ****刪除:O(1),最壞情況O(N)。
多繼承虛函數(shù)表
答:多繼承情況下,派生類中有多個(gè)虛函數(shù)表,虛函數(shù)的排列方式和繼承的順序一致。派生類重寫函數(shù)將會(huì)覆蓋所有虛函數(shù)表的同名內(nèi)容,派生類自定義新的虛函數(shù)將會(huì)在第一個(gè)類的虛函數(shù)表的后面進(jìn)行擴(kuò)充。
深拷貝、淺拷貝
深拷貝優(yōu)點(diǎn):每一個(gè)對(duì)象的指針都有指向的內(nèi)存空間,而不是共享,所以在對(duì)象析構(gòu)的時(shí)候就不存在重復(fù)釋放和內(nèi)存泄漏的問題。
缺點(diǎn):內(nèi)存開銷大
淺拷貝優(yōu)點(diǎn):通過拷貝構(gòu)造函數(shù)實(shí)例化對(duì)象的時(shí)候,指針數(shù)據(jù)變量指向共享的內(nèi)存空間,也就是拷貝的時(shí)候采用了值傳遞的方式,因此內(nèi)存開銷小
缺點(diǎn):對(duì)象析構(gòu)的時(shí)候就可能會(huì)重復(fù)釋放或造成內(nèi)存泄漏;
strcpy()的代碼實(shí)現(xiàn)
其安全版本為strcpy_s()函數(shù),(第二個(gè)參數(shù),為字符串dst的長度)。

多進(jìn)程與多線程的區(qū)別
強(qiáng)相關(guān)的處理用線程,弱相關(guān)的處理用進(jìn)程。
線程同步方式:互斥鎖、條件變量、信號(hào)量,讀寫鎖
1>互斥鎖:一個(gè)時(shí)間內(nèi)只準(zhǔn)一個(gè)線程進(jìn)入關(guān)鍵代碼
2>條件變量:利用線程之間共享一個(gè)全局變量是實(shí)現(xiàn)同步;基本操作有:觸發(fā)條件(當(dāng)條件為true時(shí)),等待條件,掛起線程直到其他線程觸發(fā)條件
3> 信號(hào)量:跟進(jìn)程的信號(hào)量一樣
4>讀寫鎖:多個(gè)讀鎖可以共享一個(gè)臨界區(qū),寫鎖與寫鎖互斥,寫鎖與讀鎖互斥

哈希沖突產(chǎn)生的原因
哈希是通過對(duì)數(shù)據(jù)進(jìn)行再壓縮,提高效率的一種解決方法。但由于通過哈希函數(shù)產(chǎn)生的哈希值是有限的,而數(shù)據(jù)可能比較多,導(dǎo)致經(jīng)過哈希函數(shù)處理后仍然有不同的數(shù)據(jù)對(duì)應(yīng)相同的值。這時(shí)候就產(chǎn)生了哈希沖突。
1.開放地址方法:就是在發(fā)生沖突的key上加1或者n的平方或者一個(gè)隨機(jī)值;
2.鏈?zhǔn)降刂贩ǎ℉ashMap的哈希沖突解決方法):對(duì)于相同的值,使用鏈表進(jìn)行連接。使用數(shù)組存儲(chǔ)每一個(gè)鏈表。
3.建立公共溢出區(qū): 建立公共溢出區(qū)存儲(chǔ)所有哈希沖突的數(shù)據(jù)。
4.再哈希法:對(duì)于沖突的哈希值再次進(jìn)行哈希處理,直至沒有哈希沖突。
static
**答:分為兩種 **
面向過程中的static:
static局部變量 將一個(gè)變量聲明為函數(shù)的局部變量,那么這個(gè)局部變量在函數(shù)執(zhí)行完成之后不會(huì)被釋放,而是繼續(xù)保留在內(nèi)存中
static 全局變量 表示一個(gè)變量在當(dāng)前文件的全局內(nèi)可訪問
static 函數(shù) 表示一個(gè)函數(shù)只能在當(dāng)前文件中被訪問
(1)函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體,該變量的內(nèi)存只被分配一次,因此其值在下次調(diào)用時(shí)仍維持上次的值;
(2)在模塊內(nèi)的static全局變量和函數(shù)可以被模塊內(nèi)的函數(shù)訪問,但不能被模塊外其它函數(shù)訪問;
面向?qū)ο蟮膕tatic關(guān)鍵字:static對(duì)象 類內(nèi)聲明 類外初始化 編譯階段分配內(nèi)存 所有對(duì)象共享同一份數(shù)據(jù)。
** static函數(shù):在類中的static成員函數(shù)屬于整個(gè)類所擁有,這個(gè)函數(shù)不接收this指針,只能調(diào)用static成員變量;程序共享同一個(gè)函數(shù)。**
const:
const 常量:定義時(shí)就初始化,以后不能更改。
const 形參:func(const int a){};該形參在函數(shù)里不能改變
const修飾類成員函數(shù):該函數(shù)對(duì)成員變量只能進(jìn)行只讀操作
(1)阻止一個(gè)變量被改變
(2)聲明常量指針和指針常量
(3)const修飾形參,表明它是一個(gè)輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;
(4)對(duì)于類的成員函數(shù),若指定其為const類型,則表明其是一個(gè)常函數(shù),不能修改類的成員變量;
(5)對(duì)于類的成員函數(shù),有時(shí)候必須指定其返回值為const類型,以使得其返回值不為”左值”。
extern
只是用來獲取全局變量(包括全局靜態(tài)變量)的值,不能用于定義變量,先在當(dāng)前文件查找有沒有全局變量,沒有找到,才會(huì)去其他文件查找。
排序算法的穩(wěn)定性
答:選擇排序、快速排序、希爾排序、堆排序不是穩(wěn)定的排序算法,而冒泡排序、插入排序、歸并排序和基數(shù)排序是穩(wěn)定的排序算法。

空指針和野指針:
答:空指針指針變量指向內(nèi)存中編號(hào)為0的空間,一般用來初始化指針變量,空指針指向的內(nèi)存是不可以訪問的。
** 野指針是指針變量指向已銷毀或者受限的內(nèi)存地址(隨機(jī)的空間),不能通過是否為null來判斷。當(dāng)指針初始化沒有置空時(shí),也會(huì)產(chǎn)生野指針?;蛘咧羔槼搅俗饔糜?。**
map/unordered_map的區(qū)別
內(nèi)部實(shí)現(xiàn)機(jī)理不同
map: map內(nèi)部實(shí)現(xiàn)了一個(gè)紅黑樹(紅黑樹是非嚴(yán)格平衡二叉搜索樹,而AVL是嚴(yán)格平衡二叉搜索樹),紅黑樹具有自動(dòng)排序的功能,因此map內(nèi)部的所有元素都是有序的,紅黑樹的每一個(gè)節(jié)點(diǎn)都代表著map的一個(gè)元素。因此,對(duì)于map進(jìn)行的查找,刪除,添加等一系列的操作都相當(dāng)于是對(duì)紅黑樹進(jìn)行的操作。map中的元素是按照二叉搜索樹(又名二叉查找樹、二叉排序樹,特點(diǎn)就是左子樹上所有節(jié)點(diǎn)的鍵值都小于根節(jié)點(diǎn)的鍵值,右子樹所有節(jié)點(diǎn)的鍵值都大于根節(jié)點(diǎn)的鍵值)存儲(chǔ)的,使用中序遍歷可將鍵值按照從小到大遍歷出來。
unordered_map: unordered_map內(nèi)部實(shí)現(xiàn)了一個(gè)哈希表(也叫散列表,通過把關(guān)鍵碼值映射到Hash表中一個(gè)位置來訪問記錄,查找的時(shí)間復(fù)雜度可達(dá)到O(1),其在海量數(shù)據(jù)處理中有著廣泛應(yīng)用)。因此,其元素的排列順序是無序的。哈希表詳細(xì)介紹
優(yōu)缺點(diǎn)以及適用處
map:
優(yōu)點(diǎn):
有序性,這是map結(jié)構(gòu)最大的優(yōu)點(diǎn),其元素的有序性在很多應(yīng)用中都會(huì)簡化很多的操作
紅黑樹,內(nèi)部實(shí)現(xiàn)一個(gè)紅黑書使得map的很多操作在lgn的時(shí)間復(fù)雜度下就可以實(shí)現(xiàn),因此效率非常的高
缺點(diǎn): 空間占用率高,因?yàn)閙ap內(nèi)部實(shí)現(xiàn)了紅黑樹,雖然提高了運(yùn)行效率,但是因?yàn)槊恳粋€(gè)節(jié)點(diǎn)都需要額外保存父節(jié)點(diǎn)、孩子節(jié)點(diǎn)和紅/黑性質(zhì),使得每一個(gè)節(jié)點(diǎn)都占用大量的空間
適用處:對(duì)于那些有順序要求的問題,用map會(huì)更高效一些
unordered_map:
優(yōu)點(diǎn): 因?yàn)閮?nèi)部實(shí)現(xiàn)了哈希表,因此其查找速度非常的快
缺點(diǎn): 哈希表的建立比較耗費(fèi)時(shí)間
適用處:對(duì)于查找問題,unordered_map會(huì)更加高效一些,因此遇到查找問題,常會(huì)考慮一下用unordered_map
總結(jié):
內(nèi)存占有率的問題就轉(zhuǎn)化成紅黑樹 VS hash表 , 還是unorder_map占用的內(nèi)存要高。
但是unordered_map執(zhí)行效率要比map高很多
對(duì)于unordered_map或unordered_set容器,其遍歷順序與創(chuàng)建該容器時(shí)輸入的順序不一定相同,因?yàn)楸闅v是按照哈希表從前往后依次遍歷的
map和unordered_map的使用
unordered_map的用法和map是一樣的,提供了 insert,size,count等操作,并且里面的元素也是以pair類型來存貯的。其底層實(shí)現(xiàn)是完全不同的,上方已經(jīng)解釋了,但是就外部使用來說卻是一致的。
strcpy和memcpy和strncpy
strcpy和memcpy主要有以下3方面的區(qū)別。
1、復(fù)制的內(nèi)容不同。strcpy只能復(fù)制字符串,而memcpy可以復(fù)制任意內(nèi)容,例如字符數(shù)組、整型、結(jié)構(gòu)體、類等。
2、復(fù)制的方法不同。strcpy不需要指定長度,它遇到被復(fù)制字符的串結(jié)束符"\0"才結(jié)束,所以容易溢出。memcpy則是根據(jù)其第3個(gè)參數(shù)決定復(fù)制的長度。
3、用途不同。通常在復(fù)制字符串時(shí)用strcpy,而需要復(fù)制其他類型數(shù)據(jù)時(shí)則一般用memcpy
strncpy 的標(biāo)準(zhǔn)用法為:(手工寫上 \0)
strncpy(path, src, sizeof(path) - 1);
path[sizeof(path) - 1] = '\0';
len = strlen(path);
1. 好的程序猿用strncpy, 先定義并初始化char str[MAX + 1] = {0};, 如果在程序中間需要再往str中拷貝串,一定要用memset清零。 拷貝范式為:strncpy(str, p, sizeof(str) - 1); , 流氓程序猿用strcpy, 當(dāng)然我經(jīng)常在寫博客時(shí)這么干.
2. strncpy拷貝的是字符,不拷貝串,所以最后一個(gè)\0沒有拷貝,所以,拷貝的時(shí)候需要對(duì)串進(jìn)行清零處理,一定要養(yǎng)成好習(xí)慣。
3. strncpy拷貝時(shí),可能會(huì)導(dǎo)致截?cái)?,但程序不?huì)崩潰。