標籤:
C++語言是對C語言的擴充。所以熟悉C語言的人會發現,本書的第01~18章講的內容基本上和C語言的內容差不多。C++一方面對C語言的文法進行了修改,另一方面又添加一些新的概念。
C++中新增的概念有:bool類型、引用(14章)、類(19~24章)、模板(25~26章)、異常(27章)。
C++相對於C有變化的文法點有:變數分散定義、函數名重載、struct文法。本章著重是比較分析這幾個有變化的文法點。
本篇選自《C/C++學習指南》,附錄14
權利聲明:作者擁有本書的全部權利。作者授權任何人都可以自由轉載本網站發布的內容,但轉載時必須遵守以下限制: ①轉載時必須全文轉載,不得有任何修改,必須包含“權利聲明”和“官網地址” ② 僅限於網路轉載,即最終結果公佈於網路上。凡是不遵守以上兩條的轉載行為視為侵權行為。除非本人允許,任何人不得將本網站內容內容用於任何的其他用途。
官網地址: http://www.afanihao.cn/ 留言請到http://www.afanihao.cn/kbase/
1.1 在項目裡添加c檔案
當檔案以.c作為尾碼時,編譯器以C語言的文法對該檔案進行編譯;當檔案以.cpp作為尾碼時,編譯器以C++的文法標準對其進行編譯。所以,檔案的尾碼名是有這個約定的,不能夠隨便更改。
在添加檔案時,輸入檔案名稱的尾碼是.c,那在編輯這個檔案時必須遵守C語言的文法,如所示,
1.2 變數分散定義
這一點在第8章介紹函數略有介紹。
在C語言中,所有的局部變數必須在函數或複合陳述式的最前面集中定義,簡單地說就是變數定義語句要放在前面。不然就報語法錯誤。
下面的main.c(C語言)代碼中,局部變數a,b的均在函數體的前部定義,因而符合C語言的文法要求,
////////////// main.c //////////#include <stdio.h>void main(){ int a; // 變數定義 int b; // 變數定義 a = 10; printf("a=%d \n", a); b = 11; printf("b=%d \n", b);}
下面的main.c(C語言)代碼中,局部變數c的定義沒有放在前面,不符合C語言的文法要求,因而編譯報錯,
////////////// main.c //////////#include <stdio.h>void main(){ int a; // 變數定義 int b; // 變數定義 a = 10; printf("a=%d \n", a); b = 11; printf("b=%d \n", b); int c ; // 變數定義語句不能放在這裡 c = a + b; printf("c=%d\n", c);}
顯然,這樣對於程式員來說是很不方便的。於是C++語言去掉了這個限制,讓程式員可以隨時隨地的定義變數。
1.3 函數名重載
C++允許多個函數使用相同的函數,這稱為函數名重載。而這在C語言中是萬萬不可以的,在C語言中,全域函數名是不能重複的。例如,在下面的main.c檔案中,存在兩個名稱相同的全域函數do_something,導致編譯器報錯,
////////////// main.c //////////#include <stdio.h> void do_something(int x, int y){ printf("int , int \n");}void do_something(double x, double y){ printf("double , double \n");}void main(){ printf("test");}
這個問題的本質是,在C語言中,以函數名來唯一區分一個全域函數。換句話說,函數名就是函數的唯一ID,顯然ID這個東西是不能衝突的。
這導致了在C語言中,給函數起名字也成了一個比較麻煩的事情,對於功能類似的函數,由於不能起相同的名字,所以只好不停地加一些尾碼以示區別,例如,
do_something_int_int()
do_something_double_double()
如果你將來閱讀一些C語言的代碼,相信會有此感受。
C++針對此問題的改進是:以函數名+參數列表來唯一區分函數。所以,在C++中函數名是允許相同的,只要參數列表有所不同就不會衝突。
1.4 struct定義
在C語言中, struct類型的定義必須加上struct的首碼,
而在C++中,struct可以直接使用其類型名來定義
相比之下,應該是C++的文法更簡潔一些。所以在用C語言編寫代碼的時候,老是要加一個struct首碼會讓人覺得不耐煩,所以C程式員通常是這麼來定義的struct的。在下面的代碼中,使用typedef來定義一個object_t的類型,
在C語言的世界裡,這麼定義struct是通用模式,為的就是在使用的時候少寫一個struct首碼。(可見C程式員有多麼無耐)。
在需要定義鏈表的時候,C程式員有兩種寫法,
struct Object{ int id; struct Object * next; //};或typedef struct _tag_object{ int id; struct _tag_object * next;}object_t;
同樣的,C程式員會選擇第二種定義方法,唯一目的就是為了在使用的時候少寫一個關鍵字struct而已。
1.5 C++中的struct
實際上,C++對struct進行提全面的升級,以至於C++的struct幾乎完全等效於class的文法了。凡是class支援的文法,包括成員函數、public/private、繼承等所有的文法,struct也都全部支援且意義不變。也就是說,struct是class的同義語(略有差別,後面講到)。
唯一的一點小區別:對於struct,如果沒有聲明任何修改符(public/protected/private),則預設所有成員是public的。這一點上class相反,class預設是private的。
細數C++和C的區別