這篇文章主要介紹了C++的相關(guān)面試題有哪些,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、松江網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站、商城系統(tǒng)網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為松江等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
C++面試題精髓
1.、為什么構(gòu)造函數(shù)不能聲明為虛函數(shù)?
解析:因?yàn)樘摵瘮?shù)采用的是虛調(diào)用的方法,虛調(diào)用是指允許在只知道部分信息的情況下
的工作機(jī)制,特別允許我們調(diào)用一個(gè)只知道接口而不知道其對(duì)象的準(zhǔn)確類型的函數(shù)。
但是如果我們要調(diào)用構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),必須要知道對(duì)象的準(zhǔn)確類型,
因此構(gòu)造函數(shù)不能為虛函數(shù)。
2.C++中哪些函數(shù)不能被聲明為虛函數(shù)?
解析:普通函數(shù)(非成員函數(shù)),構(gòu)造函數(shù),內(nèi)聯(lián)成員函數(shù)、靜態(tài)成員函數(shù)、友元函數(shù)。
(1)虛函數(shù)用于基類和派生類,普通函數(shù)所以不能
(2)構(gòu)造函數(shù)不能是因?yàn)樘摵瘮?shù)采用的是虛調(diào)用的方法,
(3)內(nèi)聯(lián)成員函數(shù)的實(shí)質(zhì)是在調(diào)用的地方直接將代碼擴(kuò)展開
(4)繼承時(shí),靜態(tài)成員函數(shù)不能被繼承的,它只屬于一個(gè)類,因?yàn)橐膊淮嬖趧?dòng)態(tài)聯(lián)編
(5)友元函數(shù)不是類的成員函數(shù),因此也不能被繼承
3.類的靜態(tài)成員和非靜態(tài)成員有何區(qū)別?
答:類的靜態(tài)成員每個(gè)類只有一個(gè),靜態(tài)成員為所有類的實(shí)例對(duì)象共享,靜態(tài)成員有靜態(tài)成員變量和靜態(tài)成員函數(shù),靜態(tài)成員變量使用前必須初始化,靜態(tài)成員變量可以被靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)訪問,而靜態(tài)成員函數(shù)只能訪問靜態(tài)成員變量,因?yàn)殪o態(tài)成員函數(shù)屬于類,其沒有this指針。非靜態(tài)成員每個(gè)對(duì)象都有一個(gè)。
4 重載(overload)和重寫(overried,有的書也叫做“覆蓋”)的區(qū)別?
重載:是指允許存在多個(gè)同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個(gè)數(shù)不同,或許參數(shù)類型不同,或許兩者都不同)。 重寫:是指子類重新定義復(fù)類虛函數(shù)的方法。 從實(shí)現(xiàn)原理上來說:重載:編譯器根據(jù)函數(shù)不同的參數(shù)表,對(duì)同名函數(shù)的名稱做修飾,然后這些同名函數(shù)就成了不同的函數(shù)(至少對(duì)于編譯器來說是這樣的)。如,有兩個(gè)同名函數(shù):function func(p:integer):integer;和function func(p:string):integer;。那么編譯器做過修飾后的函數(shù)名稱可能是這樣的:int_func、str_func.對(duì)于這兩個(gè)函數(shù)的調(diào)用,在編譯器間就已經(jīng)確定了,是靜態(tài)的。也就是說,它們的地址在編譯期就綁定了(早綁定),因此,重載和多態(tài)無關(guān)! 重寫:和多態(tài)真正相關(guān)。當(dāng)子類重新定義了父類的虛函數(shù)后,父類指針根據(jù)賦給它的不同的子類指針,動(dòng)態(tài)的調(diào)用屬于子類的該函數(shù),這樣的函數(shù)調(diào)用在編譯期間是無法確定的(調(diào)用的子類的虛函數(shù)的地址無法給出)。因此,這樣的函數(shù)地址是在運(yùn)行期綁定的(晚綁定)
5 簡述成員函數(shù)、全局函數(shù)和友元函數(shù)的差別。
成員函數(shù)只能由該類所實(shí)例化的對(duì)象來進(jìn)行調(diào)用。[靜態(tài)成員除外]
全局函數(shù)可以在任意位置進(jìn)行調(diào)用。
友元函數(shù)可以讓本類和友元類對(duì)象調(diào)用。
用new分配的內(nèi)存用delete刪除用new[]分配的內(nèi)存用delete[]刪除delete[]會(huì)調(diào)用數(shù)組元素的析構(gòu)函數(shù)。內(nèi)部數(shù)據(jù)類型沒有析構(gòu)函數(shù),所以問題不大。如果你在用delete時(shí)沒用括號(hào),delete就會(huì)認(rèn)為指向的是單個(gè)對(duì)象,否則,它就會(huì)認(rèn)為指向的是一個(gè)數(shù)組。
6.繼承的優(yōu)缺點(diǎn)。
類繼承是在編譯時(shí)刻靜態(tài)定義的,且可直接使用,類繼承可以較方便地改變父類的實(shí)現(xiàn)。但是類繼承也有一些不足之處。首先,因?yàn)槔^承在編譯時(shí)刻就定義了,所以無法在運(yùn)行時(shí)刻改變從父類繼承的實(shí)現(xiàn)。更糟的是,父類通常至少定義了子類的部分行為,父類的任何改變都可能影響子類的行為。如果繼承下來的實(shí)現(xiàn)不適合解決新的問題,則父類必須重寫或被其他更適合的類替換。這種依賴關(guān)系限制了靈活性并最終限制了復(fù)用性。 (待補(bǔ)充)
7.C++有哪些性質(zhì)(面向?qū)ο筇攸c(diǎn))
封裝,繼承和多態(tài)。
在面向?qū)ο蟪绦蛟O(shè)計(jì)語言中,封裝是利用可重用成分構(gòu)造軟件系統(tǒng)的特性,它不僅支持系統(tǒng)的可重用性,而且還有利于提高系統(tǒng)的可擴(kuò)充性;消息傳遞可以實(shí)現(xiàn)發(fā)送一個(gè)通用的消息而調(diào)用不同的方法;封裝是實(shí)現(xiàn)信息隱蔽的一種技術(shù),其目的是使類的定義和實(shí)現(xiàn)分離。
8. 在什么時(shí)候需要使用“常引用”?
如果既要利用引用提高程序的效率,又要保護(hù)傳遞給函數(shù)的數(shù)據(jù)不在函數(shù)中被改變,就 應(yīng)使用常引用。常引用聲明方式:const 類型標(biāo)識(shí)符 &引用名=目標(biāo)變量名;
int a
const int &ra=a;
ra=1; //錯(cuò)誤
a=1; //正確
例2 string foo( );
void bar(string & s);
那么下面的表達(dá)式將是非法的:
bar(foo( ));
bar("hello world");
原因在于foo( )和"hello world"串都會(huì)產(chǎn)生一個(gè)臨時(shí)對(duì)象,而在C++中,這些臨時(shí)對(duì)象都是const類型的。因此上面的表達(dá)式就是試圖將一個(gè)const類型的對(duì)象轉(zhuǎn)換為非const類型,這是非法的。引用型參數(shù)應(yīng)該在能被定義為const的情況下,盡量定義為const
9.ASSERT()是干什么用的
答:ASSERT()是一個(gè)調(diào)試程序時(shí)經(jīng)常使用的宏,在程序運(yùn)行時(shí)它計(jì)算括號(hào)內(nèi)的表達(dá)式,如果表達(dá)式為FALSE (0),
程序?qū)?bào)告錯(cuò)誤,并終止執(zhí)行。如果表達(dá)式不為0,則繼續(xù)執(zhí)行后面的語句。這個(gè)宏通常原來判斷程序中是否出現(xiàn)了明顯非法的數(shù)據(jù),如果出現(xiàn)了終止程序以免導(dǎo)致嚴(yán)重后果,同時(shí)也便于查找錯(cuò)誤。例如,變量n在程序中不應(yīng)該為0,如果為0可能導(dǎo)致錯(cuò)誤,
10.實(shí)現(xiàn)多態(tài)的方法?
解析: ① 一個(gè)基類的引用可以指向它的派生類實(shí)例
② 一個(gè)基類的指針可以指向它的派生類實(shí)例
11.面向?qū)ο蟮娜齻€(gè)基本特征,并簡單敘述之?
① 封裝:將客觀事物抽象成類,每個(gè)類對(duì)自身的數(shù)據(jù)和方法實(shí)行訪問控制(private, protected,public)
② 繼承:廣義的繼承有三種實(shí)現(xiàn)形式:
實(shí)現(xiàn)繼承(指使用基類的屬性和方法而無需額外編碼的能力)
可視繼承(子窗體使用父窗體的外觀和實(shí)現(xiàn)代碼)
接口繼承(僅使用屬性和方法,實(shí)現(xiàn)滯后到子類實(shí)現(xiàn))。
前兩種(類繼承)和后一種(對(duì)象組合=>接口繼承以及純虛函數(shù))構(gòu)成了功能復(fù)用的兩種方式。
③ 多態(tài):是將父對(duì)象設(shè)置成為和一個(gè)或更多的他的子對(duì)象相等的技術(shù),賦值之后,父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。
補(bǔ)充問題: 多態(tài)的作用?
主要是兩個(gè):
1. 隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼能夠模塊化;擴(kuò)展代碼模塊,實(shí)現(xiàn)代碼重用;
2. 接口重用:為了類在繼承和派生的時(shí)候,保證使用家族中任一類的實(shí)例的某一屬性時(shí)的正確調(diào)用。
12重載(overload)和重寫(overried,有的書也叫做“覆蓋”)的區(qū)別?
① 重載:是指允許存在多個(gè)同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個(gè)數(shù)不同,或許參數(shù)類型不同,或許兩者都不同)。
② 重寫:是指子類重新定義父類虛函數(shù)的方法。
從實(shí)現(xiàn)原理上來說:
① 重載:編譯器根據(jù)函數(shù)不同的參數(shù)表,對(duì)同名函數(shù)的名稱做修飾,然后這些同名函數(shù)就成了不同的函數(shù)(至少對(duì)于編譯器來說是這樣的)。對(duì)于這類函數(shù)的調(diào)用,在編譯期間就已經(jīng)確定了,是靜態(tài)的。也就是說,它們的地址在編譯期就綁定了(早綁定),因此,重載和多態(tài)無關(guān)!
② 重寫:和多態(tài)真正相關(guān)。當(dāng)子類重新定義了父類的虛函數(shù)后,父類指針根據(jù)賦給它的不同的子類指針,動(dòng)態(tài)的調(diào)用屬于子類的該函數(shù),這樣的函數(shù)調(diào)用在編譯期間是無法確定的(調(diào)用的子類的虛函數(shù)的地址無法給出)。因此,這樣的函數(shù)地址是在運(yùn)行期綁定的(晚綁定)
13多態(tài)的作用?
主要是兩個(gè):
① 隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼能夠模塊化;擴(kuò)展代碼模塊,實(shí)現(xiàn)代碼重用;
② 接口重用:為了類在繼承和派生的時(shí)候,保證使用家族中任一類的實(shí)例的某一屬性時(shí)的正確調(diào)用。
14、C++中的空類,默認(rèn)產(chǎn)生的類成員函數(shù):
class { public: Empty(); // 缺省構(gòu)造函數(shù) Empty(const Empty&); // 拷貝構(gòu)造函數(shù) ~Empty(); // 析構(gòu)函數(shù) Empty& operator=(const Empty&); // 賦值運(yùn)算符 Empty* operator&(); // 取值運(yùn)算符 const Empty* operator&() const; // 取值運(yùn)算符const };
15.進(jìn)程間通信的方式有?
進(jìn)程間通信的方式有 :共享內(nèi)存, 管道(有名管道/無名管道),Socket ,消息隊(duì)列 ,信號(hào),信號(hào)量,內(nèi)存映射等。
16死鎖的四個(gè)必要條件?
互斥,請(qǐng)求保持,不可剝奪,環(huán)路。
17、類的靜態(tài)成員和非靜態(tài)成員有什么區(qū)別?
類的靜態(tài)成員每個(gè)類只有一個(gè),即是屬于本類的;類的非靜態(tài)成員每個(gè)對(duì)象都有一份。
18什么是淺拷貝?什么是深拷貝?
淺拷貝是指源對(duì)象與拷貝對(duì)象共用一份實(shí)體,僅僅是引用的變量不同(名稱不同)。對(duì)其中任何一個(gè)對(duì)象的改動(dòng)都會(huì)影響另外一個(gè)對(duì)象。
深拷貝是指源對(duì)象與拷貝對(duì)象互相獨(dú)立,其中任何一個(gè)對(duì)象的改動(dòng)都不會(huì)對(duì)另外一個(gè)對(duì)象造成影響。
一般來說,淺拷貝就是復(fù)制那個(gè)對(duì)象的指針。深拷貝就是復(fù)制了那個(gè)對(duì)象。
19、Windows編程線程同步的幾種方式?(重要)
原子鎖、臨界區(qū)(段)、事件、互斥(體)、信號(hào)量、可等候定時(shí)器
20什么是“引用”?申明和使用“引用”要注意哪些問題?
答:引用就是某個(gè)目標(biāo)變量的“別名”(alias),對(duì)引用的操作與對(duì)變量直接操作效果完全相同。申明一個(gè)引用的時(shí)候,切記要對(duì)其進(jìn)行初始化。引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個(gè)名稱,即該目標(biāo)原名稱和引用名,不能再把該引用名作為其他變量名的別名。聲明一個(gè)引用,不是新定義了一個(gè)變量,它只表示該引用名是目標(biāo)變量名的一個(gè)別名,它本身不是一種數(shù)據(jù)類型,因此引用本身不占存儲(chǔ)單元,系統(tǒng)也不給引用分配存儲(chǔ)單元。不能建立數(shù)組的引用。
21. “引用”與指針的區(qū)別是什么?
指針通過某個(gè)指針變量指向一個(gè)對(duì)象后,對(duì)它所指向的變量間接操作。程序中使用指針,程序的可讀性差;而引用本身就是目標(biāo)變量的別名,對(duì)引用的操作就是對(duì)目標(biāo)變量的操作。此外,就是上面提到的對(duì)函數(shù)傳ref和pointer的區(qū)別。
22. 關(guān)聯(lián)、聚合(Aggregation)以及組合(Composition)的區(qū)別?
涉及到UML中的一些概念:關(guān)聯(lián)是表示兩個(gè)類的一般性聯(lián)系,比如“學(xué)生”和“老師”就是一種關(guān)聯(lián)關(guān)系;聚合表示has-a的關(guān)系,是一種相對(duì)松散的關(guān)系,聚合類不需要對(duì)被聚合類負(fù)責(zé),如下圖所示,用空的菱形表示聚合關(guān)系:
從實(shí)現(xiàn)的角度講,聚合可以表示為:
class A {...} class B { A* a; .....}
而組合表示contains-a的關(guān)系,關(guān)聯(lián)性強(qiáng)于聚合:組合類與被組合類有相同的生命周期,組合類要對(duì)被組合類負(fù)責(zé),采用實(shí)心的菱形表示組合關(guān)系:
實(shí)現(xiàn)的形式是:
class A{...} class B{ A a; ...}
23.面向?qū)ο蟮娜齻€(gè)基本特征,并簡單敘述之?
1. 封裝:將客觀事物抽象成類,每個(gè)類對(duì)自身的數(shù)據(jù)和方法實(shí)行protection(private, protected,public)
2. 繼承:廣義的繼承有三種實(shí)現(xiàn)形式:實(shí)現(xiàn)繼承(指使用基類的屬性和方法而無需額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀和實(shí)現(xiàn)代碼)、接口繼承(僅使用屬性和方法,實(shí)現(xiàn)滯后到子類實(shí)現(xiàn))。前兩種(類繼承)和后一種(對(duì)象組合=>接口繼承以及純虛函數(shù))構(gòu)成了功能復(fù)用的兩種方式。
3. 多態(tài):是將父對(duì)象設(shè)置成為和一個(gè)或更多的他的子對(duì)象相等的技術(shù),賦值之后,父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。
24多態(tài)的作用?
主要是兩個(gè):1. 隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼能夠模塊化;擴(kuò)展代碼模塊,實(shí)現(xiàn)代碼重用;2. 接口重用:為了類在繼承和派生的時(shí)候,保證使用家族中任一類的實(shí)例的某一屬性時(shí)的正確調(diào)用。
25在C++ 程序中調(diào)用被 C編譯器編譯后的函數(shù),為什么要加 extern “C”聲明?
//extern是C/C++語言中表明函數(shù)和全局變量作用范圍的關(guān)鍵字,該關(guān)鍵字告訴編譯器,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用
// extern “C是連接申明,編譯時(shí)告訴編譯器以下代碼用C風(fēng)格的方式編譯和連接,其目的是實(shí)現(xiàn)C++與C及其它語言的混合編程。
指針通過某個(gè)指針變量指向一個(gè)對(duì)象后,對(duì)它所指向的變量間接操作。程序中使用指針,程序的可讀性差;而引用本身就是目標(biāo)變量的別名,對(duì)引用的操作就是對(duì)目標(biāo)變量的操作。此外,就是上面提到的對(duì)函數(shù)傳ref和pointer的區(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.
24成員函數(shù)被重載的特征:
(1)相同的范圍(在同一個(gè)類中);
(2)函數(shù)名字相同;
(3)參數(shù)不同;
(4)virtual 關(guān)鍵字可有可無。
25覆蓋是指派生類函數(shù)覆蓋基類函數(shù),特征是:
(1)不同的范圍(分別位于派生類與基類);
(2)函數(shù)名字相同;
(3)參數(shù)相同;
(4)基類函數(shù)必須有virtual 關(guān)鍵字。
26如果用VC開發(fā)程序,常見這么幾個(gè)錯(cuò)誤,C2001,c2005,c2011,這些錯(cuò)誤的原因是什么。
在學(xué)習(xí)VC++的過程中,遇到的LNK2001錯(cuò)誤的錯(cuò)誤消息主要為:
unresolved external symbol “symbol”(不確定的外部“符號(hào)”)。
如果連接程序不能在所有的庫和目標(biāo)文件內(nèi)找到所引用的函數(shù)、變量或標(biāo)簽,將產(chǎn)生此錯(cuò)誤消息。
一般來說,發(fā)生錯(cuò)誤的原因有兩個(gè):一是所引用的函數(shù)、變量不存在、拼寫不正確或者使用錯(cuò)誤;
其次可能使用了不同版本的連接庫。
編程中經(jīng)常能遇到LNK2005錯(cuò)誤——重復(fù)定義錯(cuò)誤,其實(shí)LNK2005錯(cuò)誤并不是一個(gè)很難解決的錯(cuò)誤.
27介紹一下STL,詳細(xì)說明STL如何實(shí)現(xiàn)vector。
STL (標(biāo)準(zhǔn)模版庫,Standard Template Library)它由容器算法迭代器組成。
STL有以下的一些優(yōu)點(diǎn):
可以方便容易地實(shí)現(xiàn)搜索數(shù)據(jù)或?qū)?shù)據(jù)排序等一系列的算法;
調(diào)試程序時(shí)更加安全和方便;
即使是人們用STL在UNIX平臺(tái)下寫的代碼你也可以很容易地理解(因?yàn)镾TL是跨平臺(tái)的)。
vector實(shí)質(zhì)上就是一個(gè)動(dòng)態(tài)數(shù)組,會(huì)根據(jù)數(shù)據(jù)的增加,動(dòng)態(tài)的增加數(shù)組空間。
28介紹一下模板和容器。如何實(shí)現(xiàn)?(也許會(huì)讓你當(dāng)場舉例實(shí)現(xiàn))
模板可以說比較古老了,但是當(dāng)前的泛型編程實(shí)質(zhì)上就是模板編程。
它體現(xiàn)了一種通用和泛化的思想。
STL有7種主要容器:vector,list,deque,map,multimap,set,multiset.
29:簡述多態(tài)實(shí)現(xiàn)的原理
編譯器發(fā)現(xiàn)一個(gè)類中有虛函數(shù),便會(huì)立即為此類生成虛函數(shù)表 vtable。虛函數(shù)表的各表項(xiàng)為指向?qū)?yīng)虛函數(shù)的指針。編譯器還會(huì)在此類中隱含插入一個(gè)指針vptr(對(duì)vc編譯器來說,它插在類的第一個(gè)位置上)指向虛函數(shù)表。調(diào)用此類的構(gòu)造函數(shù)時(shí),在類的構(gòu)造函數(shù)中,編譯器會(huì)隱含執(zhí)行vptr與vtable的關(guān)聯(lián)代碼,將vptr指向?qū)?yīng)的vtable,將類與此類的vtable聯(lián)系了起來。另外在調(diào)用類的構(gòu)造函數(shù)時(shí),指向基礎(chǔ)類的指針此時(shí)已經(jīng)變成指向具體的類的this指針,這樣依靠此this指針即可得到正確的vtable,。如此才能真正與函數(shù)體進(jìn)行連接,這就是動(dòng)態(tài)聯(lián)編,實(shí)現(xiàn)多態(tài)的基本原理。
30:談?wù)勀銓?duì)面向?qū)ο蟮恼J(rèn)識(shí)
解析:面向?qū)ο罂梢岳斫獬蓪?duì)待每一個(gè)問題,都是首先要確定這個(gè)問題由幾個(gè)部分組成,而每一個(gè)部分其實(shí)就是一個(gè)對(duì)象。然后再分別設(shè)計(jì)這些對(duì)象,最后得到整個(gè)程序。傳統(tǒng)的程序設(shè)計(jì)多是基于功能的思想來進(jìn)行考慮和設(shè)計(jì)的,而面向?qū)ο蟮某绦蛟O(shè)計(jì)則是基于對(duì)象的角度來考慮問題。這樣做能夠使得程序更加的簡潔清晰。
說明:編程中接觸最多的“面向?qū)ο缶幊碳夹g(shù)”僅僅是面向?qū)ο蠹夹g(shù)中的一個(gè)組成部分。發(fā)揮面向?qū)ο蠹夹g(shù)的優(yōu)勢是一個(gè)綜合的技術(shù)問題,不僅需要面向?qū)ο蟮姆治?,設(shè)計(jì)和編程技術(shù),而且需要借助必要的建模和開發(fā)工具。
31 C++中為什么用模板類。
解析:
1) 可用來創(chuàng)建動(dòng)態(tài)增長和減小的數(shù)據(jù)結(jié)構(gòu)
2) 它是類型無關(guān)的,因此具有很高的可復(fù)用性。
3) 它在編譯時(shí)而不是運(yùn)行時(shí)檢查數(shù)據(jù)類型,保證了類型安全
4) 它是平臺(tái)無關(guān)的,可移植性
5) 可用于基本數(shù)據(jù)類型
32 函數(shù)模板與類模板有什么區(qū)別?
答:函數(shù)模板的實(shí)例化是由編譯程序在處理函數(shù)調(diào)用時(shí)自動(dòng)完成的,而類模板的實(shí)例化
必須由程序員在程序中顯式地指定。
33 .winsock建立連接的主要實(shí)現(xiàn)步驟? (非常重要,必問)
答:服務(wù)器端:socker()建立套接字,綁定(bind)并監(jiān)聽(listen),用accept()
等待客戶端連接。
客戶端:socker()建立套接字,連接(connect)服務(wù)器,連接上后使用send()和recv(
),在套接字上寫讀數(shù)據(jù),直至數(shù)據(jù)交換完畢,closesocket()關(guān)閉套接字。
服務(wù)器端:accept()發(fā)現(xiàn)有客戶端連接,建立一個(gè)新的套接字,自身重新開始等待連
接。該新產(chǎn)生的套接字使用send()和recv()寫讀數(shù)據(jù),直至數(shù)據(jù)交換完畢,closesock
et()關(guān)閉套接字。
34 進(jìn)程和線程的差別。
答:線程是指進(jìn)程內(nèi)的一個(gè)執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體.與進(jìn)程的區(qū)別:
(1)調(diào)度:線程作為調(diào)度和分配的基本單位,進(jìn)程作為擁有資源的基本單位
(2)并發(fā)性:不僅進(jìn)程之間可以并發(fā)執(zhí)行,同一個(gè)進(jìn)程的多個(gè)線程之間也可并發(fā)執(zhí)行
(3)擁有資源:進(jìn)程是擁有資源的一個(gè)獨(dú)立單位,線程不擁有系統(tǒng)資源,但可以訪問隸屬于進(jìn)程的資源.
(4)系統(tǒng)開銷:在創(chuàng)建或撤消進(jìn)程時(shí),由于系統(tǒng)都要為之分配和回收資源,導(dǎo)致系統(tǒng)的開銷明顯大于創(chuàng)建或撤消線程時(shí)的開銷。
35. C++是不是類型安全的?
答案:不是。兩個(gè)不同類型的指針之間可以強(qiáng)制轉(zhuǎn)換(用reinterpret cast)。C#是類型安全的。
如果用VC開發(fā)程序,常見這么幾個(gè)錯(cuò)誤,C2001,c2005,c2011,這些錯(cuò)誤的原因是什么。
37宏與內(nèi)聯(lián)函數(shù)的區(qū)別
解析:內(nèi)聯(lián)函數(shù)和宏都是在程序出現(xiàn)的地方展開,內(nèi)聯(lián)函數(shù)不是通過函數(shù)調(diào)用實(shí)現(xiàn)的,是在調(diào)用該函數(shù)的程序處將它展開(在編譯期間完成的);宏同樣是;
不同的是:內(nèi)聯(lián)函數(shù)可以在編譯期間完成諸如類型檢測,語句是否正確等編譯功能;宏就不具有這樣的功能,而且宏展開的時(shí)間和內(nèi)聯(lián)函數(shù)也是不同的(在運(yùn)行期間展開)
38 win32中消息循環(huán)Windows程序的入口是哪里?寫出Windows消息機(jī)制的流程
解析:Windows程序的入口是WinMain()函數(shù)。
Windows應(yīng)用程序消息處理機(jī)制:
A. 操作系統(tǒng)接收應(yīng)用程序的窗口消息,將消息投遞到該應(yīng)用程序的消息隊(duì)列中
B. 應(yīng)用程序在消息循環(huán)中調(diào)用GetMessage函數(shù)從消息隊(duì)列中取出一條一條的消息,取出消息后,應(yīng)用程序可以對(duì)消息進(jìn)行一些預(yù)處理。
C. 應(yīng)用程序調(diào)用DispatchMessage,將消息回傳給操作系統(tǒng)。
D. 系統(tǒng)利用WNDCLASS結(jié)構(gòu)體的lpfnWndProc成員保存的窗口過程函數(shù)的指針調(diào)用窗口過程,對(duì)消息進(jìn)行處理。
39:談?wù)勀銓?duì)編程規(guī)范的理解或認(rèn)識(shí)
編程規(guī)范可總結(jié)為:程序的可行性,可讀性、可移植性以及可測試性。
說明:這是編程規(guī)范的總綱目,面試者不一定要去背誦上面給出的那幾個(gè)例子,應(yīng)該去理解這幾個(gè)例子說明的問題,想一想,自己如何解決可行性、可讀性、可移植性以及可測試性這幾個(gè)問題,結(jié)合以上幾個(gè)例子和自己平時(shí)的編程習(xí)慣來回答這個(gè)問題。
40流操作符重載為什么返回引用
在程序中,流操作符>>和<<經(jīng)常連續(xù)使用。因此這兩個(gè)操作符的返回值應(yīng)該是一個(gè)仍舊支持這兩個(gè)操作符的流引用。其他的數(shù)據(jù)類型都無法做到這一點(diǎn)。
注意:除了在賦值操作符和流操作符之外的其他的一些操作符中,如+、-、*、/等卻千萬不能返回引用。因?yàn)檫@四個(gè)操作符的對(duì)象都是右值,因此,它們必須構(gòu)造一個(gè)對(duì)象作為返回值。
41 是不是一個(gè)父類寫了一個(gè)virtual 函數(shù),如果子類覆蓋它的函數(shù)不加virtual ,也能實(shí)現(xiàn)多態(tài)?
virtual修飾符會(huì)被隱形繼承的。private 也被集成,只事派生類沒有訪問權(quán)限而已。virtual可加可不加。子類的空間里有父類的所有變量(static除外)。同一個(gè)函數(shù)只存在一個(gè)實(shí)體(inline除外)。子類覆蓋它的函數(shù)不加virtual ,也能實(shí)現(xiàn)多態(tài)。在子類的空間里,有父類的私有變量。私有變量不能直接訪問。
42.C和C++有什么不同?
從機(jī)制上:c是面向過程的(但c也可以編寫面向?qū)ο蟮某绦颍?;c++是面向?qū)ο蟮模峁┝祟?。但是,c++編寫面向?qū)ο蟮某绦虮萩容易
從適用的方向:c適合要求代碼體積小的,效率高的場合,如嵌入式;c++適合更上層的,復(fù)雜的; llinux核心大部分是c寫的,因?yàn)樗窍到y(tǒng)軟件,效率要求極高。
從名稱上也可以看出,c++比c多了+,說明c++是c的超集;那為什么不叫c+而叫c++呢,是因?yàn)閏++比
c來說擴(kuò)充的東西太多了,所以就在c后面放上兩個(gè)+;于是就成了c++
C語言是結(jié)構(gòu)化編程語言,C++是面向?qū)ο缶幊陶Z言。
C++側(cè)重于對(duì)象而不是過程,側(cè)重于類的設(shè)計(jì)而不是邏輯的設(shè)計(jì)。
43預(yù)處理器標(biāo)識(shí)#error的目的是什么?
如果你不知道答案,請(qǐng)看參考文獻(xiàn)1。這問題對(duì)區(qū)分一個(gè)正常的伙計(jì)和一個(gè)書呆子是很有用的。只有書呆子才會(huì)讀C語言課本的附錄去找出象這種
問題的答案。當(dāng)然如果你不是在找一個(gè)書呆子,那么應(yīng)試者最好希望自己不要知道答案。
44.請(qǐng)簡述以下兩個(gè)for循環(huán)的優(yōu)缺點(diǎn)
// 第一個(gè)
for (i=0; i++;){if (condition)DoSomething();else DoOtherthing();}
// 第二個(gè)
if (condition){for (i=0; i++;)DoSomething();}
else{for (i=0; i++;)DoOtherthing();}
填空和選擇題:
1。下面哪些運(yùn)算符不能被重載?( )
A. 做用域運(yùn)算符“::”
B. 對(duì)象成員運(yùn)算符“.”
C. 指針成員運(yùn)算符“->”
D. 三目運(yùn)算符“? :”
解析:沒有什么理由 ABD都不行
2. 在以下有關(guān)C++類的描述中,不正確的是
A.C++語言引入類主要起兩個(gè)作用,作為數(shù)據(jù)封裝機(jī)制和作為類型定義機(jī)制
B.C++類中定義的數(shù)據(jù)和函數(shù)分別稱為數(shù)據(jù)成員和成員函數(shù)
C.C++類作為數(shù)據(jù)封裝機(jī)制,將數(shù)據(jù)及作用于數(shù)據(jù)的操作組織在一起,實(shí)現(xiàn)了信息隱藏
D.C++類中的成員可分為四種:公有成員、保護(hù)成員、私有成員和友元
正確答案:D
3.設(shè)有int x = 123,語句 可產(chǎn)生“+123”形式的輸出(“”代表空格)。
A.cout << setw (8) << showpos << x << endl;
B.cout << setw (8) << showpos << internal << x << endl;
C.cout << setw (8) << showpos << left << x << endl;
D.cout << showpos << internal << x << endl;
正確答案:B
4. 類模板的聲明語句中,正確的是
A.template
B.template
C.template
D.template
正確答案:C
5非C++內(nèi)建型別 A 和 B,在哪幾種情況下B能隱式轉(zhuǎn)化為A?[C++中等]
a. class B : public A { ……}
b. class B { operator A( ); }
c. class A { A( const B& ); }
d. A& operator= ( const A& );
解析:第一項(xiàng) B公有繼承自A,可以是間接繼承的。第二項(xiàng): B實(shí)現(xiàn)了隱式轉(zhuǎn)化為A的轉(zhuǎn)化
第三項(xiàng):A實(shí)現(xiàn)了non-explicit的參數(shù)為B(可以有其他帶默認(rèn)值的參數(shù))構(gòu)造函數(shù)
第四項(xiàng): 賦值操作,雖不是正宗的隱式類型轉(zhuǎn)換,但也可以勉強(qiáng)算一個(gè)
6關(guān)于this指針的說法錯(cuò)誤的是( A )
this指針必須顯示說明
當(dāng)創(chuàng)建一個(gè)對(duì)象后,this指針就指向該對(duì)象
成員函數(shù)擁有this指針
靜態(tài)成員函數(shù)不擁有this指針
7.下面函數(shù)原型聲明中,( B )聲明了fun為純虛函數(shù)
A . void fun()=0;
B virtual void fun()=0;
C virtual void fun();
D virtual void fun(){};
8友元運(yùn)算符obj>obj2被C++編譯器解釋為( A )。
operator>(obj1,obj2)
>(obj1,obj2)
obj2.operator>(obj1)
obj1.oprator>(obj2)
9.假定AB為一個(gè)類,則執(zhí)行“AB a(4),b[3],*p[2];”語句時(shí),自動(dòng)調(diào)用該類構(gòu)造函數(shù)的次數(shù)為:B
A) 3 B) 4 C) 6 D) 9
10.假定要對(duì)類AB定義加號(hào)操作符重載成員函數(shù),實(shí)現(xiàn)兩個(gè)AB類對(duì)象的加法,并返回相加結(jié)果,則該成員函數(shù)的聲明語句為:B
A) AB operator+(AB &a,AB &b)
B) AB operator+(AB &a)
C) operator+(AB a)
D) AB & operator+()
11.有二維字符數(shù)組char s[4][6]={"zhang","gao","tang","wang"};執(zhí)行程序cout<<*s[2],屏幕上顯示:D
A)gao B)tang C)g D)t
12 #include
using namespace std; class A1{ public: int a; static int b; A1(); ~A1(); }; int main() { cout << sizeof(A1) <解析:是4, 靜態(tài)變量是存放在全局?jǐn)?shù)據(jù)區(qū)的, 而sizeof是計(jì)算局部棧中分配的大小。
13.死鎖的處理
解析:鴕鳥策略、預(yù)防策略、避免策略、檢測與解除死鎖,只要知道概念就行,不需要掌握
14. 非C++內(nèi)建型別 A 和 B,在哪幾種情況下B能隱式轉(zhuǎn)化為A?[C++中等]
解析:a. class B : public A { ……} // B公有繼承自A,可以是間接繼承的
b. class B { operator A( ); } // B實(shí)現(xiàn)了隱式轉(zhuǎn)化為A的轉(zhuǎn)化
c. class A { A( const B& ); } // A實(shí)現(xiàn)non-explicit的參數(shù)為B(可有其他帶默認(rèn)值的參數(shù))構(gòu)造函數(shù)
d. A& operator= ( const A& ); // 賦值操作,雖不是正宗的隱式類型轉(zhuǎn)換,但也可以勉強(qiáng)算一個(gè)
15以下代碼有什么問題?[STL易]
typedef vector IntArray;
IntArray array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 2 );
array.push_back( 3 );
// 刪除array數(shù)組中所有的2
for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )
{
if( 2 == *itor ) array.erase( itor );
}
解析:其實(shí)里面隱藏著一個(gè)很嚴(yán)重的錯(cuò)誤:當(dāng)veci.erase(iter)之后,iter就變成了一個(gè)野指針,對(duì)一個(gè)野指針進(jìn)行 iter++ 是肯定會(huì)出錯(cuò)的。
16 下列代碼的輸出值是多少?
class A{};
class A1{};
class B : public A{};
class C : public A, public A1{};
class D : public virtual A{};
cout << sizeof ( A ) << endl;
cout << sizeof ( B ) << endl;
cout << sizeof ( C ) << endl;
cout << sizeof ( D ) << endl;
解析:答案:1, 1, 1,4說明:空類所占的空間為1,單一繼承的空類空間也為1,多重繼承的空類空間還是1, 但是虛繼承涉及到虛表(虛指針),所以大小為4。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C++的相關(guān)面試題有哪些”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!
標(biāo)題名稱:C++的相關(guān)面試題有哪些
本文來源:http://weahome.cn/article/ppjhgc.html