const與#define的比較
1、const常量有數據類型,而宏常量沒有數據類型。編譯器可以對const進行類型檢
查。對宏常量只是字符替換,并會產生意料不到的錯誤。
2、有些集成化的調試工具可以對const常量進行調試,但不能對宏常量進行調試。
類內需要恒常量時用枚舉類型。
如果輸入參數以值傳遞的方式傳遞對象,則宜改用“const&”方式來傳遞,這樣可以
省去臨時對象的構造和析構過程,從而提高效率。
assert是在debug下起作用的宏,檢測不應該出現錯誤的情況。
引用的規則:
1、引用被創建的同時必須被初始化(指針則可以在任何時候被初始化)
2、不能用NULL的引用,引用必須與合法的存儲單元關聯(指針則可以是NULL)
3、一旦引用被初始化,就不能改變引用的關系(指針則可以隨時改變所指的對象)
內存分配方式有三種
1、從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整
個運行期間都存在。如全局變量,static變量。
2、在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數
執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效
率很高,但是分配的內存有限。
3、從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少
的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由我們
決定,使用非常靈活,但問題也最多。
指針與數組的對比
數組要么在靜態存儲區被創建,要么在棧上被創建。數組名對應著(而不是指向)一
塊內存,其地址與容量在生命期內保持不變,只用數組的內容可以改變。
指針看隨時指向任意類型的內存塊,它的特征是“可變”,所以我們常用指針來操作
動態內存。指針遠比數組靈活,但也更加危險。
“野指針”的主要兩種成因
1、指針變量沒有被初始化。任何指針變量剛被創建時不會自動成為NULL指針,它的
缺省值是隨機的,它會亂指一氣。所以,指針變量在創建的同時應當被初始化,要么
將指針設置為NULL,要么讓它指向合法的內存。
2、指針被free或者delete之后,沒有置為NULL,讓人誤以為是個合法的指針
malloc和new的區別
對于非內部數據類型的對象而言,光用malloc是無法滿足動態對象的要求。對象在創
建的同時要自動執行構造函數,但是malloc是庫函數而不是運算符,不在編譯器控制
權限之內,不能夠把執行構造函數的任務強加與malloc。malooc返回值的類型是一個
(void*)的指針。
new是一個運算符,返回值的類型是new的數據的類型。
對于C語言的函數,C++增加了重載、內聯、const和virtual四種新機制。其中重載和
內聯機制既可以用在全局hasn't也可以用在類的成員函數,const與virtual機制僅用
于類的成員函數。
重載函數:作用域必須相同,只能靠參數的不同不能靠返回值的不同來區分重載函數
重載與覆蓋
成員函數被重載的特征:
1、相同的范圍(在一個類中);
2、函數名字相同;
3、參數不同;
4、virtual關鍵字可有可無;
覆蓋是指派生類函數覆蓋基類函數,特征是:
1、不同的范圍(分別位于派生類與基類);
2、函數名字相同;
3、參數相同;
4、基類函數必須有virtual關鍵字;
隱藏是指派生類的函數屏蔽了與其同名的基類函數。
1、如果派生類的函數與基類的函數同名,但是參數不同,此時,不論有無virtual關
鍵字,基類的函數將被隱藏(注意別與重載混淆)。
2、如果派生類的函數與基類的函數同名,并且參數也相同,但是基類沒有virtual關
鍵字。此時,基類的函數被隱藏(注意與覆蓋混淆)。
參數缺省值只能出現在函數的聲明中,不能出現在定義體中。
有多個參數缺省參數只能從后向前缺省。
構造函數、析構函數與賦值函數是每個類最基本的函數。
構造函數初始化的使用規則:
1、如果存在繼承關系,派生類必須在其初始化表里調用基類的構造函數。
2、類的const常量只能在初始化表里被初始化,因為它不能在函數體內用復制的方式來初始化。
3、類的數據成員的初始化可以采用初始化表或函數體內賦值的兩種方式,這兩種方式的效率不完全相同。
非內部類型的成員對象應當采用第一種方式初始化,以獲取更高的效率。
基類的構造函數、析構函數、賦值函數都不能被派生類繼承。
派生類的構造函數應在其初始化表里調用基類的構造函數。
基類與派生類的構造函數應為虛(vritual)。
在編寫派生類的賦值函數時,注意不要忘記對基類的數據成員重新賦值。
const修飾參數的用法:
對于非內部數據類型的輸入參數。應該將“值傳遞”的方式改為“const引用傳遞”,目的是提高效率。
對于內部數據類型的輸入參數,不要將“值傳遞”的方式改為“const引用傳遞”。不但沒有提高效率,又降低了函數的可讀性。
用const修飾函數的返回值:
如果給以“指針傳遞”方式的函數返回值加const修飾,那么函數返回值(即指針)的內容不鞥被修改。該返回值只能被賦給加const修飾的同類型指針。
如果函數返回值采用“值傳遞”的方式,由于函數會把返回值復制到外部臨時的存儲單元中,加const沒有任何價值。
函數返回值采用“引用傳遞”的場合并不多,這種方式一般只出現在類的賦值函數中,目地是為了實現鏈式表達。
const成員函數:
任何不會修改數據成員的函數都應該聲明為const類型。const關鍵字只能放在函數聲明的尾部。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。