程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++面試要點總結

C++面試要點總結

編輯:關於C++

一.基本知識:

1.using namespace std:這是C++標准模板庫的所有類和函數都是在名字空間std中(STL中的所有函數)

2.內部函數:static int fun(int a,int b)
外部函數:extern int fun(int a,int b)

3.二維數組:第一維的長度可以不指定,但第二維的長度不能省略

4.字符數組:有效字符後面一定是加一個’\0’,表示結束,標識這是一個字符串。
char str[10]=″China″;

這裡寫圖片描述

注:後4個字符是表示的空字符,第6個字符’\0’是表示終止符。不等同

5.&a == a,&取地址, 去(取得的)地址(所在)。就還是這個變量本身。

6.函數指針做函數參數:把函數作為變量,進行下面(傳過來)的函數。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjcuc2V0dyhuKcrHY291dLXE0aG2qM/uo6zWuLaoserXvMrks/a1xL/ttsijrMSsyM/T0rbUxuujrNW81ri2qG649tfWt/u1xM671sM8L3A+DQo8cD44LsO2vtmjujxiciAvPg0KZW51bSBjb2xvciB7cmVkLHllbGxvdyxibHVlLHdoaXRlLGJsYWNrfTs8YnIgLz4NCmZvciAoaW50IGo9cmVkO2ombHQ7PWJsYWNrO2orKyk8YnIgLz4NCrHIyv3X1taxudujoTwvcD4NCjxwPjkudHlwZWRlZiDWuLaosfDD+6GjPC9wPg0KPGgyIGlkPQ=="二面向對象相關">二.面向對象相關

1.類是抽象的,不占內存,而對象是具體的,占存儲空間

2.成員函數:將需要被外界調用的成員函數指定為public,它們是類對外的接口。
每個成員函數中都包含一個特殊的指針,稱為this指針。它的值是當前被調用的成員函數所在的那個對象的起始地址。
編譯系統自動實現a.volume(&a);

3.一個對象所占的空間大小只取決於該對象中數據成員所占的空間,而與成員函數無關。(函數只不過是一段動作,虛擬的操作,不存儲)

4.構造函數:在類對象進入其作用域時調用的構造函數。

5.程序調用構造函數和析構函數的順序:

1).在全局范圍中定義的對象,不存在於任何函數中(包括main),它的構造函數先執行,在所有函數包括main之前就執行了。
but如果一個程序有多個文件,而不同文件中有不同的全局變量,這時候的執行順序不確定。
main函數return退出或者遇上exit函數時,所有對象調用析構函數,並且順序是和創建的順序相反,先創建的後析構。就像一個棧,先執行的後退出。

2).局部對象。(在函數中定義)
在函數調用時調用其構造函數,函數被多次調用,每次產生一個當前作用域的新的對象。調用完成時,逐層執行析構函數。還是先構造的後析構。

3).定義的局部對象是static的,則程序只在第一次調用此函數的時候,建立對象調用構造函數一次,在調用結束時並不釋放,只有在整個程序退出的時候才調用析構函數。
(那麼這個可以作為一個共享變量吧,作用域是所喲的這個類的對象)

6.使用常指針和常引用作函數參數。能保證數據安全,並且使得數據不能被隨意修改,在調用上也不需要建立實參的拷貝(省了一堆開銷)。
void fun(const Time &t);

這裡就相當於直接使用目標對象的地址,但是const規定不能更改原地址上的值。能用不能該。

7.new 分配大空間不足,需要捕獲異常

8.數據共享:使用全局變量,安全性得不到保證。如果想在同類的多個對象之間實現數據共享,可以使用static的數據成員。(我們上面提到的)
靜態成員只在內存中定義一次。
它支持初始化,且只能在類外進行初始化。
它能通過對象名引用,也可以通過類名來引用,這也是只此一家了。

這個應用很牛逼,以前怎麼都弄不懂static干嘛的,現在終於秒懂了,同類對象共享變量。

9.靜態成員函數:它存在的作用就是由於靜態變量而生,使用它能處理靜態數據成員。
原因:靜態函數成員不屬於任何一個對象(和靜態數據變量一樣),因此它沒有this指針,無法通過這個函數來訪問對象中的非靜態成員。

10.friend函數不僅可以是一般函數(非成員函數),而且可以是另一個類中的成員函數。
注:一個函數可以被多個類聲明為friend函數(那就maybe能訪問對面那個類的私有數據了),這樣可以借由這個friend函數引用多個類中的私有數據。

11.friend的關系是單向的,不是雙向
並且友元的關系不能傳遞。只能是一個單箭頭

三.繼承派生:

1.在聲明派生類時,一般還應當自己定義派生類的構造函數和析構函數,因為構造函數和析構函數是不能從基類繼承的。
在執行派生類的構造函數時,調用基類的構造函數。
構造和析構不能繼承,但是在使用子類,會調用基類的構造函數。

2.虛基類:如果一個派生類有多個直接基類,而這些直接基類又有一個共同的基類,則在最終的派生類中會保留該間接共同基類數據成員的多份同名成員。
在引用這些同名成員時候,必須在派生類對象名後增加直接基類名字,以避免產生二義性,使用如下: c1.A::display().

這裡解釋一下:
如果是下面這樣的繼承關系:
        A(a,b)
      /    \
   B(a,b)  C(a,b)
      \    /
        D(B::a,b + C::a,b)

D繼承於B和C,B和C又同時繼承於統一一個基類A。

那麼B中會繼承A中的一些變量,C也會繼承A中的一些變量,B和C繼承的都是一樣的(相同繼承類型下),這樣D中就有了2份的A中的同名變量了。

如圖所示,這時候需要在前面加上作用域限定符才能區分。但是使用了虛基類的方法會避免這些問題。見下

但如果是使用虛基類的命名方法,使得在繼承間接共同基類時只保留一份成員。
在聲明派生類時,指定繼承方式時聲明的。如:class B:virtual public A

3.在一個類中以另一個類的對象作為數據成員的,稱為類的組合

四.多態和虛函數:

1.靜態多態性是通過函數的重載實現的(運算符重載實質上也算函數重載)。

動態多態性是指程序在運行過程中才動態地確定操作的那個對象的類型。又叫做運行時多態。運行時多態通過虛函數實現。

2.虛函數的作用是允許在派生類中重新定義與基類同名的函數,並且可以通過基類指針或引用來訪問 基類和派生類 中的同名函數。

成員函數在類的繼承中根據需求可以擴展更改功能,如果需要更改功能的,一般應將它聲明為虛函數

3.使用虛函數,系統要有一定的空間開銷。
當一個類帶有虛函數時,編譯系統會為該類構造一個虛函數表(vitual function table,簡稱vtable),它是一個指針數組,存放每個虛函數的入口地址。
系統在進行動態關聯的時間開銷是很小的,因此不影響效率,多態性是高效的。

4.虛析構函數:避免發生(系統只會執行基類的析構函數,而不執行派生類的析構函數):當基類的析構函數為虛函數時,無論指針指的是同一類族的哪一個對象,系統都會采用這種動態關聯,調用其相應的析構函數,對該對象進行清理工作。

最好做法是:把基類的析構函數聲明為虛函數,這將使得所有派生類的析構函數都自動變成虛函數。

5.純虛函數是在聲明虛函數時被“初始化”為0的函數。
如:virtual 函數類型 函數名 (函數列表) = 0

6.抽象類的作用:為一個類族提供一個公共接口。凡是包含純虛函數的類都是抽象類。
因為純虛函數不能被調用,包含純虛函數的類是無法建立對象的。

五.多態實現機制

1.一旦某個函數在基類中聲明為virtual,那麼在所有的派生類中該函數都是virtual,而不是需要再顯式地聲明為virtual。
遲綁定(late binding)技術

2.虛表指針在什麼時候,或說在什麼地方初始化呢?
答案是在構造函數中進行虛表的創建和虛表指針的初始化

3.對於虛函數調用來說,每一個對象內部都有一個虛表指針,該虛表指針被初始化為本類的虛表。
所以在程序中,不管你的對象類型如何轉換,but該對象內部的虛表指針是固定的,所以才能實現動態的對象函數調用,這是C++函數多態性實現的原理。

4.C++的多態性大致概括即是:在基類的函數前加上virtual關鍵字,在派生類中重寫該函數,運行時會根據對象的具體類型來調用相應的函數。
如果對象類型是派生類,就調用派生類的函數;如果對象類型是基類,就調用基類的函數

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved