C++ 我想這樣用(二)
沒錯,雖然C++曾號稱兼容C,而且很多人甚至覺得C就是C++子集,但是c腦殘粉一定知道,兩者有很大的不同!
下面這些要點是比較突出的,後期我再補充其他的:
1.關於類型轉換
C是弱類型的,至少比C++弱,在C下面很多類型轉換我們不怎麼管,編譯器也會默認,最多有些討厭的編譯器(如某軟家的)會給出警告,但是在C++下面就不一樣了,這些都是error!!你不顯示聲明,就別想跨類型!!其實這也是好事,多打幾個字母,反而代碼清晰了嚴謹了:)
Example
在C裡,你這樣寫:
int* p;
p = malloc(10 * sizeof(int));
在C++裡,你必須這樣寫:
int* p;
p = (int *)malloc(10 * sizeof(int));
2.關於字符數組
在C裡,你可以聲明一個字符數組,長度正好是串長,即:沒有地方放‘\0’,但在C++裡,你不能這樣做:
char s[3] = "abc";(在C裡正確,在C++裡錯誤)。
我的建議是:如果你是個正常的人類,就是在C裡面你也會寫成:
char s[4] = "abc";
不過其實最好的寫法是:char s[] = "abc"; 不是嗎??
3.關於嵌套的類型定義
Example
struct S {
int a;
struct T {
int t;
} b;
int c;
enum E { V1, V2 } e;
};
struct T x;
enum E y;
上述代碼在C裡面沒問題,這是因為S、T、E三者的作用域(Scope)相同,但是在C++裡,確實是錯誤的!在C++裡,T和E的作用域是在S裡的,想在外面使用只能S::T,這涉及到命名空間的問題,我們以後再說。
不過就算在C裡,我也會把E和T單獨拿出來定義,這種嵌套的寫法,總有鸠占鵲巢的感覺~~
4.關於枚舉類型
我們都知道,在C裡面枚舉和整型是一樣的,枚舉就是整型,於是我們這樣干:
enum RGB { red, green, blue } rgb;
++rgb;
哦,看吧,世界多美好。然而C++的世界是殘酷的,枚舉是獨立的類型,且不支持++這類整數操作符。於是你說沒關系:"rgb=rgb+1;"就好了。很可惜。又錯了。。。是的,因為沒有顯示的進行類型轉換,於是正確的寫法:
enum RGB { red, green, blue } rgb;
rgb = RGB(rgb + 1);
雖然有的長,不過還好啦,如果你的強迫症已經達到神級了,那麼也有辦法,給RGB加上++運算符的重載吧,具體內容以後說。
5.關於注釋
//和/**/的雙注釋方案早就被C采用了,所以其實沒啥特別要注意的,不過你非要這樣寫的話:
i = j //* comment */ k ;
那麼連上帝也幫不了你了= =!