天天看點

C++重要知識點總結(簡答題,期末考試 面向對象難點 類和對象)精華在後面

期末考試時總結的一些知識點,希望能對大家有幫助。

總結了自己不太熟悉的點+時間有限,可能不夠全面,大家見諒。

因為是自己總結+各方尋找資料,可能會有不正确不準确的地方,歡迎指出 ^^

一、C++語言基礎

1,程式由語句組成,語句由基本要素(單詞)組成

2,數組:具有相同類型資料的有序集合

3,C++語言沒有提供字元串類型,字元串變量是作為一維字元數組來處理

​ 字元串是一個數組+可以通過指針使用數組==>通過指針使用字元串

​ char *ps=“Hello” 不安全:*ps可改變,字元串是常量,是以建議改為const char *ps=“Hello”

基本要素包括:

辨別符(程式員定義,字母、數字、下劃線,首位不能是數字)

關鍵字(C++編譯器預定義,具有固定含義)、

變量(占記憶體,可以賦不同的值)、常量(不占記憶體)、

運算符(進行運算就是調用一個函數)、

表達式(由常量、變量、函數調用和運算符組成,每個表達式都将産生一個值)
           

面向對象及其程式設計的基本概念:

面向對象 = 對象 + 類 + 繼承 + 消息

面向對象程式設計:把一個複雜的系統分解成多個功能獨立對象(類),然後把這些對象組合起來,完成系統的功能。

對象:具有責任的實體

哪些是聲明語句,執行語句?

聲明語句:聲明變量和函數的語句

執行語句:包括指派語句、表達式語句、函數調用語句和流程控制語句等,通知計算機完成一定的操作

為什麼要有變量的類型?可以沒有嗎?

不可以。(不同類型的變量在記憶體中占的空間大小不同,且編譯器對不同類型的變量處理方式不同,隻有知道變量類型,編譯器才能為變量配置設定空間,并且對其進行操作處理)

變量塊存的是位址即記憶體中的起點,變量類型決定位址的長度即記憶體塊的終點,隻有知道了記憶體塊的起點和終點才能将記憶體塊中的資料完整的取出來

數組的維數為什麼要是常量表達式,可以是變量嗎?

在預編譯階段編譯器就會為該數組配置設定空間,如果無法确定數組大小則無法配置設定空間,是以必須是常量表達式

資料類型包括:

基本資料類型、指針類型和構造類型三大類。構造類型包括數組、結構和枚舉等類型。

基本資料類型:number, string, boolean, null, undefined, symbol, Biglnt

(1)C++預定義的資料類型,包括字元型、整數型、實型(單精度和雙精度)和空值型。

(2)每種基本資料類型都使用一個關鍵字來表示。

(3)類型修飾符:signed、unsigned、short、long

靜态資料成員的作用

不破壞封裝性,解決對象之間的通信,實作資料共享

聲明:static <資料類型><靜态成員名>
初始化時機:<資料類型><類名>::<靜态資料成員名> = <初始值>
           

靜态成員的通路:

通過對象通路:person::m_nCount

通過類名通路:CPerson::m_nCount

二、類和對象,繼承與多态

(1)什麼是對象

在計算機科學中,對象是系統中用來描述客觀事物的一個實體,具有自己特定的屬性和行為,是用來構成系統的一個基本機關,而系統可以看作是由一系列互相作用的對象組成,

(2)什麼是類

類定義了同類對象的公共屬性和行為,屬性用資料結構表示,行為用函數表示。

可以用如下公式表示:

類 = 資料結構 + 對資料進行操作的函數

(3)對象和類的關系

對象是類的一個執行個體,是以對象和類的關系相當于元素與集合的關系、變量與變量的“資料類型”的關系。

内聯函數存在的意義及弊端:

通過編譯器預處理,在調用内聯函數的地方将内聯函數内的語句Copy到調用函數的地方,進而提高了效率,減少了一些不必要的開銷。

使用内聯函數後雖然調用函數的開銷降低了,但内聯函數會導緻主函數指令增多、函數體積增大等情況。

常指針he常值變量指針:

常值變量指針:(可以指向常值變量或普通變量)

const int *p

指向常量的指針,不能通過常指針來改變所指對象的值,但常指針本身可以改變,可以指向另外的對象
           

常指針:(隻能指向普通變量)

int* const p

指針本身的位址不能被改變,但是它位址所指向的值可以改變
           

面向對象程式設計四個基本特征及其含義:

(1)抽象:對一類對象進行概括,抽出它們的共同特質并加以描述的過程,抽象的過程就是對問題進行分析和認識的過程

(2)封裝:将抽象得到的屬性資料和行為代碼有機地結合,形成一個具有類特征的整體(避免了外部與對象的影響)

(3)繼承:繼承是指一個新類可以從已有的類派生而來,解決軟體的重用問題。(新類繼承了原有類的特性即屬性和行為,新類還可以對原有類的行為進行修改,增加新的屬性和行為)

(4)多态性:指類中具有相似功能的不同函數使用一個名稱來實作,允許不同類的對象對同一消息作出不同的反應

編譯時多态(靜态多态):在函數名或運算符相同的情況下,編譯器在編譯階段就能夠根據函數參數類型的不同來确定要調用的函數—通過重載實作

運作時多态(動态多态):在函數名、函數參數和傳回類型都相同的情況下,隻能在程式運作時才能确定要調用的函數—通過虛函數實作、

為什麼初始化成員變量不能在類定義的時候進行?如何初始化成員變量?

成員變量的值屬于每一個具體的對象,類定義的時候無法确定成員變量的值屬于哪一個對象。成員變量一般是是私有的,不能在類外被通路,是以通過類的構造函數進行初始化。

靜态成員函數與成員、靜态成員、成員變量、靜态成員變量

一般的成員函數可以通路靜态成員

靜态成員函數隻能通路靜态成員和靜态成員變量

命名空間及其意義:

(1)命名空間:是名額識符的各種可見範圍,利用命名空間可以通過建立作用範圍來對全局命名進行分割。

(2)如果沒有命名空間,變量、函數和類都存在于同一個全局命名空間中,可能會由于同名問題而産生沖突

(3)本質上來講,一個命名空間确定了一個命名空間作用域

(4)命名空間是對一些成員進行聲明的一個描述性區域,在命名空間中聲明的任何成員都會局限于該命名空間内

(5)如果命名空間中的成員在該命名空間外被使用,必須加上作用域限制符:: 例如std::

構造函數及其意義(沒有傳回類型):

構造函數:不需要函數調用語句,就能在建立對象時由系統自動調用。

作用:在對象被建立時使用特定的值去構造對象,使得在聲明對象時就能自動地完成對象的初始化。

構造函數可以定義為虛函數嗎?

不能,虛函數需要通過對應的虛指針vtable來調用,而這個虛指針是對象建立完畢才有的。

構造函數帶預設參數的好處:

增強容錯性,當使用者忘記傳參數或傳參數的數量不足時,程式仍然會執行

析構函數及其意義(沒有傳回類型,不能有參數):

析構函數:在對象的生存周期即将結束時被系統自動調用。

作用:在對象被删除前做一些清理善工作和資料儲存工作。

拷貝構造函數及其意義:

拷貝構造函數:用來完成基于對象的同一類其他對象的構造及其初始化。

隻有一個函數參數:本類對象的引用(把一個已有對象的資料成員指派給新建立的對象)

預設拷貝構造函數是淺拷貝,存在安全風險

淺拷貝:藕斷絲連, 隻進行基本資料類型的拷貝,兩個對象的指針指向同一個位址,隻拷貝了一個引用

深拷貝:恩斷義絕,拷貝了對象所有屬性,兩者完全獨立

B複制了A,當修改A時,看B是否會發生變化,如果B也跟着變了,說明這是淺拷貝,拿人手短,如果B沒變,那就是深拷貝,自食其力。

調用拷貝構造函數的時機:

1.當用類的一個對象去初始化該類的另一個對象時系統自動調用拷貝構造函數實作指派。

  1. 若函數的形參為類對象,調用函數時,實參指派給形參,系統自動調用拷貝構造函數。
  2. 當函數的傳回值是類對象時,系統自動調用拷貝構造函數。

為什麼基類的析構函數一定要定義為虛函數?

在實作多态時,當用基類操作派生類,保證先釋放派生類再釋放基類,防止隻析構基類而不析構派生類造成記憶體洩露的狀況發生。

【用基類指針去接收申請的包含派生類對象的空間,當這個指針完成任務之後,我們需要delete掉,防止記憶體洩漏,我們期望空間中的對象調用自己的析構函數,完成空間的釋放,然後事實是程式隻析構了基類,并沒有析構派生類,造成了記憶體洩漏。】

C++重要知識點總結(簡答題,期末考試 面向對象難點 類和對象)精華在後面

純虛函數和不能執行個體化的抽象類存在的必要性?

(含有純虛函數的類稱為抽象類,抽象類不能執行個體化)

有時在基類中無法給出基類中虛函數的實作代碼,隻是需要提供一個接口等待派生類具體描述其行為

虛基類的含義及作用:

虛基類是一種派生方式,用來解決多重多級繼承造成的二義性問題,保證派生類隻有一個基類對象(例如類B和類C繼承于類A,如果類D同時繼承類B和類C,類E的一個對象裡面包含兩個基類A的對象 ==》将B和C的繼承方式改為虛繼承,将D裡A的對象統一為一個,隻有一個基類A對象)

虛基類的構造函數隻能被調用一次,由最派生類調用

為什麼要進行運算符的重載?

解決類對象之間的運算,讓編譯器在遇到對象運算時能按我們要求的進行運算,使代碼更為簡潔優美,增加代碼可讀性

基類和派生類:

(1)為什麼基類指針指向派生類對象時,隻能調用派生類從基類繼承的公有成員,不能通路新增的成員?

基類指針和派生類對象的位址在記憶體空間所占的長度不一樣,當使用基類指針指向派生類對象時,它的位址與派生類對象首位址相同,但位址在記憶體空間的長度沒有發生改變,仍然隻含有基類成員的部分。

解決方法:

1.通過虛函數,可以調用派生類成員(聲明虛函數,意味着該成員函數在派生類中可能被重新定義)

2.強制轉換為派生類指針

(2)為什麼強制将基類指針轉化為派生類指針後可以通路派生類對象的成員?

基類指針強制轉化為派生類指針,值沒有變化,變化的隻有資料類型,即指針類型從基類指針變成派生類指針,記憶體的首位址沒有發生變化,變成可以通路整個派生類對象的成員

(3)為什麼派生類指針不能指向基類對象?

基類對象隻能通路基類對象的記憶體空間,當用派生類指針指向基類對象的時候,相當于拓展了基類對象指針所能通路的空間,會通路到基類的外部,不安全。

繼續閱讀