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...