為什麼說C++不是C的超集?

這學期開學剛剛P轉C,室友慫恿我轉C++。

1.有哪些東西是C可以寫C++不能寫或者意義不同的?Class什麼的保留詞就算了。

2.C++是否主要就是C多了一個STL和Class以及Struct里多了重載?

3.Class跟Struct有什麼區別?


因為C語言有一點點東西是C++沒有的,譬如說:

聲明一個數組的時候用變數當長度

_Generic宏

/*
usage: _Generic(fuck, char*:strlen, wchar_t*:wcslen)(fuck)
usage2:
#define tchlen(X) _Generic((X), char*:strlen, wchar_t*:wcslen)
char* fuck;
wchar_t* shit;
tchlen(fuck);
tchlen(shit);
*/

等等,都是原本在C++裡面證明很好用的東西。但是不知道為什麼,是C語言沒有辦法,還是故意跟C++長得不一樣,總之搞出了這些很醜的新功能(特別是_Generic)。那個動態數組還很搞笑,標準明確告訴你,沒事不要用,因為很容易爆棧。


1和3都有人答過了,我來回答一下問題2:

ISO C99 標準 大概 550頁,非附錄部分400頁 的篇幅,非Library部分160頁;

ISO C++11 標準大概 1300 - 1400頁 的篇幅,非附錄部分1150頁,非Library部分400頁。


是不是超集和學哪個沒關係。你C學得很好不等於C++自然就學得很好。反之亦然。從實用的角度來說,C++ &> C。

1. 沒有。

2. 不是。

3. 這是我常用的一個面試題,可惜大部分應屆生答不出來。


寫了一堆都刪了,你要建議的話,我覺得一句話就夠了:

我從未在只學過C++的人中見過看不懂C的人.


3. gcc和g++下好像只有默認public和默認private的區別。

VS里除了默認public和默認private的區別外,還要求declare和definition一致性的問題。如果forward declare時用struct(class),而定義時用class(struct),就會報錯(gcc不會)。比如:

struct A;

A *fun(A *ptr) {

return ptr;

}

class A {

int a;

};

=======更新======

* 剛在VS2013下試了一下,是個warning(我記得以前是個error來著?):

warning C4099: "A" : type name first seen using "struct" now seen using "class"

* gcc 4.3.2 無warning通過


因為c++在制定標準時,是不得不考慮與c的兼容,而不是在擴展c語言。

不論c++的標準如何革新,至少到目前為止有一個剛性要求,就是必須兼容c。

換句話說,如果沒有這個剛性需求,c++完全就是一門新語言---和任何語言都沒直接關係。

比如c++之所以有了引用還保留指針,就是為了兼容c。

所以說,c++是一門和c語言有點歷史糾葛的新語言。你不能簡單地說:c++就是c多了這多了那,記住:c++是一門新語言。


1 int main()和int main(void),變長數組等

2 還多了模版等一大堆東西,學C++不要抱著C的觀點來學,否則很容易學成C with class

3 繼承和定義成員時,一個默認private一個public。struct有兩種用途: 實際簡單的數據聚合(student等)和模版編程,class一般用於較為抽象的聚合,如vector, shared_ptr等,個人而言一般涉及到要寫析枸函數的時候都會選擇class


說句與題無關的話:

我的感覺是C++是儘可能兼容C,而C卻故意不讓C++兼容。


1. 並沒有,除非是C11標準的一些泛型宏什麼的(然而現在並沒有很多編譯器能支持)

2. 並不是,你翻翻隨便一本正常的C++教材的目錄就可以得知千差萬別。

舉個很細小的例子如下

比如有

struct M { int a;};

M a,b,c;

a = b = c; // 就這麼一句,在C和C++中行為都有所不同,正常的C++教材上也會強調

3. 這個隨便一本正常的C++教材上就有,建議翻書。


甲有五毛,乙有五塊,那就說乙是甲的超集囖


對於3,我知道有兩點不同:1.訪問許可權不同。2.只有class能用在模板聲明中,struct不能


推薦閱讀:

函數傳遞引用 與 直接操縱全局變數 消耗資源的區別?
C語言里64位程序long類型的變數 長度是4還是8?
C++ 完全兼容 C 語言嗎?
C Primer Plus第五版的練習題答案能找到官方正版的嗎?
為什麼0取反再右移任意位得出數總是-1?

TAG:編程語言 | C編程語言 | C |