溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時間:2021-06-15 11:18:22 來源:億速云 閱讀:162 作者:小新 欄目:編程語言

這篇文章主要介紹了C++的相關(guān)面試題有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

C++面試題精髓

1.、為什么構(gòu)造函數(shù)不能聲明為虛函數(shù)?

解析:因為虛函數(shù)采用的是虛調(diào)用的方法,虛調(diào)用是指允許在只知道部分信息的情況下

的工作機(jī)制,特別允許我們調(diào)用一個只知道接口而不知道其對象的準(zhǔn)確類型的函數(shù)。

但是如果我們要調(diào)用構(gòu)造函數(shù)創(chuàng)建對象時,必須要知道對象的準(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ù)不能是因為虛函數(shù)采用的是虛調(diào)用的方法,

(3)內(nèi)聯(lián)成員函數(shù)的實質(zhì)是在調(diào)用的地方直接將代碼擴(kuò)展開

(4)繼承時,靜態(tài)成員函數(shù)不能被繼承的,它只屬于一個類,因為也不存在動態(tài)聯(lián)編

(5)友元函數(shù)不是類的成員函數(shù),因此也不能被繼承

3.類的靜態(tài)成員和非靜態(tài)成員有何區(qū)別?

答:類的靜態(tài)成員每個類只有一個,靜態(tài)成員為所有類的實例對象共享,靜態(tài)成員有靜態(tài)成員變量和靜態(tài)成員函數(shù),靜態(tài)成員變量使用前必須初始化,靜態(tài)成員變量可以被靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)訪問,而靜態(tài)成員函數(shù)只能訪問靜態(tài)成員變量,因為靜態(tài)成員函數(shù)屬于類,其沒有this指針。非靜態(tài)成員每個對象都有一個。

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

重載:是指允許存在多個同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個數(shù)不同,或許參數(shù)類型不同,或許兩者都不同)。     重寫:是指子類重新定義復(fù)類虛函數(shù)的方法。     從實現(xiàn)原理上來說:重載:編譯器根據(jù)函數(shù)不同的參數(shù)表,對同名函數(shù)的名稱做修飾,然后這些同名函數(shù)就成了不同的函數(shù)(至少對于編譯器來說是這樣的)。如,有兩個同名函數(shù):function func(p:integer):integer;和function func(p:string):integer;。那么編譯器做過修飾后的函數(shù)名稱可能是這樣的:int_func、str_func.對于這兩個函數(shù)的調(diào)用,在編譯器間就已經(jīng)確定了,是靜態(tài)的。也就是說,它們的地址在編譯期就綁定了(早綁定),因此,重載和多態(tài)無關(guān)!     重寫:和多態(tài)真正相關(guān)。當(dāng)子類重新定義了父類的虛函數(shù)后,父類指針根據(jù)賦給它的不同的子類指針,動態(tài)的調(diào)用屬于子類的該函數(shù),這樣的函數(shù)調(diào)用在編譯期間是無法確定的(調(diào)用的子類的虛函數(shù)的地址無法給出)。因此,這樣的函數(shù)地址是在運(yùn)行期綁定的(晚綁定)

5 簡述成員函數(shù)、全局函數(shù)和友元函數(shù)的差別。

成員函數(shù)只能由該類所實例化的對象來進(jìn)行調(diào)用。[靜態(tài)成員除外]

全局函數(shù)可以在任意位置進(jìn)行調(diào)用。

友元函數(shù)可以讓本類和友元類對象調(diào)用。

用new分配的內(nèi)存用delete刪除用new[]分配的內(nèi)存用delete[]刪除delete[]會調(diào)用數(shù)組元素的析構(gòu)函數(shù)。內(nèi)部數(shù)據(jù)類型沒有析構(gòu)函數(shù),所以問題不大。如果你在用delete時沒用括號,delete就會認(rèn)為指向的是單個對象,否則,它就會認(rèn)為指向的是一個數(shù)組。

6.繼承的優(yōu)缺點。

類繼承是在編譯時刻靜態(tài)定義的,且可直接使用,類繼承可以較方便地改變父類的實現(xiàn)。但是類繼承也有一些不足之處。首先,因為繼承在編譯時刻就定義了,所以無法在運(yùn)行時刻改變從父類繼承的實現(xiàn)。更糟的是,父類通常至少定義了子類的部分行為,父類的任何改變都可能影響子類的行為。如果繼承下來的實現(xiàn)不適合解決新的問題,則父類必須重寫或被其他更適合的類替換。這種依賴關(guān)系限制了靈活性并最終限制了復(fù)用性。 (待補(bǔ)充)

7.C++有哪些性質(zhì)(面向?qū)ο筇攸c)

封裝,繼承和多態(tài)。

在面向?qū)ο蟪绦蛟O(shè)計語言中,封裝是利用可重用成分構(gòu)造軟件系統(tǒng)的特性,它不僅支持系統(tǒng)的可重用性,而且還有利于提高系統(tǒng)的可擴(kuò)充性;消息傳遞可以實現(xiàn)發(fā)送一個通用的消息而調(diào)用不同的方法;封裝是實現(xiàn)信息隱蔽的一種技術(shù),其目的是使類的定義和實現(xiàn)分離。

8. 在什么時候需要使用“常引用”?

如果既要利用引用提高程序的效率,又要保護(hù)傳遞給函數(shù)的數(shù)據(jù)不在函數(shù)中被改變,就 應(yīng)使用常引用。常引用聲明方式:const 類型標(biāo)識符 &引用名=目標(biāo)變量名;

int a

const int &ra=a;

ra=1; //錯誤

a=1; //正確

例2 string foo( );

void bar(string & s);

那么下面的表達(dá)式將是非法的:

bar(foo( ));

bar("hello world");

原因在于foo( )和"hello world"串都會產(chǎn)生一個臨時對象,而在C++中,這些臨時對象都是const類型的。因此上面的表達(dá)式就是試圖將一個const類型的對象轉(zhuǎn)換為非const類型,這是非法的。引用型參數(shù)應(yīng)該在能被定義為const的情況下,盡量定義為const

9.ASSERT()是干什么用的

答:ASSERT()是一個調(diào)試程序時經(jīng)常使用的宏,在程序運(yùn)行時它計算括號內(nèi)的表達(dá)式,如果表達(dá)式為FALSE (0),

程序?qū)蟾驽e誤,并終止執(zhí)行。如果表達(dá)式不為0,則繼續(xù)執(zhí)行后面的語句。這個宏通常原來判斷程序中是否出現(xiàn)了明顯非法的數(shù)據(jù),如果出現(xiàn)了終止程序以免導(dǎo)致嚴(yán)重后果,同時也便于查找錯誤。例如,變量n在程序中不應(yīng)該為0,如果為0可能導(dǎo)致錯誤,

10. 實現(xiàn)多態(tài)的方法?

解析:   ① 一個基類的引用可以指向它的派生類實例

② 一個基類的指針可以指向它的派生類實例

11. 面向?qū)ο蟮娜齻€基本特征,并簡單敘述之?

① 封裝:將客觀事物抽象成類,每個類對自身的數(shù)據(jù)和方法實行訪問控制(private, protected,public)

② 繼承:廣義的繼承有三種實現(xiàn)形式:

實現(xiàn)繼承(指使用基類的屬性和方法而無需額外編碼的能力)

可視繼承(子窗體使用父窗體的外觀和實現(xiàn)代碼)

接口繼承(僅使用屬性和方法,實現(xiàn)滯后到子類實現(xiàn))。

前兩種(類繼承)和后一種(對象組合=>接口繼承以及純虛函數(shù))構(gòu)成了功能復(fù)用的兩種方式。

③ 多態(tài):是將父對象設(shè)置成為和一個或更多的他的子對象相等的技術(shù),賦值之后,父對象就可以根據(jù)當(dāng)前賦值給它的子對象的特性以不同的方式運(yùn)作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。

補(bǔ)充問題:     多態(tài)的作用?

主要是兩個:

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

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

12重載(overload)和重寫(overried,有的書也叫做覆蓋)的區(qū)別?

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

② 重寫:是指子類重新定義父類虛函數(shù)的方法。

從實現(xiàn)原理上來說:

① 重載:編譯器根據(jù)函數(shù)不同的參數(shù)表,對同名函數(shù)的名稱做修飾,然后這些同名函數(shù)就成了不同的函數(shù)(至少對于編譯器來說是這樣的)。對于這類函數(shù)的調(diào)用,在編譯期間就已經(jīng)確定了,是靜態(tài)的。也就是說,它們的地址在編譯期就綁定了(早綁定),因此,重載和多態(tài)無關(guān)!

② 重寫:和多態(tài)真正相關(guān)。當(dāng)子類重新定義了父類的虛函數(shù)后,父類指針根據(jù)賦給它的不同的子類指針,動態(tài)的調(diào)用屬于子類的該函數(shù),這樣的函數(shù)調(diào)用在編譯期間是無法確定的(調(diào)用的子類的虛函數(shù)的地址無法給出)。因此,這樣的函數(shù)地址是在運(yùn)行期綁定的(晚綁定)

13多態(tài)的作用?

主要是兩個:

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

② 接口重用:為了類在繼承和派生的時候,保證使用家族中任一類的實例的某一屬性時的正確調(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 ,消息隊列 ,信號,信號量,內(nèi)存映射等。

16死鎖的四個必要條件?

互斥,請求保持,不可剝奪,環(huán)路。

17、類的靜態(tài)成員和非靜態(tài)成員有什么區(qū)別?

類的靜態(tài)成員每個類只有一個,即是屬于本類的;類的非靜態(tài)成員每個對象都有一份。

18什么是淺拷貝?什么是深拷貝?

淺拷貝是指源對象與拷貝對象共用一份實體,僅僅是引用的變量不同(名稱不同)。對其中任何一個對象的改動都會影響另外一個對象。

深拷貝是指源對象與拷貝對象互相獨立,其中任何一個對象的改動都不會對另外一個對象造成影響。

一般來說,淺拷貝就是復(fù)制那個對象的指針。深拷貝就是復(fù)制了那個對象。

19、Windows編程線程同步的幾種方式?(重要)

  原子鎖、臨界區(qū)(段)、事件、互斥(體)、信號量、可等候定時器

20什么是“引用”?申明和使用“引用”要注意哪些問題?

答:引用就是某個目標(biāo)變量的“別名”(alias),對引用的操作與對變量直接操作效果完全相同。申明一個引用的時候,切記要對其進(jìn)行初始化。引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個名稱,即該目標(biāo)原名稱和引用名,不能再把該引用名作為其他變量名的別名。聲明一個引用,不是新定義了一個變量,它只表示該引用名是目標(biāo)變量名的一個別名,它本身不是一種數(shù)據(jù)類型,因此引用本身不占存儲單元,系統(tǒng)也不給引用分配存儲單元。不能建立數(shù)組的引用。

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

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

22. 關(guān)聯(lián)、聚合(Aggregation)以及組合(Composition)的區(qū)別?

涉及到UML中的一些概念:關(guān)聯(lián)是表示兩個類的一般性聯(lián)系,比如“學(xué)生”和“老師”就是一種關(guān)聯(lián)關(guān)系;聚合表示has-a的關(guān)系,是一種相對松散的關(guān)系,聚合類不需要對被聚合類負(fù)責(zé),如下圖所示,用空的菱形表示聚合關(guān)系:

從實現(xiàn)的角度講,聚合可以表示為:

class A {...} class B { A* a; .....}

而組合表示contains-a的關(guān)系,關(guān)聯(lián)性強(qiáng)于聚合:組合類與被組合類有相同的生命周期,組合類要對被組合類負(fù)責(zé),采用實心的菱形表示組合關(guān)系:

實現(xiàn)的形式是:

class A{...} class B{ A a; ...}

23.面向?qū)ο蟮娜齻€基本特征,并簡單敘述之?

1. 封裝:將客觀事物抽象成類,每個類對自身的數(shù)據(jù)和方法實行protection(private, protected,public)

2. 繼承:廣義的繼承有三種實現(xiàn)形式:實現(xiàn)繼承(指使用基類的屬性和方法而無需額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀和實現(xiàn)代碼)、接口繼承(僅使用屬性和方法,實現(xiàn)滯后到子類實現(xiàn))。前兩種(類繼承)和后一種(對象組合=>接口繼承以及純虛函數(shù))構(gòu)成了功能復(fù)用的兩種方式。

3. 多態(tài):是將父對象設(shè)置成為和一個或更多的他的子對象相等的技術(shù),賦值之后,父對象就可以根據(jù)當(dāng)前賦值給它的子對象的特性以不同的方式運(yùn)作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。

24 多態(tài)的作用?

主要是兩個:1. 隱藏實現(xiàn)細(xì)節(jié),使得代碼能夠模塊化;擴(kuò)展代碼模塊,實現(xiàn)代碼重用;2. 接口重用:為了類在繼承和派生的時候,保證使用家族中任一類的實例的某一屬性時的正確調(diào)用。

25 在C++ 程序中調(diào)用被 C編譯器編譯后的函數(shù),為什么要加 extern “C”聲明?

//extern是C/C++語言中表明函數(shù)和全局變量作用范圍的關(guān)鍵字,該關(guān)鍵字告訴編譯器,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用

// extern “C是連接申明,編譯時告訴編譯器以下代碼用C風(fēng)格的方式編譯和連接,其目的是實現(xiàn)C++與C及其它語言的混合編程。

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

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

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

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

24 成員函數(shù)被重載的特征:
(1)相同的范圍(在同一個類中);
(2)函數(shù)名字相同;
(3)參數(shù)不同;
(4)virtual 關(guān)鍵字可有可無。

25覆蓋是指派生類函數(shù)覆蓋基類函數(shù),特征是:
(1)不同的范圍(分別位于派生類與基類);
(2)函數(shù)名字相同;
(3)參數(shù)相同;
(4)基類函數(shù)必須有virtual 關(guān)鍵字。

26如果用VC開發(fā)程序,常見這么幾個錯誤,C2001,c2005,c2011,這些錯誤的原因是什么。

在學(xué)習(xí)VC++的過程中,遇到的LNK2001錯誤的錯誤消息主要為:

unresolved external symbol “symbol”(不確定的外部“符號”)。

如果連接程序不能在所有的庫和目標(biāo)文件內(nèi)找到所引用的函數(shù)、變量或標(biāo)簽,將產(chǎn)生此錯誤消息。

一般來說,發(fā)生錯誤的原因有兩個:一是所引用的函數(shù)、變量不存在、拼寫不正確或者使用錯誤;

其次可能使用了不同版本的連接庫。

編程中經(jīng)常能遇到LNK2005錯誤——重復(fù)定義錯誤,其實LNK2005錯誤并不是一個很難解決的錯誤.

 27介紹一下STL,詳細(xì)說明STL如何實現(xiàn)vector。

STL (標(biāo)準(zhǔn)模版庫,Standard Template Library)它由容器算法迭代器組成。

STL有以下的一些優(yōu)點:

可以方便容易地實現(xiàn)搜索數(shù)據(jù)或?qū)?shù)據(jù)排序等一系列的算法;

調(diào)試程序時更加安全和方便;

即使是人們用STL在UNIX平臺下寫的代碼你也可以很容易地理解(因為STL是跨平臺的)。

vector實質(zhì)上就是一個動態(tài)數(shù)組,會根據(jù)數(shù)據(jù)的增加,動態(tài)的增加數(shù)組空間。

28介紹一下模板和容器。如何實現(xiàn)?(也許會讓你當(dāng)場舉例實現(xiàn))

模板可以說比較古老了,但是當(dāng)前的泛型編程實質(zhì)上就是模板編程。

它體現(xiàn)了一種通用和泛化的思想。

STL有7種主要容器:vector,list,deque,map,multimap,set,multiset.

29 :簡述多態(tài)實現(xiàn)的原理

編譯器發(fā)現(xiàn)一個類中有虛函數(shù),便會立即為此類生成虛函數(shù)表 vtable。虛函數(shù)表的各表項為指向?qū)?yīng)虛函數(shù)的指針。編譯器還會在此類中隱含插入一個指針vptr(對vc編譯器來說,它插在類的第一個位置上)指向虛函數(shù)表。調(diào)用此類的構(gòu)造函數(shù)時,在類的構(gòu)造函數(shù)中,編譯器會隱含執(zhí)行vptr與vtable的關(guān)聯(lián)代碼,將vptr指向?qū)?yīng)的vtable,將類與此類的vtable聯(lián)系了起來。另外在調(diào)用類的構(gòu)造函數(shù)時,指向基礎(chǔ)類的指針此時已經(jīng)變成指向具體的類的this指針,這樣依靠此this指針即可得到正確的vtable,。如此才能真正與函數(shù)體進(jìn)行連接,這就是動態(tài)聯(lián)編,實現(xiàn)多態(tài)的基本原理。

30:談?wù)勀銓γ嫦驅(qū)ο蟮恼J(rèn)識

  解析:面向?qū)ο罂梢岳斫獬蓪Υ恳粋€問題,都是首先要確定這個問題由幾個部分組成,而每一個部分其實就是一個對象。然后再分別設(shè)計這些對象,最后得到整個程序。傳統(tǒng)的程序設(shè)計多是基于功能的思想來進(jìn)行考慮和設(shè)計的,而面向?qū)ο蟮某绦蛟O(shè)計則是基于對象的角度來考慮問題。這樣做能夠使得程序更加的簡潔清晰。

說明:編程中接觸最多的“面向?qū)ο缶幊碳夹g(shù)”僅僅是面向?qū)ο蠹夹g(shù)中的一個組成部分。發(fā)揮面向?qū)ο蠹夹g(shù)的優(yōu)勢是一個綜合的技術(shù)問題,不僅需要面向?qū)ο蟮姆治?,設(shè)計和編程技術(shù),而且需要借助必要的建模和開發(fā)工具。

31  C++中為什么用模板類。

解析:

1) 可用來創(chuàng)建動態(tài)增長和減小的數(shù)據(jù)結(jié)構(gòu)

2) 它是類型無關(guān)的,因此具有很高的可復(fù)用性。

3) 它在編譯時而不是運(yùn)行時檢查數(shù)據(jù)類型,保證了類型安全

4) 它是平臺無關(guān)的,可移植性

5) 可用于基本數(shù)據(jù)類型

32 函數(shù)模板與類模板有什么區(qū)別?

答:函數(shù)模板的實例化是由編譯程序在處理函數(shù)調(diào)用時自動完成的,而類模板的實例化

必須由程序員在程序中顯式地指定。

33 .winsock建立連接的主要實現(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)有客戶端連接,建立一個新的套接字,自身重新開始等待連

接。該新產(chǎn)生的套接字使用send()和recv()寫讀數(shù)據(jù),直至數(shù)據(jù)交換完畢,closesock

et()關(guān)閉套接字。

34 進(jìn)程和線程的差別。

答:線程是指進(jìn)程內(nèi)的一個執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實體.與進(jìn)程的區(qū)別:

(1)調(diào)度:線程作為調(diào)度和分配的基本單位,進(jìn)程作為擁有資源的基本單位

(2)并發(fā)性:不僅進(jìn)程之間可以并發(fā)執(zhí)行,同一個進(jìn)程的多個線程之間也可并發(fā)執(zhí)行

(3)擁有資源:進(jìn)程是擁有資源的一個獨立單位,線程不擁有系統(tǒng)資源,但可以訪問隸屬于進(jìn)程的資源.

(4)系統(tǒng)開銷:在創(chuàng)建或撤消進(jìn)程時,由于系統(tǒng)都要為之分配和回收資源,導(dǎo)致系統(tǒng)的開銷明顯大于創(chuàng)建或撤消線程時的開銷。

35. C++是不是類型安全的?

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

  1. 如果用VC開發(fā)程序,常見這么幾個錯誤,C2001,c2005,c2011,這些錯誤的原因是什么。

37宏與內(nèi)聯(lián)函數(shù)的區(qū)別

解析:內(nèi)聯(lián)函數(shù)和宏都是在程序出現(xiàn)的地方展開,內(nèi)聯(lián)函數(shù)不是通過函數(shù)調(diào)用實現(xiàn)的,是在調(diào)用該函數(shù)的程序處將它展開(在編譯期間完成的);宏同樣是;

不同的是:內(nèi)聯(lián)函數(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)用程序的消息隊列中

B. 應(yīng)用程序在消息循環(huán)中調(diào)用GetMessage函數(shù)從消息隊列中取出一條一條的消息,取出消息后,應(yīng)用程序可以對消息進(jìn)行一些預(yù)處理。

C. 應(yīng)用程序調(diào)用DispatchMessage,將消息回傳給操作系統(tǒng)。

D. 系統(tǒng)利用WNDCLASS結(jié)構(gòu)體的lpfnWndProc成員保存的窗口過程函數(shù)的指針調(diào)用窗口過程,對消息進(jìn)行處理。

39:談?wù)勀銓幊桃?guī)范的理解或認(rèn)識

編程規(guī)范可總結(jié)為:程序的可行性,可讀性、可移植性以及可測試性。

說明:這是編程規(guī)范的總綱目,面試者不一定要去背誦上面給出的那幾個例子,應(yīng)該去理解這幾個例子說明的問題,想一想,自己如何解決可行性、可讀性、可移植性以及可測試性這幾個問題,結(jié)合以上幾個例子和自己平時的編程習(xí)慣來回答這個問題。

40流操作符重載為什么返回引用

在程序中,流操作符>>和<<經(jīng)常連續(xù)使用。因此這兩個操作符的返回值應(yīng)該是一個仍舊支持這兩個操作符的流引用。其他的數(shù)據(jù)類型都無法做到這一點。

注意:除了在賦值操作符和流操作符之外的其他的一些操作符中,如+、-、*、/等卻千萬不能返回引用。因為這四個操作符的對象都是右值,因此,它們必須構(gòu)造一個對象作為返回值。

41 是不是一個父類寫了一個virtual 函數(shù),如果子類覆蓋它的函數(shù)不加virtual ,也能實現(xiàn)多態(tài)?

virtual修飾符會被隱形繼承的。private 也被集成,只事派生類沒有訪問權(quán)限而已。virtual可加可不加。子類的空間里有父類的所有變量(static除外)。同一個函數(shù)只存在一個實體(inline除外)。子類覆蓋它的函數(shù)不加virtual ,也能實現(xiàn)多態(tài)。在子類的空間里,有父類的私有變量。私有變量不能直接訪問。

42.C和C++有什么不同?

從機(jī)制上:c是面向過程的(但c也可以編寫面向?qū)ο蟮某绦颍?;c++是面向?qū)ο蟮?,提供了類。但是,c++編寫面向?qū)ο蟮某绦虮萩容易

從適用的方向:c適合要求代碼體積小的,效率高的場合,如嵌入式;c++適合更上層的,復(fù)雜的; llinux核心大部分是c寫的,因為它是系統(tǒng)軟件,效率要求極高。

從名稱上也可以看出,c++比c多了+,說明c++是c的超集;那為什么不叫c+而叫c++呢,是因為c++比

c來說擴(kuò)充的東西太多了,所以就在c后面放上兩個+;于是就成了c++

C語言是結(jié)構(gòu)化編程語言,C++是面向?qū)ο缶幊陶Z言。

C++側(cè)重于對象而不是過程,側(cè)重于類的設(shè)計而不是邏輯的設(shè)計。

43預(yù)處理器標(biāo)識#error的目的是什么?
如果你不知道答案,請看參考文獻(xiàn)1。這問題對區(qū)分一個正常的伙計和一個書呆子是很有用的。只有書呆子才會讀C語言課本的附錄去找出象這種
問題的答案。當(dāng)然如果你不是在找一個書呆子,那么應(yīng)試者最好希望自己不要知道答案。

44.請簡述以下兩個for循環(huán)的優(yōu)缺點
// 第一個
for (i=0; i++;){if (condition)DoSomething();else DoOtherthing();}
// 第二個
if (condition){for (i=0; i++;)DoSomething();}
else{for (i=0; i++;)DoOtherthing();}

填空和選擇題:

1。下面哪些運(yùn)算符不能被重載? ( )

A. 做用域運(yùn)算符“::”

B. 對象成員運(yùn)算符“.”

C. 指針成員運(yùn)算符“->”

D. 三目運(yùn)算符“? :”

解析:沒有什么理由 ABD都不行

2. 在以下有關(guān)C++類的描述中,不正確的是

A.C++語言引入類主要起兩個作用,作為數(shù)據(jù)封裝機(jī)制和作為類型定義機(jī)制

B.C++類中定義的數(shù)據(jù)和函數(shù)分別稱為數(shù)據(jù)成員和成員函數(shù)

C.C++類作為數(shù)據(jù)封裝機(jī)制,將數(shù)據(jù)及作用于數(shù)據(jù)的操作組織在一起,實現(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<T> class Sample {…};

B.template<class T1, T2> class Sample {…};

C.template<typename T1, class T2> class Sample {…};

D.template<Class T> 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& );

解析:第一項  B公有繼承自A,可以是間接繼承的。第二項: B實現(xiàn)了隱式轉(zhuǎn)化為A的轉(zhuǎn)化

第三項:A實現(xiàn)了non-explicit的參數(shù)為B(可以有其他帶默認(rèn)值的參數(shù))構(gòu)造函數(shù)
  第四項: 賦值操作,雖不是正宗的隱式類型轉(zhuǎn)換,但也可以勉強(qiáng)算一個

6關(guān)于this指針的說法錯誤的是( A  )


    1. this指針必須顯示說明


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


    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為一個類,則執(zhí)行“AB a(4),b[3],*p[2];”語句時,自動調(diào)用該類構(gòu)造函數(shù)的次數(shù)為:B

A) 3  B) 4  C) 6   D) 9

10.假定要對類AB定義加號操作符重載成員函數(shù),實現(xiàn)兩個AB類對象的加法,并返回相加結(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<iostream>打印結(jié)果是多少

 using namespace std;
   class A1{
   public:
    int a;
    static int b;
    A1();
    ~A1();
   };
   int main()   {
    cout << sizeof(A1) <<endl;
   }

解析:是4, 靜態(tài)變量是存放在全局?jǐn)?shù)據(jù)區(qū)的, 而sizeof是計算局部棧中分配的大小。

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實現(xiàn)了隱式轉(zhuǎn)化為A的轉(zhuǎn)化

c. class A { A( const B& ); } // A實現(xiàn)non-explicit的參數(shù)為B(可有其他帶默認(rèn)值的參數(shù))構(gòu)造函數(shù)

d. A& operator= ( const A& ); // 賦值操作,雖不是正宗的隱式類型轉(zhuǎn)換,但也可以勉強(qiáng)算一個

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 );

}

   解析:其實里面隱藏著一個很嚴(yán)重的錯誤:當(dāng)veci.erase(iter)之后,iter就變成了一個野指針,對一個野指針進(jìn)行 iter++ 是肯定會出錯的。

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)面試題有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI