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