C 學習筆記

2021-08-03 09:24:31 字數 2056 閱讀 6203

多型,虛函式,純虛函式

多型:是對於不同物件接收相同訊息時產生不同的動作。c++的多型性具體體現在執行和編譯兩個方面:

程式執行時的多型性通過繼承和虛函式來體現;

程式編譯時多型性體現在函式和運算子的過載上;

虛函式:在基類中冠以關鍵字 virtual 的成員函式。 它提供了一種介面介面。允許在派生類中對基類的虛函式重新定義。

純虛函式的作用:在基類中為其派生類保留乙個函式的名字,以便派生類根據需要對它進行定義。作為介面而存在,純虛函式不具備函式的功能,一般不能直接被呼叫。

從基類繼承來的純虛函式,在派生類中仍是虛函式。如果乙個類中至少有乙個純虛函式,那麼這個類被稱為抽象類(abstract class)。

抽象類中不僅包括純虛函式,也可包括虛函式。抽象類必須用作派生其他類的基類,而不能用於直接建立物件例項。但仍可使用指向抽象類的指標支援執行時多型性。

子類析構時要呼叫父類的析構函式嗎?

析構函式呼叫的次序是先派生類的析構後基類的析構,也就是說在基類的的析構呼叫的時候,派生類的資訊已經全部銷毀了。定義乙個物件時先呼叫基類的建構函式、然後呼叫派生類的建構函式;析構的時候恰好相反:先呼叫派生類的析構函式、然後呼叫基類的析構函式。

請說出const與#define 相比,有何優點?

答案:

const作用:定義常量、修飾函式引數、修飾函式返回值三個作用。被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。

1) const 常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤。

2) 有些整合化的除錯工具可以對const 常量進行除錯,但是不能對巨集常量進行除錯。

記憶體的分配方式有幾種?

一、從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數。

二、在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

三、從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。

全域性變數和區域性變數有什麼區別?是怎麼實現的?作業系統和編譯器是怎麼知道的?

生命週期不同:

全域性變數隨主程式建立和建立,隨主程式銷毀而銷毀;區域性變數在區域性函式內部,甚至區域性迴圈體等內部存在,退出就不存在;

使用方式不同:

通過宣告後全域性變數程式的各個部分都可以用到;區域性變數只能在區域性使用,分配在棧區。

作業系統和編譯器通過記憶體分配的位置來知道的,全域性變數分配在全域性資料段並且在程式開始執行的時候被載入。區域性變數則分配在堆疊裡面

關於x = x & (x - 1)

含義:這條語句執行一次,就會把x用二進位制格式表示時的最右邊的乙個二進位制1變為二進位制0,因為x-1會將該位(x用二進位制表示時最右邊的乙個二進位制1)變為0;

應用1:把乙個整數用二進位制表示時,其中二進位制1的個數;

int func(int x)  

return

count;

}

設x=9999,其二進位制格式為: 10011100001111; 則count=8;

思路:將x轉化為二進位制格式,統計一下含有的二進位制1的個數;

應用2:判斷乙個整數(x)是否是2的n次方;

int func(int x)  

else

}

思路:如果乙個整數是2的n次方,那麼,這個數用二進位制表示時,其最高位為二進位制1,其餘位為二進位制0;

C 學習筆記( )

一 語法 迴圈 foreach 型別識別符號 in 表示式 code 用法 例子int temp foreach int num in temp 每次從temp取乙個元素賦給num直至取完 console.writeline n num 每行顯示乙個元素 執行結果 c 中唯讀 只寫控制 class ...

C 學習筆記

1.函式特徵 有函式頭和函式體 接受乙個引數 返回乙個值 需要乙個原型。2.c 命名規則 在名稱中只能使用字母字元 數字和下劃線 名稱的第乙個字元不能是數字 區分大寫字母和小寫字母 不能將c 關鍵字用作名稱 以兩個下劃線或下劃線和大寫字母打頭的名稱被保留給實現 編譯器及其使用的資源 使用,以乙個下劃...

c 學習筆記

屬性 屬性開頭字母大寫 屬性可以判斷輸入的非法值 屬性本身不儲存值 依靠字段 索引器 using system using system.collections.generic using system.linq using system.text namespace b try catch exc...