1、c++對型別檢查比c語言更為嚴格。如:
\\demo1.c
char* p = malloc(100); //c語言可以通過,c++報錯
char* p = (char*)malloc(100); //正確
\\demo2.c
const int a = 100;
int *p = &a; //c語言警告,c++直接報錯
const int *p = &a; //正確
\\demo3.c
int *p = (int*)&a; //c語言和c++都正確,但是執行下面兩句,c語言輸出的是200,
*p = 200; // c++輸出的是100, 原因有待深究
printf("a = %d\n", a);
2、const型別c++中必須初始化,c語言中可以不初始化,預設為0, c++中const為真const,不能通過指標修改,c語言中可以
int main(void)
/*此段**在c語言中是完全正確的,相同的位址,輸出相同的值;但是在c++中,奇怪的事情發生了,&a和p的值是相同的,a和*p的值卻不同!!!
也就說同乙個位址,通過變數和指標取出了不同的值。這主要是因為程式讀const的值的時候,不會從記憶體裡面拿,而是從快取裡面拿。
我們應該避免給通過任何途徑試圖改變const的值,c語言規定了。如果你通過指標修改了乙個宣告為const的值,那麼讀取這個值的時候,
結果是"不可預計的",就是說,不同的編譯器可能會給出不同的結果,程式設計師應該避免出現這樣的情況
*/
3、c語言中沒有bool型別,通過0和非0表示假和真;c++中引入bool型,本質就是列舉,類似於如下定義:
typedef enum bool;
4、c++中列舉是真列舉
enum week;
enum week d1 = 2; //c語言中合法,c++中是非法的,c++中列舉變數只能取列舉中的值
5、需要char陣列的地方盡量用string代替,char資料需要初始化長度,有越界的問題,string完美的解決了這些問題。
6、c++支援函式過載,c語言不支援。引數不同可以構成過載,但是返回值不同不可以。
過載匹配原則:1嚴格匹配,找到後呼叫;2、隱式轉換匹配,找到後呼叫
int func( long a )
int func( double a)
int main(void)
7、extern "c" 作用於申明,當呼叫c語言庫時候,需要與c語言保持一致,在c++中需要呼叫c庫的函式申明處加extern "c"
//自己的c語言庫,如果需要讓c++呼叫,可以在標頭檔案中如下操作
#ifdef __cplusplus
extern "c"
#endif
//如此操作,既可以在c程式中呼叫, 也可以在c++程式中呼叫
8、預設引數,1、從右向左,不能跳躍;2、預設引數在申明中指定;3、不能既過載又設定預設引數。不然編譯器無法分辨是過載還是預設引數。預設引數可以在申明中指定,也可以在定義中指定,但是強烈推薦申明中指定,因為申明是使用者可見的,而且可利用申明來修改預設引數。
int add( int a, int b, int c);
int add( int a = 0, int b = 1, int c = 1 );
int add( int a = 0, int b, int c); //非法,呼叫時候add(1,2),編譯器不知道怎麼分配引數
//只能從右往左,如
int add( int a, int b, int c = 1);
int add( int a, int b = 0, int c = 1);
int add( int a = 1, int b = 2, int c = 3);
//不能既過載,又使用預設引數
int add( int a, int b);
int add( int a, int b, int c = 0);
//此時,當呼叫add(1,2)時,編譯器不知道是呼叫的哪乙個
9、引用,為變數起乙個別名,是乙個關係型申明。申明時候必須賦值,否則出錯,一經申明,不可更改。
int a = 0;
int &ra = a; //正確方式
int &ra; ra = a; //非法,第一句就報錯,申明了乙個引用,但是沒有初始化
10、const引用。
//定義
int a = 0;
const int &ra = a; //合法
int & const a; //非法,因為引用本身就是一經申明,不可更改的,這種表達沒有意義
//const 引用可以是用相關型別的物件或者右值初始化
const int &ra = 2; //合法,因為有const
int &ra = 2; //非法
//更神奇的:
double c = 1.23;
int &rc = c; //非法
const int &rc = c; //合法, 開闢了新空間
double &rc = c+2; //非法
const double &rc = c + 2; //合法, 開闢了新空間
//使用const引用時候,右值需要型別轉換或是表示式時,會另外開闢新空間,const修飾的是該空間
11、new用法
int *ip = new int(10); //初始化乙個int空間, 初始值為10
int *ips = new int[10]; //開闢10個int空間
delete ip;
delete ips;
//new 和delete 用法很簡單,但是裡面的內容卻非常非常的多,它染指的是記憶體分配和釋放,足夠出一本書了,
//細節東西我們以後再慢慢講
12、內聯函式inline, 優化效能,適用於體積小,頻繁呼叫的函式。避免了呼叫時的額外開銷(主要是入棧和出棧操作),代價是增加了**段的空間。它比巨集函式要好,在c++中建議盡量使用inline代替巨集函式。
13、強制型別轉換,c++是強型別語言,因此也有強制型別轉換函式,如static_cast,dynamic_cast,const_cast,reinterpret_cast等。static_cast是使用最多的,一般用在常用型別的轉換;synamic_cast使用在父子類之間的轉換;const_cast看名字就是和const型別相關的,它可以用於脫常量;reinterpre_cast即重定義,它可以重新定義一塊記憶體空間的型別。
14、命名空間,用於防止重名,在大型專案中非常有用。分為全域性命名空間和區域性命名空間,全域性命名空間為::。全域性變數和全域性函式,都屬於全域性命名空間。命名空間也可以巢狀。
號外:c/c++編譯器不會檢查陣列下標越界。檢查下標越界需要額外的程式,影響效能;另外不檢查下標越界給程式設計師更大的空間。
C 對C的擴充套件
1.c 會對函式返回值型別和引數個數進行檢測 c語言預設為返回值為int,引數個數不做檢查 2.c 在定義結構體變數時,關鍵字struct可以省略,結構體名不能省 3.在全域性中定義 int val g bss段 全是0 在全域性中 int val g 20 data c正確 2是賦值 c 錯誤 重...
C 對C的擴充套件
c 是c語言的加強,是一種更好的c語言 c 是以c語言為基礎的,並且完全相容c語言的特性 c語言 物件導向方 objective c c c 以c語言為基礎 物件導向支援 型別加強 函式加強 異常處理 標準格式 namespace namec中的命名空間 在c語言中只有乙個全域性作用域 c語言中所有...
C 對C的擴充套件 增強
c 對c的擴充套件 1.雙冒號 作用域運算子 中對同乙個變數多次宣告,在 塊中使用時,區域性變數會將全域性變數隱藏。若在 塊使用變數前新增 表示為全域性變數。表示作用域運算子,如常見的std cout,std endl 等,表示cout和endl是std作用域下的識別符號。2.命名空間namespa...