C 基礎知識

2021-09-27 13:49:11 字數 3103 閱讀 4135

1.new、delete、malloc、free關係

malloc與free是c++/c語言的標準庫函式;

new與delete是c++的運算子。它們都可用於申請動態記憶體和釋放記憶體。

new呼叫物件的建構函式,delete會呼叫物件的析構函式。

由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。

2.delete與 delete 區別

delete只會呼叫一次析構函式,而delete會呼叫每乙個成員的析構函式。

delete與new配套,delete 與new 配套

對於內建簡單資料型別,delete和delete功能是相同的。

對於自定義的複雜資料型別,delete和delete不能互用。

delete刪除乙個陣列,delete刪除乙個指標。

3.多型,虛函式,純虛函式

c++的多型性具體體現在執行和編譯兩個方面:

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

抽象類必須用作派生其他類的基類,而不能用於直接建立物件例項。

4.什麼是「引用」?

引用就是某個目標變數的「別名」,對應用的操作與對變數直接操作效果完全相同。申明乙個引用的時候,要對其進行初始化。

「引用作引數」

使用引用傳遞函式的引數,在記憶體中並沒有產生實參的副本,它是直接對實參操作;

使用指標作為函式的引數雖然也能達到與使用引用的效果,但是,在被調函式中同樣要給形參分配儲存單元,且需要重複使用"*指標變數名"的形式進行運算,這很容易產生錯誤且程式的閱讀性較差。

「常引用」

要保護傳遞給函式的資料不在函式中被改變,就應使用常引用。

「引用」作函式返回值

在記憶體中不產生被返回值的副本;

無法返回區域性變數的引用;

無法返回函式內部new分配的記憶體的引用;

5.結構與聯合

結構和聯合都是由多個不同的資料型別成員組成, 但在任何同一時刻, 聯合中只存放了乙個被選中的成員(所有成員共用一塊位址空間), 而結構的所有成員都存在。

6.過載(overload)和重寫(overried)

7.分別寫出bool,int,float,指標型別的變數a 與「零」的比較語句

bool : if ( !a ) or if(a)

int : if ( a == 0)

float : const expression exp = 0.000001

if ( a < exp && a >-exp)

pointer : if ( a != null) or if(a == null)

8.const與#define

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

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

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

9.陣列與指標

陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。指標可以隨時指向任意型別的記憶體塊。

修改內容上的差別

char a = 「hello」;

a[0] = 『x』;

char *p = 「world」; // 注意p 指向常量字串

p[0] = 『x』; // 編譯器不能發現該錯誤,執行時錯誤

使用sizeof 的差別

用運算子sizeof 可以計算出陣列的容量(位元組數);

sizeof( p ) 為指標得到的是乙個指標變數的位元組數,而不是p 所指的記憶體容量。c++/c 語言沒有辦法知道指標所指的記憶體容量,除非在申請記憶體時記住它。

注意當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。

char a = "hello world";

char *p = a;

cout<< sizeof(a) << endl; // 12 位元組

cout<< sizeof(p) << endl; // 4 位元組

計算陣列和指標的記憶體容量

void func(char a[100])

10.複雜宣告
int (*s[10])(int) ;

//函式指標陣列,每個指標指向乙個int func(int param)的函式;

void * ( * (*fp1)(int))[10];

//fp1是乙個指標,指向乙個函式,

//這個函式的引數為int型,函式的返回值是乙個指標,

//這個指標指向乙個陣列,這個陣列有10個元素,每個元素是乙個void*型指標。

float (*(* fp2)(int,int,int))(int);

//fp2是乙個指標,指向乙個函式,這個函式的引數為3個int型,

//函式的返回值是乙個指標,這個指標指向乙個函式,

//這個函式的引數為int型,函式的返回值是float型。

int (* ( * fp3)())[10]();

//fp3是乙個指標,指向乙個函式,這個函式的引數為空,函式的返回值是乙個指標,

//這個指標指向乙個陣列,這個陣列有10個元素,每個元素是乙個指標,指向乙個函式,

//這個函式的引數為空,函式的返回值是int型。

11.記憶體的分配方式

12.全域性變數和區域性變數

生命週期:

全域性變數隨主程式建立和建立,隨主程式銷毀而銷毀;

區域性變數在區域性函式內部,甚至區域性迴圈體等內部存在,退出就不存在;

使用方式:

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

C 基礎知識

抽象類 abstract class 一種不可以被例項化的類。抽象類中一般含有抽象方法,當然也可有具體實現。繼承類只有實現過所有抽象類的抽象方法後才能被例項化。介面 inte ce 只含有共有抽象方法 public abstract method 的類。這些方法必須在子類中被實現。反射 程式集包含模...

c 基礎知識

或運算的意義是什麼 0 0 0 0 1 1 1 0 1 1 1 1 無進製與運算的意義是什麼 在vc中,視窗的每個屬性對應乙個只有一位為1的16位的二進位制數,當增加某屬性做或運算 即可,取消某個屬性只需與 上這個屬性的取反。cs.style ws maximizebox 和cs.style cs....

C 基礎知識

1 malloc和new區別與聯絡 a malloc malloc為函式,需要標頭檔案,申請的無型別,需要強制轉換 free釋放。示例 char p char malloc 10 sizeof char free p b new new是運算子,不需要標頭檔案,申請的是有型別的,自動呼叫建構函式 d...