C++基础知识简答题
1、C++ 可執(zhí)行程序的內(nèi)存分布
BSS:Block Started by Symbol?
存放程序中未初始化的全局變量?
數(shù)據(jù)段:?
存放已初始化的全局變量,靜態(tài)內(nèi)存分配?
代碼段:?
存放執(zhí)行代碼?
堆heap:?
存放運(yùn)行中動態(tài)分配的內(nèi)存段,可擴(kuò)張或縮減?
棧stack:?
存放程序的局部變量,在函數(shù)被調(diào)用時(shí),棧還用來傳遞參數(shù)和返回值
2、C++編譯原理
1、預(yù)編譯:宏展開過程?
2、編譯:inline在此時(shí)展開,從C++代碼到匯編語言?
3、匯編:匯編語言到機(jī)器語言?
4、鏈接?
引申:內(nèi)聯(lián)函數(shù)和宏:?
兩者都可以節(jié)省函數(shù)棧的開銷,提高運(yùn)行效率。因?yàn)楹瘮?shù)在運(yùn)行時(shí)需要保持現(xiàn)場和上下文后恢復(fù)現(xiàn)場,有時(shí)間和空間的開銷?
宏在調(diào)用時(shí)直接展開,更有效率,但不能使用私有成員,不能調(diào)試,容易產(chǎn)生二義性?
內(nèi)聯(lián)函數(shù)由編譯器展開
3、C++ extern關(guān)鍵字的作用
加在變量或函數(shù)前,表明該內(nèi)容的定義在其他文件中。?
extern “C” 提示C++編譯器按C語言的規(guī)則編譯函數(shù),舉例:?
C++生成的動態(tài)庫.so文件,如果按C++命名,則函數(shù)的名稱會因?yàn)槔^承等原因變化,比如func()會變成func_%20(),其他程序調(diào)用dlopen動態(tài)打開該庫時(shí),按照func名稱會搜索不到相應(yīng)的函數(shù)。
4、static關(guān)鍵字的作用
在全局變量中加static,稱為靜態(tài)全局變量有以下特點(diǎn):?
在數(shù)據(jù)段中存放?
會被自動初始化成0?
在文件之外不可見
另外,static修飾函數(shù),可以使其成為類的靜態(tài)成員函數(shù),成員變量和類相關(guān),和類的對象無關(guān)。?
及時(shí)沒有具體對象,也能調(diào)用類的靜態(tài)成員函數(shù)——單例模式
5、const關(guān)鍵字的作用
主要有四個方面:常量、函數(shù)輸入、函數(shù)輸出、成員函數(shù),都是為了讓被修飾的內(nèi)容受到保護(hù),防止意外修改?
1、const修飾常量,最常用,常量不讓修改?
2、const修飾輸入?yún)?shù):?
void StringCopy(char?dest,const char?source),函數(shù)體內(nèi)任何修改source的行為都會報(bào)錯?
3、如果輸入?yún)?shù)采用值傳遞,由于函數(shù)會在棧中自動產(chǎn)生臨時(shí)變量的復(fù)制(拷貝構(gòu)造函數(shù)),因此參數(shù)不用加const?
void func(int x)不能用void func(const int x)?
4、引用傳遞比值傳遞效率高,但是缺點(diǎn)是參數(shù)可能被修改,因此也可以加const修飾?
void func(A& a) –> void func(const A& a)?
5、用const修飾函數(shù)的返回值?
如果以指針傳遞的方式返回,且被const修飾,則賦值給其他指針變量的時(shí)候,要求指針也得用const聲明:?
const char * GetString();?
char * str=GetString();——報(bào)錯?
const char *str=GetString();——正確
如果是值傳遞,由于函數(shù)會自動復(fù)制的關(guān)系,加const沒用
6、const修飾成員函數(shù)
任何不會修改數(shù)據(jù)成員的函數(shù)都應(yīng)聲明為const類型?
1、在const成員函數(shù)中,不慎修改了數(shù)據(jù)成員,會報(bào)錯?
2、在const成員函數(shù)中,不慎調(diào)用了其他非const成員函數(shù),報(bào)錯
7、static、const、static const的初始化
1、在類里創(chuàng)建一個const類型變量時(shí),不能給他初值?
理由:編譯器必須為const類型變量分配存儲空間,但類的聲明又不占用存儲空間?
class foo?
{?
private:?
const int a= 100;——報(bào)錯?
}?
只能在構(gòu)造函數(shù)的初始化列表里初始化:?
A::A(int a):bb(a),其中bb的聲明為 const int bb;?
2、static修飾的類成員變量,既不能在類定義中初始化,也不能在初始化列表里初始化,只能在外頭?
int foo::a=100;?
3、static const也是在類外初始化
8、C++中,new和malloc的區(qū)別
new是c++的操作符,malloc是c中的函數(shù)?
new可以調(diào)用構(gòu)造函數(shù) delete調(diào)用析構(gòu)函數(shù)?
malloc只是單純的分配內(nèi)存,不會初始化成員
9、關(guān)于C++ 多態(tài)和函數(shù)表的關(guān)系
多態(tài)的定義:一個接口,多種方法?
多態(tài)和非多態(tài)的區(qū)別,可以理解為靜態(tài)編譯(重載)和動態(tài)編譯(虛函數(shù))?
多態(tài)是通過虛函數(shù)表來實(shí)現(xiàn)的,重載在編譯時(shí)就確定了函數(shù)的地址,虛函數(shù)的運(yùn)行地址只能在運(yùn)行過程中才能確定
10、C++虛函數(shù)與構(gòu)造、析構(gòu)函數(shù)的關(guān)系
1、構(gòu)造函數(shù)不能使虛的?
理由:存在虛函數(shù)的話,會存在虛函數(shù)表vtable,構(gòu)建的對象會有一個vptr指向虛函數(shù)表,所以不能把構(gòu)造函數(shù)放虛函數(shù)里?
2、析構(gòu)函數(shù)一般都是虛的?
如果是實(shí)的,那么當(dāng)有一個基類指針指向派生類,那么析構(gòu)時(shí)只會析構(gòu)基類的成員,造成派生類的成員沒有正確釋放?
只有是虛的,才會先在虛函數(shù)表中找到派生類,再找基類
如果類中有虛函數(shù),不管有多少個,它派生出來的對象大小都會多4字節(jié),是vptr:指向虛函數(shù)表的指針
11、C++ 構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、賦值函數(shù)
1、構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)?
特點(diǎn)都是“無中生有”?
A a——通過默認(rèn)構(gòu)造函數(shù)創(chuàng)建一個對象?
2、拷貝構(gòu)造函數(shù)?
用一個類的對象去初始化另一個對象時(shí):?
A b=a;?
A b(a);?
都使用的拷貝構(gòu)造函數(shù)?
淺拷貝:復(fù)制一個指針,指向同一個地址空間?
深拷貝:在內(nèi)存中開辟新的空間,兩個對象獨(dú)立?
拷貝構(gòu)造函數(shù)的聲明:?
A(const A& a)
賦值運(yùn)算函數(shù):?
A& operator=(const A& a)
Linux技術(shù)?
1、epoll和select?
當(dāng)一個程序要讀兩個以上IO時(shí),如果使用阻塞式IO,那么一個文件描述符阻塞,另一個文件描述符有數(shù)據(jù)卻讀不出來,效率很低。?
解決方案有以下幾個:?
1、開一個描述符就起一個線程,維護(hù)起來比較復(fù)雜?
2、用非阻塞IO,得一直輪詢?
3、用異步IO,通過信號量或者回調(diào)觸發(fā)?
4、IO多路復(fù)用(epoll和select)
總結(jié)
以上是生活随笔為你收集整理的C++基础知识简答题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c/c++整理--析构函数
- 下一篇: HOOK大神用c++制作绝地求生自瞄物品