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.當用類的一個對象去初始化該類的另一個對象時系統自動調用拷貝構造函數實現賦值。
為什么基類的析構函數一定要定義為虛函數?
在實現多態時,當用基類操作派生類,保證先釋放派生類再釋放基類,防止只析構基類而不析構派生類造成內存泄露的狀況發生。
【用基類指針去接收申請的包含派生類對象的空間,當這個指針完成任務之后,我們需要delete掉,防止內存泄漏,我們期望空間中的對象調用自己的析構函數,完成空間的釋放,然后事實是程序只析構了基類,并沒有析構派生類,造成了內存泄漏?!?/p>
純虛函數和不能實例化的抽象類存在的必要性?
(含有純虛函數的類稱為抽象類,抽象類不能實例化)
有時在基類中無法給出基類中虛函數的實現代碼,只是需要提供一個接口等待派生類具體描述其行為
虛基類的含義及作用:
虛基類是一種派生方式,用來解決多重多級繼承造成的二義性問題,保證派生類只有一個基類對象(例如類B和類C繼承于類A,如果類D同時繼承類B和類C,類E的一個對象里面包含兩個基類A的對象 ==》將B和C的繼承方式改為虛繼承,將D里A的對象統一為一個,只有一個基類A對象)
虛基類的構造函數只能被調用一次,由最派生類調用
為什么要進行運算符的重載?
解決類對象之間的運算,讓編譯器在遇到對象運算時能按我們要求的進行運算,使代碼更為簡潔優美,增加代碼可讀性
基類和派生類:
(1)為什么基類指針指向派生類對象時,只能調用派生類從基類繼承的公有成員,不能訪問新增的成員?
基類指針和派生類對象的地址在內存空間所占的長度不一樣,當使用基類指針指向派生類對象時,它的地址與派生類對象首地址相同,但地址在內存空間的長度沒有發生改變,仍然只含有基類成員的部分。
解決方法:
1.通過虛函數,可以調用派生類成員(聲明虛函數,意味著該成員函數在派生類中可能被重新定義)
2.強制轉換為派生類指針
(2)為什么強制將基類指針轉化為派生類指針后可以訪問派生類對象的成員?
基類指針強制轉化為派生類指針,值沒有變化,變化的只有數據類型,即指針類型從基類指針變成派生類指針,內存的首地址沒有發生變化,變成可以訪問整個派生類對象的成員
(3)為什么派生類指針不能指向基類對象?
基類對象只能訪問基類對象的內存空間,當用派生類指針指向基類對象的時候,相當于拓展了基類對象指針所能訪問的空間,會訪問到基類的外部,不安全。
總結
以上是生活随笔為你收集整理的C++重要知识点总结(简答题,期末考试 面向对象难点 类和对象)精华在后面的全部內容,希望文章能夠幫你解決所遇到的問題。