亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

c++面試注意點

時間:2022-04-17 04:33:01 招聘與面試 我要投稿
  • 相關(guān)推薦

c++面試注意點

c++面試注意點

c++面試注意點

     (1)什么是內(nèi)聯(lián)函數(shù)?

內(nèi)聯(lián)函數(shù)是指那些定義在類體內(nèi)的成員函數(shù),即該函數(shù)的函數(shù)體放在類體內(nèi)。

(2)為什么要引入內(nèi)聯(lián)函數(shù)?

當然,引入內(nèi)聯(lián)函數(shù)的主要目的是:解決程序中函數(shù)調(diào)用的效率問題。

另外,前面我們講到了宏,里面有這么一個例子: 

#define ABS(x) ((x)>0? (x):-(x))

當++i出現(xiàn)時,宏就會歪曲我們的意思,換句話說就是:宏的定義很容易產(chǎn)生二意性。我們可以看到宏有一些難以避免的問題,怎么解決呢?前面我們已經(jīng)盡力替換了。

下面我們用內(nèi)聯(lián)函數(shù)來解決這些問題。

(3)為什么inline能取代宏?

1、 inline 定義的類的內(nèi)聯(lián)函數(shù),函數(shù)的代碼被放入符號表中,在使用時直接進行替換,(像宏一樣展開),沒有了調(diào)用的開銷,效率也很高。

2、 很明顯,類的內(nèi)聯(lián)函數(shù)也是一個真正的函數(shù),編譯器在調(diào)用一個內(nèi)聯(lián)函數(shù)時,會首先檢查它的參數(shù)的類型,保證調(diào)用正確。然后進行一系列的相關(guān)檢查,就像對待任何一個真正的函數(shù)一樣。這樣就消除了它的隱患和局限性。

3、 inline 可以作為某個類的成員函數(shù),當然就可以在其中使用所在類的保護成員及私有成員。

(4)內(nèi)聯(lián)函數(shù)和宏的區(qū)別?

內(nèi)聯(lián)函數(shù)和宏的區(qū)別在于,宏是由預處理器對宏進行替代,而內(nèi)聯(lián)函數(shù)是通過編譯器控制來實現(xiàn)的。而且內(nèi)聯(lián)函數(shù)是真正的函數(shù),只是在需要用到的時候,內(nèi)聯(lián)函數(shù)像宏一樣的展開,所以取消了函數(shù)的參數(shù)壓棧,減少了調(diào)用的開銷。你可以象調(diào)用函數(shù)一樣來調(diào)用內(nèi)聯(lián)函數(shù),而不必擔心會產(chǎn)生于處理宏的一些問題。

內(nèi)聯(lián)函數(shù)與帶參數(shù)的宏定義進行下比較,它們的代碼效率是一樣,但是內(nèi)聯(lián)函數(shù)要優(yōu)于宏定義,因為內(nèi)聯(lián)函數(shù)遵循的類型和作用域規(guī)則,它與一般函數(shù)更相近,在一些編譯器中,一旦關(guān)上內(nèi)聯(lián)擴展,將與一般函數(shù)一樣進行調(diào)用,比較方便。 

(5)什么時候用內(nèi)聯(lián)函數(shù)?

內(nèi)聯(lián)函數(shù)在C++類中,應用最廣的,應該是用來定義存取函數(shù)。我們定義的類中一般會把數(shù)據(jù)成員定義成私有的或者保護的,這樣,外界就不能直接讀寫我們類成員的數(shù)據(jù)了。對于私有或者保護成員的讀寫就必須使用成員接口函數(shù)來進行。如果我們把這些讀寫成員函數(shù)定義成內(nèi)聯(lián)函數(shù)的話,將會獲得比較好的效率。

(6)如何使用內(nèi)聯(lián)函數(shù)?

我們可以用inline來定義內(nèi)聯(lián)函數(shù)。

inline int A (int x) { return 2*x; }

不過,任何在類的說明部分定義的函數(shù)都會被自動的認為是內(nèi)聯(lián)函數(shù)。

(7)內(nèi)聯(lián)函數(shù)的優(yōu)缺點?

我們可以把它作為一般的函數(shù)一樣調(diào)用,但是由于內(nèi)聯(lián)函數(shù)在需要的時候,會像宏一樣展開,所以執(zhí)行速度確比一般函數(shù)的執(zhí)行速度要快。

當然,內(nèi)聯(lián)函數(shù)也有一定的局限性。就是函數(shù)中的執(zhí)行代碼不能太多了,如果,內(nèi)聯(lián)函數(shù)的函數(shù)體過大,一般的編譯器會放棄內(nèi)聯(lián)方式,而采用普通的方式調(diào)用函數(shù)。(換句話說就是,你使用內(nèi)聯(lián)函數(shù),只不過是向編譯器提出一個申請,編譯器可以拒絕你的申請)這樣,內(nèi)聯(lián)函數(shù)就和普通函數(shù)執(zhí)行效率一樣了。

(8)如何禁止函數(shù)進行內(nèi)聯(lián)?

如果使用VC++,可以使用/Ob命令行參數(shù)。當然,也可以在程序中使用 #pragma auto_inline達到相同的目的。

(9)注意事項:

1.在內(nèi)聯(lián)函數(shù)內(nèi)不允許用循環(huán)語句和開關(guān)語句。

2.內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前。 

static 是c++中很常用的修飾符,它被用來控制變量的存儲方式和可見性,下面我將從 static 修飾符的產(chǎn)生原因、作用談起,全面分析static 修飾符的實質(zhì)。 

static 的兩大作用:

一、控制存儲方式:

static被引入以告知編譯器,將變量存儲在程序的靜態(tài)存儲區(qū)而非棧上空間。

1、引出原因:函數(shù)內(nèi)部定義的變量,在程序執(zhí)行到它的定義處時,編譯器為它在棧上分配空間,大家知道,函數(shù)在棧上分配的空間在此函數(shù)執(zhí)行結(jié)束時會釋放掉,這樣就產(chǎn)生了一個問題: 如果想將函數(shù)中此變量的值保存至下一次調(diào)用時,如何實現(xiàn)? 

最容易想到的方法是定義一個全局的變量,但定義為一個全局變量有許多缺點,最明顯的缺點是破壞了此變量的訪問范圍(使得在此函數(shù)中定義的變量,不僅僅受此函數(shù)控制)。

2、 解決方案:因此c++ 中引入了static,用它來修飾變量,它能夠指示編譯器將此變量在程序的靜態(tài)存儲區(qū)分配空間保存,這樣即實現(xiàn)了目的,又使得此變量的存取范圍不變。

二、控制可見性與連接類型 :

static還有一個作用,它會把變量的可見范圍限制在編譯單元中,使它成為一個內(nèi)部連接,這時,它的反義詞為”extern”.

static作用分析總結(jié):static總是使得變量或?qū)ο蟮拇鎯π问阶兂伸o態(tài)存儲,連接方式變成內(nèi)部連接,對于局部變量(已經(jīng)是內(nèi)部連接了),它僅改變其存儲方式;對于全局變量(已經(jīng)是靜態(tài)存儲了),它僅改變其連接類型。

類中的static成員:

一、出現(xiàn)原因及作用:

1、需要在一個類的各個對象間交互,即需要一個數(shù)據(jù)對象為整個類而非某個對象服務(wù)。

2、同時又力求不破壞類的封裝性,即要求此成員隱藏在類的內(nèi)部,對外不可見。

類的static成員滿足了上述的要求,因為它具有如下特征:有獨立的存儲區(qū),屬于整個類。

二、注意:

1、對于靜態(tài)的數(shù)據(jù)成員,連接器會保證它擁有一個單一的外部定義。靜態(tài)數(shù)據(jù)成員按定義出現(xiàn)的先后順序依次初始化,注意靜態(tài)成員嵌套時,要保證所嵌套的成員已經(jīng)初始化了。消除時的順序是初始化的反順序。

2、類的靜態(tài)成員函數(shù)是屬于整個類而非類的對象,所以它沒有this指針,這就導致了它僅能訪問類的靜態(tài)數(shù)據(jù)和靜態(tài)成員函數(shù)。

---------------------------------------------------

const 是c++中常用的類型修飾符,但我在工作中發(fā)現(xiàn),許多人使用它僅僅是想當然爾,這樣,有時也會用對,但在某些微妙的場合,可就沒那么幸運了,究其實質(zhì)原由,大多因為沒有搞清本源。故在本篇中我將對const進行辨析。溯其本源,究其實質(zhì),希望能對大家理解const有所幫助,根據(jù)思維的承接關(guān)系,分為如下幾個部分進行闡述。

C++中為什么會引入const

c++的提出者當初是基于什么樣的目的引入(或者說保留)const關(guān)鍵字呢?,這是一個有趣又有益的話題,對理解const很有幫助。

1. 大家知道,c++有一個類型嚴格的編譯系統(tǒng),這使得c++程序的錯誤在編譯階段即可發(fā)現(xiàn)許多,從而使得出錯率大為減少,因此,也成為了c++與c相比,有著突出優(yōu)點的一個方面。

2. c中很常見的預處理指令 #define variablename variablevalue 可以很方便地進行值替代,這種值替代至少在三個方面優(yōu)點突出:

一是避免了意義模糊的數(shù)字出現(xiàn),使得程序語義流暢清晰,如下例:

#define user_num_max 107 這樣就避免了直接使用107帶來的困惑。

二是可以很方便地進行參數(shù)的調(diào)整與修改,如上例,當人數(shù)由107變?yōu)?01時,進改動此處即可, 

三是提高了程序的執(zhí)行效率,由于使用了預編譯器進行值替代,并不需要為這些常量分配存儲空間,所以執(zhí)行的效率較高。

鑒于以上的優(yōu)點,這種預定義指令的使用在程序中隨處可見。

3. 說到這里,大家可能會迷惑上述的1點、2點與const有什么關(guān)系呢?,好,請接著向下看:

預處理語句雖然有以上的許多優(yōu)點,但它有個比較致命的缺點,即,預處理語句僅僅只是簡單值替代,缺乏類型的檢測機制。這樣預處理語句就不能享受c++嚴格類型檢查的好處,從而可能成為引發(fā)一系列錯誤的隱患。

4.好了,第一階段結(jié)論出來了:

結(jié)論: const 推出的初始目的,正是為了取代預編譯指令,消除它的缺點,同時繼承它的優(yōu)點。

在它的形式變成了:

const datatype variablename = variablevalue ;

為什么const能很好地取代預定義語句? 

const 到底有什么大神通,使它可以振臂一揮取代預定義語句呢?

1. 首先,以const 修飾的常量值,具有不可變性,這是它能取代預定義語句的基礎(chǔ)。

2. 第二,很明顯,它也同樣可以避免意義模糊的數(shù)字出現(xiàn),同樣可以很方便地進行參數(shù)的調(diào)整和修改。

3. 第三,c++的編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內(nèi)存的操作,使得它的效率也很高,這也是它取代預定義語句的重要基礎(chǔ)。這里,我要提一下,為什么說這一點是也是它能取代預定義語句的基礎(chǔ),這是因為,編譯器不會去讀存儲的內(nèi)容,如果編譯器為const分配了存儲空間,它就不能夠成為一個編譯期間的常量了。

4. 最后,const定義也像一個普通的變量定義一樣,它會由編譯器對它進行類型的檢測,消除了預定義語句的隱患。

【c++面試注意點】相關(guān)文章:

面試的注意事項05-19

面試要注意的技巧05-18

面試應注意的技巧05-18

面試流程 面試技巧及注意事項05-01

參加面試的注意事項及面試技巧05-01

和客戶吃飯需要注意的五點注意事項06-10

面試注意事項11-04

面試禮儀注意事項10-19

面試需要注意的禮儀05-21

面試注意事項05-06