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中,按如...