筆記——2

列舉並解釋c++中的4種運算符轉化以及它們的不同點
1.const_cast操作符:用來幫助調用哪些應該使用卻沒有使用const關鍵字的函數。換句話說,就是供程序設計師
在特殊情況下將限制爲const成員函數的const定義解除,使其能更改特定屬性


2.dynamic_cast操作符:如果啓動了支持運行時間類型信息(RTTI),dynamic_cast可以有助於判斷在運行時所指向對象的
確切類型。它與typeid運算符有關。可以將一個基類的指針指向許多不同的子類型(派生類),然後將被轉換基礎
類的對象還原成原來的類。不過,限於對象指針的類型轉換,而非對象變量。


3.reintrpret_case操作符:將一個指針轉換其他類型的指針,新類型的指針與舊指針可以毫不相關。通常
用於某些非標準的指針數據類型轉換,如何將void*轉換爲char*。它可以用在指針和整型數之間的類型轉換上。注意:
它存在潛在的危險,除非有使用它的充分理由,否則就不要使用它。例如,它能夠將一個int*的指針轉換爲float*類型
的指針,但是這樣就會很容易造成整數數據不能被正確的讀取


4.static_cast操作符:它能在相關的對象和指針類型之間進行類型轉換.有關的類之間必須通過繼承,構造
函數或者轉換函數發生聯繫。static_cast操作符還能在數字(原始的)類型之間進行類型轉換。通常情況下,
static_cast操作符大多用於將數域寬度較大的類型轉換爲較小的類型。當轉換類型是原始數據類型時,這種
操作可以有效禁止編譯器發送警告


描述面向對象技術的基本概念
類:具有相似的內部狀態和運動規律的實體集合。類來自人們認識自然,認識社會的過程。在這一過程中,
人們主要使用兩種方法:由特殊到一般的歸納法和由一般到特殊的演繹法。在歸納的過程中,從一個個具體的事物中把共同的
特徵
抽取出來,形成一個一般的概念。在演繹的過程中又把同類的事物,根據不同的特徵分成不同的小類。


對象:指現實世界中各種各樣的實體,也就是類的示例。它既可以指具體的事物,也可以指抽象的事物。每個
對象都有自己的內部狀態和事物。


消息:指對象間相互聯繫和相互作用的方式。一個消息主要由5部分組成:發送消息的對象,接收消息的對象,
消息傳遞的方法,消息內容,反饋。


類的特徵:抽象,繼承,封裝,重載和多肽


class和struct有什麼區別
1.C語言的struct與C++的class的區別:struct只是作爲一鍾複雜數據類型定義,不能用於面向對象編程
2.C++中的strcut和class的區別:對於成員訪問權限以及繼承方法,class中默認是private的,而struct中
則是public的。class還可以用於表示模板類型,struct則不行。


與全局對象相比,使用靜態數據成員有什麼優勢
主要有以下兩種優勢
1.靜態數據成員沒有進入程序的全局名字空間,因此不存在程序中其他全局名字衝突的可能性
2.使用靜態數據成員可以隱藏信息。因爲靜態成員可以是private成員,而全局對象不能


有哪幾種情況只能用initalization list,而不能用assignment
當類中含有const,reference成員變量和基類的構造函數時都需要初始化列表


main函數執行前還會執行什麼代碼
全局對象的構造函數會在main函數之前執行


C++中的空類默認會產生哪些類成員函數
C++的空類中,默認會產生默認構造函數,複製構造函數,析構函數,賦值函數以及取值運算


構造函數和析構函數是否可以被重載
1.構造函數可以被重載,因爲構造函數可以有多個,且可以帶參數
2.析構函數不可以被重載,因爲析構函數只能有一個,且不能帶參數




構造函數explicit與普通構造函數的區別
普通構造函數能夠被隱式調用,而explicit構造函數只能被顯示調用(不能通過等號運算符操作)


析構函數的執行順序
在main函數中定義了兩個類B的對象,它們的基類是A。由於這兩個對象都是在棧中分配的,當main函數退出
時會發生析構,又因爲obj1比obj2先聲明,所以obj2先析構。它們析構的順序是首先執行B的析構函數,
然後執行A的析構函數 


編譯器與默認的copy constructor
如果用戶沒有自定義複製構造函數,並且在代碼中用到了複製構造函數,那麼編譯器就會生成默認的複製
構造函數;但如果用戶定義了複製構造函數,那麼編譯器就不會再生成複製構造函數
如果用戶定義了一個構造函數,且不是複製構造函數,而此時在代碼中用到了複製構造函數,那麼編譯器
也還會生成默認的複製構造函數;如果沒有使用,則編譯器就不會生成默認的複製構造函數


複製構造函數與賦值函數有什麼區別
1.複製構造函數時一個對象來初始化一塊內存區域,這塊內存就是新對象的內存區。
例如:
class A;
A a;
A b = a;   複製構造函數調用
A b(a);    複製構造函數調用
  
而賦值函數就是一個已經被初始化的對象來進行operator=操作。例如
class A;
A a;
A b;
b = a;//賦值函數調用


2.一般來說在數據成員包含指針對象的時候,應付兩種不同的處理需求: 一種是複製指針對象,一種是引用指針
對象。複製構造函數在大多數情況下是複製,賦值函數則是引用對象


3.實現不一樣。複製構造函數首先是一個構造函數,它調用的時候是通過參數參數傳進來的那個對象初始化產生了一個對象。
賦值函數則是把一個對象賦值給一個原有的對象,所以,如果原來的對象有內存分配,要先把內存釋放掉,
而且還要檢查一下兩個對象是不是同一個對象,如果是的話,就不做任何操作


重載和重寫的區別?
重載是編寫一個與已有函數同名但是參數表不同(參數數量或參數類型不同)的方法,它具有如下所示的特徵:
1.方法名必須相同
2.參數列表必須不相同,與參數類別的順序無關
3.返回值類型可以不相同


重寫是派生類重寫基類的虛函數,它具有如下所示的特徵
1.只有虛方法和抽象方法才能夠被覆蓋(重寫)
2.相同的函數名
3.相同的參數列表
4.相同的返回值類型


C++中的繼承主要有3種關係:public,protected和private
1.public繼承
public繼承是一種接口繼承,子類可以代替父類完成接口所聲明的行爲。此時子類可以自動轉換爲父類
接口。從語法角度上來說,public繼承會保留父類中成員(包括函數和變量等)的可見性不變,也就是說,如果
父類中的某個函數時public的,那麼在被子類繼承後仍然是public的
2.protected繼承
protected繼承是一種實現繼承,子類不能代替父類完成接口所聲明的行爲,此時子類不能自動轉換成父類
的接口。從語法角度來說,protected繼承會將父類中的public的可見性的成員修改爲protected可見性,相當於
在子類中引入了protecteded成員,這樣在子類中還是同樣可以調用父類的protecteded和public成員,子類
的子類也就可以調用被protecteded繼承的父類的protected和public成員
3.private繼承
private繼承是一種實現繼承,子類不能代替父類完成父類接口所聲明的行爲,此時子類不能自動轉換誒爲
父類的接口。從語法的角度來講,private繼承會將父類中的public和protected可見性的成員修改爲private可見性
這樣一來,雖然子類中同樣還是可以調用父類的protected和public成員,但是子類的子類就不可以調用
private繼承的父類的成員了


什麼是多態
多態的定義:同一操作作用於不同對象,可以有不同的解釋,產生不同的執行結果。有兩種類型的多態性;
1.編譯時的多態性。編譯時的多態性是通過重載來實現的。對於非虛的成員來說,系統在編譯時,根據
傳遞的參數,返回的類型等信息決定實現何種操作。
2.運行時的多態。運行時的多態性就是指直到系統運行時,才根據實際情況決定實現何種操作。C++中,
運行時的多態通過虛成員實現。


爲什麼需要引入抽象基類和純虛函數
純虛函數在基類中沒有定義的,必須在子類中加以實現,很像java中的接口函數。如果基類含有一個或多個純虛函數,
那麼它就屬於抽象基類,不能被實例化
爲什麼要引入抽象基類和純虛函數呢?原因有以下兩點
1.爲了方便使用多態
2.在很多情況下,基類本身生成對象是不合理的

虛函數和純虛函數的區別?
虛函數和純虛函數有以下方面的區別
1.類裏如果聲明瞭虛函數,這個函數是實現的,哪怕是空實現,它的作用就是爲了能讓這個函數在它的
子類裏面可以覆蓋,這樣編譯器就可以使用後期綁定來達到多態了。純虛函數只是一個接口,是個函數
的聲明而已,它要留到子類裏去實現

2.虛函數在子類裏面也可以不重載;但純虛函數必須在子類去實現,這就像java的接口一樣。通常把
很多函數加上virtual,是一個好的習慣,雖然犧牲了一些性能,但是增加了面向對象的多態性,因爲
很難預料到父類裏面的這個函數不在子類裏面不去修改它的實現

3.虛函數的類用於"實作繼承",也就是說繼承接口的同時也繼承了父類的實現。當然,大家也可以完成自己的實現。
純虛函數的類用於"介面繼承",即純虛函數關注的是接口的統一性,實現由子類完成。

4.代純虛函數的類叫虛基類,這種基類不能直接生成對象,而只有被繼承,並重寫其虛函數,才能使用。
這樣的類也叫抽象類
發佈了54 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章