c 對c的擴充套件

2021-10-01 10:26:41 字數 3665 閱讀 1017

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