標籤:

如何從c語言過渡到c++呢?

題主用c刷了某oj官方提供的題單,對c語言有了一點點的掌握。請問如何高效地過渡到c++呢?(這裡指的過渡不是c with class)


推薦一本書 The C++ Annotations . C 語言向 C++ 過渡, 講的超細.

有一點不太理解, 雖然 C++ 肯定不是 C with class, 不過, 我覺得這樣過渡挺好的. C -&> C with Class -&> C++.

另外, C++ 永遠大多時候避免不了高性能需求, 擺脫 C 是挺難的, 所以感覺沒辦法像學習其他語言一樣, 完全當成一門全新的語言去學習.


《c++ primer》這本書就比較適合。


C的東西相比於C++太少了……

建議在C基礎下從頭開始學C++


從new一對象開始


C++是在c的基礎上增加了一些特性和機制,這些特性和機制是為了面向對象而服務的。而c語言的編程主要是面向過程的。

如果要從c轉到C++,那就需要學習面向對象思維,學習如何用C++的方法去實現面向對象的編程。主要還是思維的轉變。

如何做到思維的轉變,可以通過學習面向對象的設計原則和設計模式來達到思維的轉變。


劉汝佳的紫書不是有cpp的內容。對著上面的cpp部分學就行。

起碼演算法題夠用(小聲)


c語言過渡到c++主要涉及下面幾方面

頭文件與命名空間

C語言沒有命名空間的概念,而C++有,最典型的是初學時經常用到的using namespace std; 代表使用命名空間std,或者使用std::functuion(); ,即函數、變數名前面加上空間名和域解析符來使用命名空間。命名空間可以嵌套定義。

為了統一,C++會把C語言的stdio.h math.h string.h 等xxx.h格式的標準頭文件用 cstdio cmath cstring 等cxxx格式的C++頭文件來替代,從而保留了C語言的標準庫函數。

輸入輸出

C語言常用的是scanf printf 的函數,C++用的是cin cout 對象。C語言的方式更快而且格式控制更方便,而C++的方式能夠自動識別了輸入輸出的類型,自動轉換成合適的字元串。

bool 類型

C++用於判斷真與假的類型,其大小並沒有被規定。C++還有true false 關鍵字。

當然C語言也可以通過各種方式來定義和使用true和false,但不像C++那樣作為關鍵字,沒有C++來的可靠。比如 if(func() == true)就是危險的行為。

string 類型

C++語言處理字元串的類,相比於時刻需要注意越界和』』的字元數組,顯然更好用。由於構造函數的存在,char *類型的變數很容易構造出string類型。

當需要使用字元數組時,string類型也有相應的c_str函數。 不過注意函數返回的是臨時的常指針,如果需要對其修改,需要用strcpy()等函數複製出副本,再對副本操作。

const

C語言中的const代表該變數初始化之後,只能讀不能改。但是並不代表每次取值都是一樣的,因為還可以通過其他方式修改變數。就像只讀方式打開文件一樣,你不能對他修改,但是如果這個文件可以被其他人修改,你就不能保證每次讀到的內容是一樣的。

C++對const的處理更加複雜,假如你用const定義了一個常量var,那麼它會被認為是一個常量,哪怕對應地址的內容被強行修改了,訪問var時仍然得到的是修改前的內容。

變數定義位置

C語言中的C89標準規定,在代碼塊里執行語句不能出現在變數定義語句之前。但是C++沒有這個限制,只要變數被使用時已經被聲明或定義即可。

動態內存管理

C語言只能用malloc等函數開闢一塊堆內存,其大小需要計算,返回的指針需要類型轉換,內容需要手動去初始化。

而C++申請堆內存的時候可以調用構造函數,釋放時能使用析構函數,更方便更安全。

類型轉換

C語言可以用小括弧進行類型轉換。最常見的是malloc函數返回指針的類型轉換。

C++的類型轉換更加清晰嚴格,有四種 const_cast static_cast dynamic_cast reinterpret_cast

而且對於類來說,可以自定義類型轉換的函數。

默認參數與函數重載

C語言不支持默認函數和函數重載,需要定義更多的函數名。

C++支持默認參數和函數重載,可以大大減少工作量。

指針與引用

C++中,引用的指向不能改變,所以很多情況下C++引用能夠代替指針。

空指針

C語言有NULL宏,用於標記空指針

C++有nullptr關鍵字。c++不允許直接將void*隱式的轉化為其他類型,nullptr的類型為nullptr_t,能夠隱式的轉換為任何指針,所以用空指針就儘可能的使用nullptr。

智能指針

C++不同標準下定義了許多智能指針,用於自動回收不需要的動態內存,這一點比C語言中的指針方便。


1.C和C++的區別:

  • C語言可以在C++編譯器上完美運行,即C屬於C++
  • C++比C多出來一些函數庫
  • C++是面向對象編程(即有class以及相關工具)

2.如何從C過渡到C++

2.1 代碼實例:(C語言版)uva11000.

#include&
int main()
{
long long m = 0, fm = 1, sum = 1;
int n,i;
while(scanf("%d",n),n != -1){
m = 0, fm = 1, sum = 1;
for(i = 0;i &< n;i++){ fm = m + 1; m = sum; sum = m + fm; } printf("%lld %lld ",m,sum); } return 0; }

重點不在於解上面這題,請將重點放在寫法。以上是C語言寫法,為什麼說是C語言寫法呢?因為上述代碼有幾個C獨有的特點:

  • 第1行:#include&
  • 第5行:scanf("%d",n)
  • 第13行:printf("%lld %lld
    ",m,sum);

這三點也是C和C++最基本的區別,下面看C++版本:

#include&
using namespace std;
int main()
{
long long m = 0, fm = 1, sum = 1;
int n,i;
while(cin &>&> n,n != -1){
m = 0, fm = 1, sum = 1;
for(i = 0;i &< n;i++){ fm = m + 1; m = sum; sum = m + fm; } cout &<&< m &<&< " " &<&< sum &<&< endl; } return 0; }

  • 第1行:#include&
  • 第2行:using namespace std;
  • 第6行:cin &>&> n;
  • 第14行:cout &<&< m &<&< " " &<&< sum &<&< endl;
  1. 其中第1行頭文件iostream,和C語言中的stdio.h類似,可以對比理解。
  2. 第2行的using namespace std 的意思是聲明使用命名空間std。可以不深入理解,只要寫C++就敲這一行就可以了。(想了解的直接百度就可以,很簡單)
  3. 第6行:cin全名叫 標準輸入流。和C語言中的scanf用法類似,只是它用起來更為方便(大多數情況下),不需要區分不同的類型用不同的寫法,所有類型只需要用cin &>&> (變數名)就可以了。
  4. 第14行:和cin類似,cout是標準輸出流,與C中的printf類似,但是它也不用區分不同的類型用不同輸出符號,不管什麼類型只要用cout &<&< (變數名) 就可以了。其中endl相當於C語言中的 『 』 換行符。

2.2 初步掌握C++:

如果你已經明白上面4個C++的特點的話,那現在你用C編寫代碼有多順暢你用C++就可以同樣順暢了。因為其他寫法(for、if、else……)和C完全相同。

3.如何利用C++的優點(提高):

一開始就提到,C++和C的不同在於C++豐富的函數庫,其中最方便的是STL(一個庫名)。很多書會講這一個庫單獨拿出來講,其中包括一些非常方便的容器(vector、map),現在看不懂也沒關係,這個是需要花時間學的。從C過渡到C++只需要一個下午(C基礎好),但是學會使用C++的各種函數,需要花很久。

4.推薦書籍:

個人入門用的是《C++ primer plus》第六版。這本書很厚,但是不需要看完,就像用字典一樣看它就可以(用來看各種函數定義)。然後是提高,建議買一本專門講STl的書來深入掌握STL,因為它真的很重要。


瀉藥

推薦一下,黑客教父王寶明,具體課程百度即可


多做多學,多琢磨,找規律,因為我現在也出於學習階段,我感覺這樣下去應該能夠成功


推薦閱讀:

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