某個文件中定義的靜態全局變量(或稱靜態局部變量)作用域是------本文件內
①:默認繼承權限:
class的繼承按照private繼承處理,struct的繼承按照public繼承處理
②:成員的默認訪問權限
class的成員默認是private權限, struct默認是public權限
註:C++有內置的宏__cplusplus -------有個習慣帶“__”表示內部變量,只供內部使用;不帶雙下劃線的,表示外部接口的變量(標識符)
C++函數的三種傳遞方式為:值傳遞。指針傳遞 和 引用傳遞
註:值傳遞和指針傳遞,本質上就是指針傳遞。
在A類中fun1是虛函數;B類中fun2是虛函數。
①:機制上:c是面向過程的(c也可以是面向對象發的程序); C++是面向對象,提供了類。C++的面向對象的程序比c容易。
②:使用方向:c適合代碼體積小的,效率高的場合,如嵌入式;C++更適合上層的,復雜的;Linux核心大部分是c寫的,因為他是系統軟件,效率要求極高
③:C++是c的超集;
④:C語言是結構化編程語言,C++是面向對象編程語言。
⑤:C++側重於對象而不是過程,側重於類的設計而不是邏輯設計。
C中struct主要提供的是自定義類型,和構造壹種新的類型出來;
壹致的地方:
不壹致的地方:
C語言: 無Protection行為; 不能定義函數,但可以有函數指針;
C++: 有Procetion行為,默認是private; 可以定義函數。
註: 就是訪問權限,struct對於外部是完全訪問的,C++是有訪問 權限 設置的;
正確, sizeof 是編譯時運算符,編譯時就確定了 可以看成是和及其有關的常量
註:定義數組的時候,數組的長度必須是壹個確定的常量;
形參:是在定義函數時指定的參數,在未調用時他們並不占用內存中的存儲單元。只有在調用的時候才會被分配內存,調用結束後,形參所占用的內存單元會被釋放
實參:即妳調用函數時傳遞的參數;
重載: 同壹個名字空間--- -函數名相同,參數列表不同 ; 註釋:理解成壹個類裏面的多個同名函數
重寫/覆蓋: 不同名字空間-----用於繼承,子類重新定義父類中 函數名相同,參數列表也相同 虛函數 的方法
重定義/隱藏:重定義(隱藏)是指派生類的函數屏蔽了與其同名的基類函數,規則如下:
a 如果派生類的函數和基類的 函數同名,但是參數不同 ,此時,不管有無virtual,基類的函數被隱藏。
b 如果派生類的函數與基類 的函數同名,並且參數也相同 ,但是基類函數沒有vitual關鍵字,此時,基類的函數被隱藏。
①: 隱藏 實現 細節 ,使得代碼能夠模塊化;擴展代碼模塊, 實現代碼重寫
②: 接口重用 :為了使用多個派生類中某個派生類的屬性正確調用
用sizeof的方法:
定義壹個指針P,打印出sizeof(P),如果結果是4,怎麽標識改操作系統是32位,如果打印結果是2,則標識是16位、。
虛函數 表 ,是在 編譯 期就建立了。各個虛函數被組織成壹個虛函數的入口地址的數組(簡而言之,就是組成了壹個存放虛函數地址的數組)
虛函數表 指針 是在 運行 時建立的,也就是構造函數被調用時進行初始化的。
封裝,繼承,多態 是什麽?怎那麽用?為什麽使用它?
封裝:將客觀事物抽象成類,每個類對自身的 數據 和 方法 實行 protection ; 註釋 : 保護內部成員
繼承:廣義的繼承有三種實現形式:
實現繼承:指使用基類的屬性和方法,而無需額外編碼的能力;
可視繼承:子窗體使用父窗體的外觀和實現代碼
接口繼承:僅使用屬性和方法,實現之後到子類實現
前兩種和後壹種構成了功能復用的兩種方法
多態: 主要是為了抽象
只要是函數都會做類型檢查。
這是內聯函數跟宏觀比的優勢。
①:靜態存儲區域分配; 內存在編譯的時候就已經分配好了,這塊內存在程序的整個運行期間都存在。例如全局變量。
②:在展區創建;在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時,自動被釋放。效率高,但是內存容量有限。
③:從堆上分配:或者叫:動態內存分配。程序員自己負責在何時用free或delete釋放內存。
C語言中用帶參數的宏定義,C++中用inline
生命周期不同 空間 周期
局部變量 函數調用時創建,結束時銷毀。static除外
局部變量不具有外部鏈接,全局變量
全局變量 : 靜態數據區
局部變量: 放在棧區
malloc、free是C++/C語言標準庫,new、delete是C++運算符。
註意:new、delete不是庫函數;
malloc/free 無法 滿足 對象在創建的時候要自動 執行 構造函 數,對象消亡之前要自動執行 析構函數 。他們是庫函數,而不是運算符,不在編譯器的控制權限內,。
new、delete 能完成內存的分配和釋放,已經初始化和清理工作。
判斷指針是否為空,如果空,則打印錯誤log,並且return,終止本函數。
不是,兩個不同類型的指針可以強制轉換。
動態申請;
知道運行時才知道壹個對象需要多少存儲空間,不需要知道對象的生存周期有多長。
Debug調試版本,它包含調試信息,比如assert的適用,並且不作任何優化,便於程序員調試程序。
Release稱為發布版本,他往往時進行了各種優化,
析構函數時特殊的類成員函數,沒有返回類型,沒有參數,不能隨意調用,也沒有重載,只有在類對象的生命周期結束時,有系統自己調用。優勢方內存空間的作用。
虛函數是C++多態的壹種表現,使用虛函數,我們可以靈活的進行動態綁定,當然是以壹定的開銷為代價
(這裏虛函數的適用還是不太懂,需要進壹步學習,比如怎麽調用子類的壹切啊)
導致文件描述符結構中指針指向的內存背重復釋放,進而導致壹些不可預期的異常。
比如全局變量的初始化,就不是有main函數引起的。例如:
全局對象的構造函數,會在main函數之前執行。
多態,純虛函數,抽象類
內聯函數
虛函數的特點:如果希望派生類能夠重新定義基類的方法,則在基類中將該方法定義為虛方法,這樣可以啟用動態聯編。
內聯函數的特點:使用內聯函數的目的屎我了提高函數的運行俠侶。內聯函數的代碼不能過長,因為內聯函數省去調用函數的時間是以代碼膨脹為代價的。內聯函數不能包含循環語句。因為執行循環語句要比調用函數的開銷大。
函數模板的實例化是由編譯程序在處理函數嗲用時自動完成的,
類模板的實例化必須由程序員在程序中顯示的指定
函數名和參數列表
不能被重載的運算符:
①:不能改變C++內部數據類型(如int float 等)的運算符
②:不能重載“.”,因為.在類中對任何成員都有意義,已經成為標準用法
③:不能重載目前C++運算符集合中沒有的符號,如:@, 等。願意:壹是難以理解,二是無法確定優先級
④:對已經存在的運算符重載不能改變優先級規則,否則將引起混亂。
有可能是派生類無法調用析構函數
模板可以說比較古老了,但是當前的泛型編程實質上就是模板編程。他體現了壹種通用和泛化的思想。
STL有7中容器:
vector(零食進行存儲數據的訪問),list(經常進行數據的增刪改查),deque(隊列結構),map,multimap,set(構造棧形的數據使用),multiset.
容器是壹種特定用途的類;
淺拷貝 知識拷貝了指針沒有拷貝資源
深拷貝進行了資源的拷貝
三元表達式“?:”問好後面的兩個操作數必須為同壹個類型。否則會出問題。
總的來說,堆是C語言和操作系統的術語,是操作系統維護的壹塊動態分配內存;自由存儲是C++中通過 new與delete動態分配和釋放對象的抽象概念。 他們並不是完全壹樣。
從技術上來說,堆(heap)是C語言和操作系統的術語。堆是操作系統所維護的壹塊特殊內存,它提供了動態分配的功能,當運行程序調用malloc()時就會從中分配,稍後調用free可把內存交還。而自由存儲是C++中通過new和delete動態分配和釋放對象的抽象概念,通過new來申請的內存區域可稱為自由存儲區。基本上,所有的C++編譯器默認使用堆來實現自由存儲,也即是缺省的全局運算符new和delete也許會按照malloc和free的方式來被實現,這時藉由new運算符分配的對象,說它在堆上也對,說它在自由存儲區上也正確。
程序編譯的過程中就是將用戶的文本形式的源代碼(c/c++)轉化成計算機可以直接執行的機器代碼的過程。主要經過四個過程:預處理、編譯、匯編和鏈接。具體示例如下。
壹個hello.c的c語言程序如下。
其編譯過程如下: