C++重要知识点总结(简答题,期末考试 面向对象难点 类和对象)精华在后面
期末考試時總結(jié)的一些知識點,希望能對大家有幫助。
一、C++語言基礎(chǔ)
1,程序由語句組成,語句由基本要素(單詞)組成
2,數(shù)組:具有相同類型數(shù)據(jù)的有序集合
3,C++語言沒有提供字符串類型,字符串變量是作為一維字符數(shù)組來處理
? 字符串是一個數(shù)組+可以通過指針使用數(shù)組==>通過指針使用字符串
? char *ps=“Hello” 不安全:*ps可改變,字符串是常量,所以建議改為const char *ps=“Hello”
基本要素包括:
標識符(程序員定義,字母、數(shù)字、下劃線,首位不能是數(shù)字)關(guān)鍵字(C++編譯器預(yù)定義,具有固定含義)、變量(占內(nèi)存,可以賦不同的值)、常量(不占內(nèi)存)、運算符(進行運算就是調(diào)用一個函數(shù))、表達式(由常量、變量、函數(shù)調(diào)用和運算符組成,每個表達式都將產(chǎn)生一個值)面向?qū)ο蠹捌涑绦蛟O(shè)計的基本概念:
面向?qū)ο?= 對象 + 類 + 繼承 + 消息
面向?qū)ο蟪绦蛟O(shè)計:把一個復(fù)雜的系統(tǒng)分解成多個功能獨立對象(類),然后把這些對象組合起來,完成系統(tǒng)的功能。
對象:具有責(zé)任的實體
哪些是聲明語句,執(zhí)行語句?
聲明語句:聲明變量和函數(shù)的語句
執(zhí)行語句:包括賦值語句、表達式語句、函數(shù)調(diào)用語句和流程控制語句等,通知計算機完成一定的操作
為什么要有變量的類型?可以沒有嗎?
不可以。(不同類型的變量在內(nèi)存中占的空間大小不同,且編譯器對不同類型的變量處理方式不同,只有知道變量類型,編譯器才能為變量分配空間,并且對其進行操作處理)
變量塊存的是地址即內(nèi)存中的起點,變量類型決定地址的長度即內(nèi)存塊的終點,只有知道了內(nèi)存塊的起點和終點才能將內(nèi)存塊中的數(shù)據(jù)完整的取出來
數(shù)組的維數(shù)為什么要是常量表達式,可以是變量嗎?
在預(yù)編譯階段編譯器就會為該數(shù)組分配空間,如果無法確定數(shù)組大小則無法分配空間,所以必須是常量表達式
數(shù)據(jù)類型包括:
基本數(shù)據(jù)類型、指針類型和構(gòu)造類型三大類。構(gòu)造類型包括數(shù)組、結(jié)構(gòu)和枚舉等類型。
基本數(shù)據(jù)類型:number, string, boolean, null, undefined, symbol, Biglnt
(1)C++預(yù)定義的數(shù)據(jù)類型,包括字符型、整數(shù)型、實型(單精度和雙精度)和空值型。
(2)每種基本數(shù)據(jù)類型都使用一個關(guān)鍵字來表示。
(3)類型修飾符:signed、unsigned、short、long
靜態(tài)數(shù)據(jù)成員的作用
不破壞封裝性,解決對象之間的通信,實現(xiàn)數(shù)據(jù)共享
聲明:static <數(shù)據(jù)類型><靜態(tài)成員名> 初始化時機:<數(shù)據(jù)類型><類名>::<靜態(tài)數(shù)據(jù)成員名> = <初始值>靜態(tài)成員的訪問:
通過對象訪問:person::m_nCount
通過類名訪問:CPerson::m_nCount
二、類和對象,繼承與多態(tài)
(1)什么是對象
在計算機科學(xué)中,對象是系統(tǒng)中用來描述客觀事物的一個實體,具有自己特定的屬性和行為,是用來構(gòu)成系統(tǒng)的一個基本單位,而系統(tǒng)可以看作是由一系列相互作用的對象組成,
(2)什么是類
類定義了同類對象的公共屬性和行為,屬性用數(shù)據(jù)結(jié)構(gòu)表示,行為用函數(shù)表示。
可以用如下公式表示:
類 = 數(shù)據(jù)結(jié)構(gòu) + 對數(shù)據(jù)進行操作的函數(shù)
(3)對象和類的關(guān)系
對象是類的一個實例,因此對象和類的關(guān)系相當于元素與集合的關(guān)系、變量與變量的“數(shù)據(jù)類型”的關(guān)系。
內(nèi)聯(lián)函數(shù)存在的意義及弊端:
通過編譯器預(yù)處理,在調(diào)用內(nèi)聯(lián)函數(shù)的地方將內(nèi)聯(lián)函數(shù)內(nèi)的語句Copy到調(diào)用函數(shù)的地方,從而提高了效率,減少了一些不必要的開銷。
使用內(nèi)聯(lián)函數(shù)后雖然調(diào)用函數(shù)的開銷降低了,但內(nèi)聯(lián)函數(shù)會導(dǎo)致主函數(shù)指令增多、函數(shù)體積增大等情況。
常指針he常值變量指針:
常值變量指針:(可以指向常值變量或普通變量)
const int *p指向常量的指針,不能通過常指針來改變所指對象的值,但常指針本身可以改變,可以指向另外的對象常指針:(只能指向普通變量)
int* const p指針本身的地址不能被改變,但是它地址所指向的值可以改變面向?qū)ο蟪绦蛟O(shè)計四個基本特征及其含義:
(1)抽象:對一類對象進行概括,抽出它們的共同特質(zhì)并加以描述的過程,抽象的過程就是對問題進行分析和認識的過程
(2)封裝:將抽象得到的屬性數(shù)據(jù)和行為代碼有機地結(jié)合,形成一個具有類特征的整體(避免了外部與對象的影響)
(3)繼承:繼承是指一個新類可以從已有的類派生而來,解決軟件的重用問題。(新類繼承了原有類的特性即屬性和行為,新類還可以對原有類的行為進行修改,增加新的屬性和行為)
(4)多態(tài)性:指類中具有相似功能的不同函數(shù)使用一個名稱來實現(xiàn),允許不同類的對象對同一消息作出不同的反應(yīng)
編譯時多態(tài)(靜態(tài)多態(tài)):在函數(shù)名或運算符相同的情況下,編譯器在編譯階段就能夠根據(jù)函數(shù)參數(shù)類型的不同來確定要調(diào)用的函數(shù)—通過重載實現(xiàn)
運行時多態(tài)(動態(tài)多態(tài)):在函數(shù)名、函數(shù)參數(shù)和返回類型都相同的情況下,只能在程序運行時才能確定要調(diào)用的函數(shù)—通過虛函數(shù)實現(xiàn)、
為什么初始化成員變量不能在類定義的時候進行?如何初始化成員變量?
成員變量的值屬于每一個具體的對象,類定義的時候無法確定成員變量的值屬于哪一個對象。成員變量一般是是私有的,不能在類外被訪問,所以通過類的構(gòu)造函數(shù)進行初始化。
靜態(tài)成員函數(shù)與成員、靜態(tài)成員、成員變量、靜態(tài)成員變量
一般的成員函數(shù)可以訪問靜態(tài)成員
靜態(tài)成員函數(shù)只能訪問靜態(tài)成員和靜態(tài)成員變量
命名空間及其意義:
(1)命名空間:是指標識符的各種可見范圍,利用命名空間可以通過創(chuàng)建作用范圍來對全局命名進行分割。
(2)如果沒有命名空間,變量、函數(shù)和類都存在于同一個全局命名空間中,可能會由于同名問題而產(chǎn)生沖突
(3)本質(zhì)上來講,一個命名空間確定了一個命名空間作用域
(4)命名空間是對一些成員進行聲明的一個描述性區(qū)域,在命名空間中聲明的任何成員都會局限于該命名空間內(nèi)
(5)如果命名空間中的成員在該命名空間外被使用,必須加上作用域限制符:: 例如std::
構(gòu)造函數(shù)及其意義(沒有返回類型):
構(gòu)造函數(shù):不需要函數(shù)調(diào)用語句,就能在創(chuàng)建對象時由系統(tǒng)自動調(diào)用。
作用:在對象被創(chuàng)建時使用特定的值去構(gòu)造對象,使得在聲明對象時就能自動地完成對象的初始化。
構(gòu)造函數(shù)可以定義為虛函數(shù)嗎?
不能,虛函數(shù)需要通過對應(yīng)的虛指針vtable來調(diào)用,而這個虛指針是對象創(chuàng)建完畢才有的。
構(gòu)造函數(shù)帶默認參數(shù)的好處:
增強容錯性,當用戶忘記傳參數(shù)或傳參數(shù)的數(shù)量不足時,程序仍然會執(zhí)行
析構(gòu)函數(shù)及其意義(沒有返回類型,不能有參數(shù)):
析構(gòu)函數(shù):在對象的生存周期即將結(jié)束時被系統(tǒng)自動調(diào)用。
作用:在對象被刪除前做一些清理善工作和數(shù)據(jù)保存工作。
拷貝構(gòu)造函數(shù)及其意義:
拷貝構(gòu)造函數(shù):用來完成基于對象的同一類其他對象的構(gòu)造及其初始化。
只有一個函數(shù)參數(shù):本類對象的引用(把一個已有對象的數(shù)據(jù)成員賦值給新創(chuàng)建的對象)
默認拷貝構(gòu)造函數(shù)是淺拷貝,存在安全風(fēng)險
淺拷貝:藕斷絲連, 只進行基本數(shù)據(jù)類型的拷貝,兩個對象的指針指向同一個地址,只拷貝了一個引用
深拷貝:恩斷義絕,拷貝了對象所有屬性,兩者完全獨立
B復(fù)制了A,當修改A時,看B是否會發(fā)生變化,如果B也跟著變了,說明這是淺拷貝,拿人手短,如果B沒變,那就是深拷貝,自食其力。
調(diào)用拷貝構(gòu)造函數(shù)的時機:
1.當用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)實現(xiàn)賦值。
為什么基類的析構(gòu)函數(shù)一定要定義為虛函數(shù)?
在實現(xiàn)多態(tài)時,當用基類操作派生類,保證先釋放派生類再釋放基類,防止只析構(gòu)基類而不析構(gòu)派生類造成內(nèi)存泄露的狀況發(fā)生。
【用基類指針去接收申請的包含派生類對象的空間,當這個指針完成任務(wù)之后,我們需要delete掉,防止內(nèi)存泄漏,我們期望空間中的對象調(diào)用自己的析構(gòu)函數(shù),完成空間的釋放,然后事實是程序只析構(gòu)了基類,并沒有析構(gòu)派生類,造成了內(nèi)存泄漏。】
純虛函數(shù)和不能實例化的抽象類存在的必要性?
(含有純虛函數(shù)的類稱為抽象類,抽象類不能實例化)
有時在基類中無法給出基類中虛函數(shù)的實現(xiàn)代碼,只是需要提供一個接口等待派生類具體描述其行為
虛基類的含義及作用:
虛基類是一種派生方式,用來解決多重多級繼承造成的二義性問題,保證派生類只有一個基類對象(例如類B和類C繼承于類A,如果類D同時繼承類B和類C,類E的一個對象里面包含兩個基類A的對象 ==》將B和C的繼承方式改為虛繼承,將D里A的對象統(tǒng)一為一個,只有一個基類A對象)
虛基類的構(gòu)造函數(shù)只能被調(diào)用一次,由最派生類調(diào)用
為什么要進行運算符的重載?
解決類對象之間的運算,讓編譯器在遇到對象運算時能按我們要求的進行運算,使代碼更為簡潔優(yōu)美,增加代碼可讀性
基類和派生類:
(1)為什么基類指針指向派生類對象時,只能調(diào)用派生類從基類繼承的公有成員,不能訪問新增的成員?
基類指針和派生類對象的地址在內(nèi)存空間所占的長度不一樣,當使用基類指針指向派生類對象時,它的地址與派生類對象首地址相同,但地址在內(nèi)存空間的長度沒有發(fā)生改變,仍然只含有基類成員的部分。
解決方法:
1.通過虛函數(shù),可以調(diào)用派生類成員(聲明虛函數(shù),意味著該成員函數(shù)在派生類中可能被重新定義)
2.強制轉(zhuǎn)換為派生類指針
(2)為什么強制將基類指針轉(zhuǎn)化為派生類指針后可以訪問派生類對象的成員?
基類指針強制轉(zhuǎn)化為派生類指針,值沒有變化,變化的只有數(shù)據(jù)類型,即指針類型從基類指針變成派生類指針,內(nèi)存的首地址沒有發(fā)生變化,變成可以訪問整個派生類對象的成員
(3)為什么派生類指針不能指向基類對象?
基類對象只能訪問基類對象的內(nèi)存空間,當用派生類指針指向基類對象的時候,相當于拓展了基類對象指針所能訪問的空間,會訪問到基類的外部,不安全。
總結(jié)
以上是生活随笔為你收集整理的C++重要知识点总结(简答题,期末考试 面向对象难点 类和对象)精华在后面的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《需求规格说明书》
- 下一篇: springboot +mysql“友书