真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++的相關(guān)面試題有哪些

這篇文章主要介紹了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及其它語言的混合編程。

26.“引用”與指針的區(qū)別是什么?

指針通過某個(gè)指針變量指向一個(gè)對(duì)象后,對(duì)它所指向的變量間接操作。程序中使用指針,程序的可讀性差;而引用本身就是目標(biāo)變量的別名,對(duì)引用的操作就是對(duì)目標(biāo)變量的操作。此外,就是上面提到的對(duì)函數(shù)傳ref和pointer的區(qū)別。

23.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.

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#是類型安全的。

  1. 如果用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 class Sample {…};

B.template class Sample {…};

C.template class Sample {…};

D.template Sample {…};

正確答案: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  )

    1. this指針必須顯示說明

    2. 當(dāng)創(chuàng)建一個(gè)對(duì)象后,this指針就指向該對(duì)象

    3. 成員函數(shù)擁有this指針

    4. 靜態(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 )。

    1. operator>(obj1,obj2)

    2. >(obj1,obj2)

    3. obj2.operator>(obj1)

    4. 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打印結(jié)果是多少

 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

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部