C 與C的區別

2021-05-24 23:15:17 字數 1626 閱讀 6532

l c如果不寫返回值,預設是int,而c++中不能不寫返回值(可用void表示無返回值)。

如func1();

l int func1()在c中表示可帶任意引數的函式,這是c的漏洞,使得它避開了引數型別檢查;而c++中表示不帶引數的函式。

2) 標頭檔案的區別

l c++的標頭檔案去掉了c中的.h,以c字首開始。比如, 變為

l c帶.h的是非模板化的標頭檔案,而c++是模板化的標頭檔案。

.h檔案是不含命名空間的,所以以前的是不需要using的。

當然也可以用老的c標頭檔案,但是,在同乙個程式裡不能混著用,雖然編譯可以通過,但是可能會出現問題。

3) register變數

在c語言中,是不能對register變數取位址的,因為它沒有虛位址,在暫存器裡。而c++中,它是可以取址的,這時,c++編譯器會忽略register,不會把它放到暫存器裡。

4) const變數

在c語言中,const是唯讀的變數,不是常量;c++中它是常量。

區別用例子描述如下:

const int max = 10;

char buffer[max]; //c中它是不合法的,可以用enum或

define替代;

//c++中它是合法的。

const int a; //在c裡是合法的,在c++裡必須賦初值,因為c++裡是編譯期間就需要它的值了,而c裡是儲存在記憶體裡而不是符號表裡。

5) typedef

在c語言中,

struct a

a a; //這是錯誤的,在c++中是合法的。

struct a a; //這是正確的

用了typedef後,c中a a;也是合法的了。

6) struct/union/class

l 對於struct/union資料成員與函式成員的訪問性來說,其預設是public;

l class則是private。

l union聯合體不能作為基類繼承。

union a

class b: public a //編譯出錯

l 匿名union

union

int a;

float b;

在程式裡可以直接訪問 a、b。所以,如果匿名union定義為全域性的,注意使得它為內部鏈結的,否則很容易跟外面的變數起衝突。

定義為static即可為內部鏈結。

7) 小作用域

在c語言中,如下寫法是會出編譯錯誤的:

for( int i = 0; i < 10; i++)

8) c語言沒有函式過載

關於c++的函式過載,請參考

9) 型別安全鏈結

在c語言中,

a.cpp

void func1( int )

b.cpp

void func1( char );

int main()

func1( 1 ); //c語言中是沒有錯誤的,但c++不行。

因為c++是型別安全鏈結的,對於func1來說,它是內部鏈結的,它看不見a.cpp中定義的函式,它呼叫func1_char函式,但是找不到實現。

可見:可以利用c++編譯器去編譯c語言程式,找出潛在的錯誤。

10) c++有異常機制,而c沒有。

關於異常,請參考

C與C 的區別

1.void型指標 int x malloc sizeof int 10 在c裡面是合法的,但是在c 中編譯不通過。從bjarne stroustrup給出的解釋是這種型別是不安全的。就是說你可以使用乙個void型的指標指向任何位址,如果你分配了乙個位址給這個void指標指向另乙個與它型別不同的指標...

C與C 的區別

在很大程度上,標準c 是標準c的超集.實際上,所有c程式也是c 程式,然而,兩者之間有少量區別.下面簡要介紹一下最重要的區別.在c 中,民,區域性變數可以在乙個程式塊內在任何地方宣告,在c中,區域性變數必須在程式塊的開始部分,即在所有 操作 語句之前宣告,請注意,c99標準中取消了這種限制.在c中,...

C與C 的區別

在很大程度上,標準c 是標準c的超集.實際上,所有c程式也是c 程式,然而,兩者之間有少量區別.下面簡要介紹一下最重要的區別.在c 中,區域性變數可以在乙個程式塊內在任何地方宣告,在c中,區域性變數必須在程式塊的開始部分,即在所有 操作 語句之前宣告,請注意,c99標準中取消了這種限制.在c中,按如...