之前一直在搞java開發,去年9月份開始,陸陸續續的公司來學校校招了,然后開始忙于校招。后來去了華為,簽了約后開始寫大論文,所以之后就一直沒有更新自己的博客了,有些朋友留言說博主懶惰了,好久都沒寫博客了~哈哈!現在大論文也差不多了,是時候繼續學習了。 由于簽了華為,崗位是通信設備軟件開發,再加上之前有一周的培訓,我估計后面基本上是要做C/C++了,其實我挺喜歡做java的,但是沒辦法。C++我在三年前看過幾個月,僅此而已,現在早忘得差不多了。為了能在5月份入職的時候能夠快速上手工作,所以打算接下來的時間好好學習和總結一下C++的東西。 C++和C看起來很像,我覺得叫++C可能會更好,顧名思義,從C拓展而來,兼容C的東西。這篇博文主要來總結一下C++對C都做了哪些拓展,有哪些區別。如果有什么錯誤,還請博友們指出來,畢竟我還是個C++菜鳥,謝謝!
舉個例子,我們都知道,當一個變量定義為const類型后,這個變量的值是不能被改變的,但是在C中,我們可以拐著彎去修改const類型變量的值,如下:
int main(int argc, char *argv[]){ const int a = 100; //a = 200; // error int *p = &a; *p = 200; 對于const類型變量a,我們無法直接再去給它賦值200,但是我們可以定義一個指針變量p來保存a的地址,通過*p
來修改a的值,在C里面這樣是可以做到的,這叫明修棧道暗度陳倉。我們再來詳細分析一下這個過程,a是個const int
類型,那么取地址后就變成了const int *
類型,也就是說相當于把const int *
類型的變量賦給了int *
類型,把const給干掉了,所以可以對*p
進行賦值了。C中可以隨便賦值,這就導致了不嚴謹。 在C++里,int *p = &a
編譯則不會通過,因為無法將const int *
類型的變量賦給了int *
類型,所以既然設定了a為const類型的變量,它就不會讓你有修改的機會。C++不喜歡強轉,C++會認為你設計有問題。還有個小細節,在定義a的時候,C中可以不賦初值,系統會給一個隨機值,而C++中強制你在定義的時候要初始化,這一點在語言的層面上做的就比較友好了。 再舉個常見的例子,我們知道malloc函數返回的是void *
類型,在C中,我們可以直接將返回值賦給char *
的變量,但是在C++中,必須轉換成char *
類型才可以,如下:char *p = malloc(100); // Cchar *p = (char *)malloc(100); // C++在C語言中是沒有bool類型的,C中表示真假用的是0和非0。C++中有bool類型,可以使用true和false來表示真和假。但是在C++中,也可以將0和非0賦給bool類型的變量,這點其實C++做的不太嚴謹,既然有了bool類型,個人覺得只能用true和false去賦值會更好,可讀性也更強。 bool類型其實說白了就是個枚舉,C中雖然沒有,但是我們可以用枚舉來定義這個類型。
#include <stdio.h>typedef enum BOOL{ FALSE,TRUE}Bool;int main(int argc, char *argv[]){ Bool b = FALSE; if(!b) { printf("b value is false/n"); } return 0;} C中必須使用typedef才可以直接使用Bool,否則需要加enum來定義,如enum BOOL b = FALSE;
。在C++中,枚舉類型可以直接用來定義變量,不需要再加上enum關鍵字,也不需要使用typedef來重新命名。
這是什么意思呢?C中的枚舉算不上真正的枚舉,C 語言中枚舉的本質就是整型,枚舉變量可以用任意整型來賦值。而C++中枚舉變量,只能用被枚舉出來的元素去初始化。比如我們定義一個枚舉類型:
enum SEASON{ Spring,Summer,Autumn,Winter};在C中我們可以:
enum SEASON s;s = Spring; //oks = 100; //ok但是在C++中:
SEASON s;s = Spring; //oks = 100; //error說個題外話,枚舉除了列舉一些固定的值以外,還能充當宏的作用。還是上面的例子,如果我們把SEASON去掉,完全可以將枚舉中的值作為宏來處理,因為枚舉中的值默認是從0開始,也可以手動賦不一樣的值,如下:
#include <iostream>enum{ Spring = 100, Summer = 20, Autumn = 50, Winter = 250};int main(int argc, char *argv[]){ printf("%d %d %d %d/n",Spring, Summer, Autumn, Winter); return 0;}這樣會將四個值打印出來,可以完美替代宏去操作了,這也是枚舉的一個妙用吧。
在C中,表達式是不可以被賦值的,但是在C++中,某些表達式是可以被賦值的。
int main(){ int a, b; a = b = 5; // ok both in c & c++ (a = b) = 100; // ok only in c++ printf("a=%d b=%d/n",a, b); return 0;} 在C中,表達式的值是可以賦值給其他變量的,比如a=b=5;
是將5賦給b,再將表達式b=5的值賦給a,所以a和b都等于5。但是C中不能將100賦值給表達式(a=b),雖然該表達式的值是a的值,但是不允許這樣操作,可在C++中是允許的,最后會打印出a=100 b=5。
在C中我們一般用scanf和printf來輸入和輸出,在C++中使用cin和cout來輸入和輸出,這兩個有啥區別呢?從語言的角度來說,scanf和printf是函數,cin和cout是類對象,他們有相同的功能而已。舉個與C對比的例子:
int main(int argc, char *argv[]){ int a = 25; float b = 1234.567; printf("%5d/n%6.2f/n", a, b); cout<<setw(5)<<a<<endl<<setw(6)<<setprecision(2)<<setiosflags(ios::fixed)<<b<<endl; printf("%x/n%o/n%d/n", a, a, a); cout<<hex<<a<<endl<<oct<<a<<endl<<dec<<a<<endl; return 0;}使用setw()函數來設定域寬,使用setprecision和setiosflags來設定小數位。使用hex、oct和dec來表示十六進制、八進制和十進制。關于輸入輸出后面再細寫吧。 當然了,C++對C的擴展遠不止這些,今天就先寫這么多吧,后面再補充吧~
—–樂于分享,共同進步! —–更多文章請看:http://blog.csdn.net/eson_15
新聞熱點
疑難解答
圖片精選