不卡AV在线|网页在线观看无码高清|亚洲国产亚洲国产|国产伦精品一区二区三区免费视频

學(xué)習(xí)啦 > 創(chuàng)業(yè)指南 > 職場(chǎng) > 筆試題 > c++面向?qū)ο蟮墓P試題

c++面向?qū)ο蟮墓P試題

時(shí)間: 護(hù)托1061 分享

c++面向?qū)ο蟮墓P試題

  C++由于過(guò)度的復(fù)雜性,以及與unix的文化相抵觸,在unix/linux領(lǐng)域受到很多著名人士(比如Linux之父linus torvalds與著名黑客Eric S. Raymond)的強(qiáng)烈批評(píng)與抵制。下面就由學(xué)習(xí)啦小編為大家介紹一下 c++面向?qū)ο蟮墓P試題的文章,歡迎閱讀。

  c++面向?qū)ο蟮墓P試題篇1

  1. 重載(overload)和重寫(xiě)(overried,有的書(shū)也叫做“覆蓋”)的區(qū)別?

  ??嫉念}目。從定義上來(lái)說(shuō):

  重載:是指允許存在多個(gè)同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個(gè)數(shù)不同,或許參數(shù)類(lèi)型不同,或許兩者都不同)。

  重寫(xiě):是指子類(lèi)重新定義父類(lèi)虛函數(shù)的方法。

  從實(shí)現(xiàn)原理上來(lái)說(shuō):

  重載:編譯器根據(jù)函數(shù)不同的參數(shù)表,對(duì)同名函數(shù)的名稱(chēng)做修飾,然后這些同名函數(shù)就成了不同的函數(shù)(至少對(duì)于編譯器來(lái)說(shuō)是這樣的)。如,有兩個(gè)同名函數(shù):function func(p:integer):integer;和function func(p:string):integer;。那么編譯器做過(guò)修飾后的函數(shù)名稱(chēng)可能是這樣的:int_func、str_func。對(duì)于這兩個(gè)函數(shù)的調(diào)用,在編譯期間就已經(jīng)確定了,是靜態(tài)的。也就是說(shuō),它們的地址在編譯期就綁定了(早綁定),因此,重載和多態(tài)無(wú)關(guān)!

  重寫(xiě):和多態(tài)真正相關(guān)。當(dāng)子類(lèi)重新定義了父類(lèi)的虛函數(shù)后,父類(lèi)指針根據(jù)賦給它的不同的子類(lèi)指針,動(dòng)態(tài)的調(diào)用屬于子類(lèi)的該函數(shù),這樣的函數(shù)調(diào)用在編譯期間是無(wú)法確定的(因?yàn)橹皇前炎宇?lèi)的指針賦值給父類(lèi)指針,在編譯期間沒(méi)法根據(jù)父類(lèi)指針知道具體是什么類(lèi)型的子類(lèi),調(diào)用的子類(lèi)的虛函數(shù)的地址無(wú)法給出)。因此,這樣的函數(shù)地址是在運(yùn)行期綁定的(晚綁定)。

  2.類(lèi)成員函數(shù)的重載、覆蓋和隱藏區(qū)別

  答案:

  成員函數(shù)被重載的特征:

  (1)相同的范圍(在同一個(gè)類(lèi)中);

  (2)函數(shù)名字相同;

  (3)參數(shù)不同;

  (4)virtual關(guān)鍵字可有可無(wú)。

  覆蓋是指派生類(lèi)函數(shù)覆蓋基類(lèi)函數(shù),特征是:

  (1)不同的范圍(分別位于派生類(lèi)與基類(lèi));

  (2)函數(shù)名字相同;

  (3)參數(shù)相同;

  (4)基類(lèi)函數(shù)必須有virtual關(guān)鍵字。

  “隱藏”是指派生類(lèi)的函數(shù)屏蔽了與其同名的基類(lèi)函數(shù),規(guī)則如下:

  (1)如果派生類(lèi)的函數(shù)與基類(lèi)的函數(shù)同名,但是參數(shù)不同。此時(shí),不論有無(wú)virtual關(guān)鍵字,基類(lèi)的函數(shù)將被隱藏(注意別與重載混淆)。

  (2)如果派生類(lèi)的函數(shù)與基類(lèi)的函數(shù)同名,并且參數(shù)也相同,但是基類(lèi)函數(shù)沒(méi)有virtual關(guān)鍵字。此時(shí),基類(lèi)的函數(shù)被隱藏(注意別與覆蓋混淆)

  c++面向?qū)ο蟮墓P試題篇2

  1. 多態(tài)的作用?

  主要是兩個(gè):

  1.隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼能夠模塊化;擴(kuò)展代碼模塊,實(shí)現(xiàn)代碼重用;

  2.接口重用:為了類(lèi)在繼承和派生的時(shí)候,保證使用家族中任一類(lèi)的實(shí)例的某一屬性時(shí)的正確調(diào)用。

  2. Ado與Ado.NET的相同與不同?

  除了“能夠讓?xiě)?yīng)用程序處理存儲(chǔ)于DBMS 中的數(shù)據(jù)“這一基本相似點(diǎn)外,兩者沒(méi)有太多共同之處。但是Ado使用OLE DB 接口并基于微軟的COM 技術(shù),而ADO.Net 擁有自己的ADO.NET 接口并且基于微軟的.NET 體系架構(gòu)。眾所周知.NET 體系不同于COM 體系,ADO.NET 接口也就完全不同于ADO和OLE DB 接口,這也就是說(shuō)ADO.NET和ADO是兩種數(shù)據(jù)訪問(wèn)方式。ADO.net 提供對(duì)XML 的支持。

  3. New delete與malloc free的聯(lián)系與區(qū)別?

  答案:都是在堆(heap)上進(jìn)行動(dòng)態(tài)的內(nèi)存操作。用malloc函數(shù)需要指定內(nèi)存分配的字節(jié)數(shù)并且不能初始化對(duì)象,new 會(huì)自動(dòng)調(diào)用對(duì)象的構(gòu)造函數(shù)。delete 會(huì)調(diào)用對(duì)象的destructor,而free 不會(huì)調(diào)用對(duì)象的destructor.

  4. #defineDOUBLE(x) x+x,i = 5*DOUBLE(5); i 是多少?

  答案:i 為30。宏定義展開(kāi),5 * 5 + 5.

  5. 有哪幾種情況只能用initialize list而不能用assignment?

  答案:當(dāng)類(lèi)中含有const、reference成員變量(因?yàn)檫@些只能在定義的時(shí)候賦值,后面不能修改);基類(lèi)的構(gòu)造函數(shù)都需要初始化表。

  6 C++是不是類(lèi)型安全的?

  答案:不是。兩個(gè)不同類(lèi)型的指針之間可以強(qiáng)制轉(zhuǎn)換(用reinterpret cast)。C#是類(lèi)型安全的。

  7. main函數(shù)執(zhí)行以前,還會(huì)執(zhí)行什么代碼?

  答案:全局對(duì)象的構(gòu)造函數(shù)會(huì)在main 函數(shù)之前執(zhí)行。

  8. 描述內(nèi)存分配方式以及它們的區(qū)別?

  1) 從靜態(tài)存儲(chǔ)區(qū)域分配。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。例如全局變量,static 變量。

  2) 在棧上創(chuàng)建。在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集。

  3) 從堆上分配,亦稱(chēng)動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用malloc 或new 申請(qǐng)任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時(shí)用free 或delete 釋放內(nèi)存。動(dòng)態(tài)內(nèi)存的生存期由程序員決定,使用非常靈活,但問(wèn)題也最多。

  9.struct 和 class的區(qū)別

  答案:struct 的成員默認(rèn)是公有的,而類(lèi)的成員默認(rèn)是私有的。struct 和 class 在其他方面是功能相當(dāng)?shù)摹?/p>

  從感情上講,大多數(shù)的開(kāi)發(fā)者感到類(lèi)和結(jié)構(gòu)有很大的差別。感覺(jué)上結(jié)構(gòu)僅僅象一堆缺乏封裝和功能的開(kāi)放的內(nèi)存位,而類(lèi)就象活的并且可靠的社會(huì)成員,它有智能服務(wù),有牢固的封裝屏障和一個(gè)良好定義的接口。既然大多數(shù)人都這么認(rèn)為,那么只有在你的類(lèi)有很少的方法并且有公有數(shù)據(jù)(這種事情在良好設(shè)計(jì)的系統(tǒng)中是存在的!)時(shí),你也許應(yīng)該使用 struct 關(guān)鍵字,否則,你應(yīng)該使用 class 關(guān)鍵字。

  10.當(dāng)一個(gè)類(lèi)A中沒(méi)有生命任何成員變量與成員函數(shù),這時(shí)sizeof(A)的值是多少,如果不是零,請(qǐng)解釋一下編譯器為什么沒(méi)有讓它為零。(Autodesk)

  答案:肯定不是零。舉個(gè)反例,如果是零的話,聲明一個(gè)class A[10]對(duì)象數(shù)組,而每一個(gè)對(duì)象占用的空間是零,這時(shí)就沒(méi)辦法區(qū)分A[0],A[1]…了。

  c++面向?qū)ο蟮墓P試題篇3

  1. 在8086匯編下,邏輯地址和物理地址是怎樣轉(zhuǎn)換的?(Intel)

  答案:通用寄存器給出的地址,是段內(nèi)偏移地址,相應(yīng)段寄存器地址*10H+通用寄存器內(nèi)地址,就得到了真正要訪問(wèn)的地址。

  2. 比較C++中的4種類(lèi)型轉(zhuǎn)換方式?

  請(qǐng)參考:http://blog.bioon.com/user1/8688/archives/2006/45399.shtml,重點(diǎn)是static_cast, dynamic_cast和reinterpret_cast的區(qū)別和應(yīng)用。

  一、C 風(fēng)格(C-style)強(qiáng)制轉(zhuǎn)型如下:

  (T) expression // cast expression to be of type T

  函數(shù)風(fēng)格(Function-style)強(qiáng)制轉(zhuǎn)型使用這樣的語(yǔ)法:

  T(expression) // cast expression to be of type T

  這兩種形式之間沒(méi)有本質(zhì)上的不同,它純粹就是一個(gè)把括號(hào)放在哪的問(wèn)題。我把這兩種形式稱(chēng)為舊風(fēng)格(old-style)的強(qiáng)制轉(zhuǎn)型。

  二、 C++的四種強(qiáng)制轉(zhuǎn)型形式:

  C++ 同時(shí)提供了四種新的強(qiáng)制轉(zhuǎn)型形式(通常稱(chēng)為新風(fēng)格的或 C++ 風(fēng)格的強(qiáng)制轉(zhuǎn)型):

  const_cast(expression)

  dynamic_cast(expression)

  reinterpret_cast(expression)

  static_cast(expression)

  每一種適用于特定的目的:

  dynamic_cast 主要用于執(zhí)行“安全的向下轉(zhuǎn)型(safe downcasting)”,也就是說(shuō),要確定一個(gè)對(duì)象是否是一個(gè)繼承體系中的一個(gè)特定類(lèi)型。它是唯一不能用舊風(fēng)格語(yǔ)法執(zhí)行的強(qiáng)制轉(zhuǎn)型,也是唯一可能有重大運(yùn)行時(shí)代價(jià)的強(qiáng)制轉(zhuǎn)型。

  static_cast 可以被用于強(qiáng)制隱型轉(zhuǎn)換(例如,non-const 對(duì)象轉(zhuǎn)型為 const 對(duì)象,int 轉(zhuǎn)型為 double,等等),它還可以用于很多這樣的轉(zhuǎn)換的反向轉(zhuǎn)換(例如,void* 指針轉(zhuǎn)型為有類(lèi)型指針,基類(lèi)指針轉(zhuǎn)型為派生類(lèi)指針),但是它不能將一個(gè)const 對(duì)象轉(zhuǎn)型為 non-const 對(duì)象(只有const_cast 能做到),它最接近于C-style的轉(zhuǎn)換。

  const_cast 一般用于強(qiáng)制消除對(duì)象的常量性。它是唯一能做到這一點(diǎn)的 C++ 風(fēng)格的強(qiáng)制轉(zhuǎn)型。

  reinterpret_cast 是特意用于底層的強(qiáng)制轉(zhuǎn)型,導(dǎo)致實(shí)現(xiàn)依賴(lài)(implementation-dependent)(就是說(shuō),不可移植)的結(jié)果,例如,將一個(gè)指針轉(zhuǎn)型為一個(gè)整數(shù)。這樣的強(qiáng)制轉(zhuǎn)型在底層代碼以外應(yīng)該極為罕見(jiàn)。

  舊風(fēng)格的強(qiáng)制轉(zhuǎn)型依然合法,但是新的形式更可取。首先,在代碼中它們更容易識(shí)別(無(wú)論是人還是像 grep 這樣的工具都是如此),這樣就簡(jiǎn)化了在代碼中尋找類(lèi)型系統(tǒng)被破壞的地方的過(guò)程。第二,更精確地指定每一個(gè)強(qiáng)制轉(zhuǎn)型的目的,使得編譯器診斷使用錯(cuò)誤成為可能。例如,如果你試圖使用一個(gè) const_cast 以外的新風(fēng)格強(qiáng)制轉(zhuǎn)型來(lái)消除常量性,你的代碼將無(wú)法編譯。

  ==

  == dynamic_cast .vs. static_cast

  ==

  classB { ... };

  class D : public B { ... };

  voidf(B* pb)

  {

  D* pd1 = dynamic_cast(pb);

  D* pd2 = static_cast(pb);

  }

  If pb really points to an object of type D, then pd1 and pd2 will get the same value.They will also get the same value if pb == 0.

  If pb points to an object of type B and not to the complete D class, then dynamic_cast will know enough to return zero. However, static_cast relies on the programmer’s assertion that pb points to an object of type D and simply returns a pointer to that supposed D object.

  即dynamic_cast可用于繼承體系中的向下轉(zhuǎn)型,即將基類(lèi)指針轉(zhuǎn)換為派生類(lèi)指針,比static_cast更嚴(yán)格更安全。dynamic_cast在執(zhí)行效率上比static_cast要差一些,但static_cast在更寬上范圍內(nèi)可以完成映射,這種不加限制的映射伴隨著不安全性.static_cast覆蓋的變換類(lèi)型除類(lèi)層次的靜態(tài)導(dǎo)航以外,還包括無(wú)映射變換,窄化變換(這種變換會(huì)導(dǎo)致對(duì)象切片,丟失信息),用VOID*的強(qiáng)制變換,隱式類(lèi)型變換等...

  ==

  == static_cast .vs. reinterpret_cast

  ==

  reinterpret_cast是為了映射到一個(gè)完全不同類(lèi)型的意思,這個(gè)關(guān)鍵詞在我們需要把類(lèi)型映射回原有類(lèi)型時(shí)用到它.我們映射到的類(lèi)型僅僅是為了故弄玄虛和其他目的,這是所有映射中最危險(xiǎn)的.(這句話是C++編程思想中的原話)

  static_cast 和reinterpret_cast 操作符修改了操作數(shù)類(lèi)型. 它們不是互逆的; static_cast 在編譯時(shí)使用類(lèi)型信息執(zhí)行轉(zhuǎn)換, 在轉(zhuǎn)換執(zhí)行必要的檢測(cè)(諸如指針越界計(jì)算, 類(lèi)型檢查). 其操作數(shù)相對(duì)是安全的. 另一方面,reinterpret_cast 僅僅是重新解釋了給出的對(duì)象的比特模型而沒(méi)有進(jìn)行二進(jìn)制轉(zhuǎn)換, 例子如下:

  int n=9; double d=static_cast < double > (n);

  上面的例子中, 我們將一個(gè)變量從 int 轉(zhuǎn)換到 double. 這些類(lèi)型的二進(jìn)制表達(dá)式是不同的. 要將整數(shù) 9 轉(zhuǎn)換到 雙精度整數(shù)9, static_cast 需要正確地為雙精度整數(shù) d 補(bǔ)足比特位. 其結(jié)果為 9.0. 而reinterpret_cast的行為卻不同:

  int n=9;

  double d=reinterpret_cast (n);

  這次, 結(jié)果有所不同. 在進(jìn)行計(jì)算以后, d 包含無(wú)用值. 這是因?yàn)?reinterpret_cast 僅僅是復(fù)制 n 的比特位到 d, 沒(méi)有進(jìn)行必要的分析。

3168905