C++學習指南(送2本C++之父的書)

2021-02-21 安曉輝生涯

C++ 是一門古老而複雜的語言,絕不是一門可以速成的語言,學習它需要有意識的刻意練習和長時間的持續不斷的磨練。而大多數人不太能耐得住寂寞,喜歡速成,所以像《 21 天學通 C++ 》這種書就比較受歡迎,賣得很好。通常那些幹了一兩年就說自己熟悉(甚至精通) C++ 的程式設計師只能算是輕浮的。

Linux 之父 Linus 就曾說:「 C++ 是一門很恐怖的語言,而比它更恐怖的是很多不合格的程式設計師在使用著它」。

所以,要學習 C++ 並打算將其作為自己的首選程式語言,就要做好吃十年寒窗苦的準備,要耐得住寂寞,經得起考驗,最終才能舉重若輕,有所成就。

也正因為此,很多人不大願意學習 C++,還會找一些理由,比如 C++ 沒落了、應用前景不廣泛了作為理由。

其實 C++ 仍然在不斷發展,生命力依然旺盛,有大量的行業和不計其數的應用正在源源不斷地引入 C++ 語言,它的前景依然看好。

接下來我們要討論下列主題:

C++語言的現狀

2015 年 TIOBE 的程式語言排行榜,C++ 位列第三。

Stack Overflow 2015 年的開發者調查結果中有一項是「最受歡迎的技術」,C++ 排名第七,而在最被愛的語言中,C++11 排名第二(僅次於 Swift)。

各種數據表明,C++ 語言依然廣受歡迎和熱愛。這就是它的現狀。

有機構通過分析與 C++ 語言相關的招聘信息得出的結果,使用 C++ 語言的前三個行業是:金融、銀行和遊戲。接下來是:Front Office、通信、電子、投行、市場、製造業、零售業。

如果你想成為開發工程師並喜歡上述行業,學習 C++ 是不錯的選擇。

現在很多人還在使用 C++98(這個標準距今20年了),而 C++ 標準委員會已經在準備 C++17 。較新的標準 C++11 正在普及,主流的編譯器如 GCC 、 VS 、 Clang 的最新版本也都較為完整的支持了 C++11 ,加上追求卓越的 C++ 程式設計師主動在產品開發中引入 C++11 , C++ 的潛能得到了很大的發揮。

如何學習 C++ 語言


我始終認為要系統學習一門語言,最好是跟著一本書邊學邊練習,快速掌握這門語言的語法和基礎特性,然後就可以找小項目練手,練一練再回頭來看書,往復循環,不斷加深理解,慢慢就能掌握到位。

學習 C++ 語言最好的教程,是 C++ 之父 Bjarne Stroustrup 親自撰寫的 《The C++ Programming Language (4th Edition)》,支持 C++11 ,機械工業出版社有英文原版,分兩本,第一本講 1~3 部分, C++ 語言的基礎內容,第二本是專講第 4 部分, C++ 標準庫。

另外還有兩本書,也是學習 C++ 語言的很好選擇,《C++ Primer Plus(6th Edition)》和《The C++ Standard Library: A Tutorial and Reference (2nd Edition)》,也都支持 C++11 。

需要注意的是,選擇(設計)練習項目時,最好能結合當前的學習進度,讓自己能夠完成,收穫正向反饋,激勵自己不斷前進。只有持續的正向激勵,才能讓一個人順暢的完成 C++ 語言的學習。所以,一系列良好的練習項目很重要,既不能難度太低(沒有成就感),也不可難度太高(會有挫敗感),稍稍付出努力就能完成是最理想的。

一旦完成了基礎語言的學習和一系列練習項目,對語言有了一些感知,就可以參與到複雜度較大的項目中來磨練自己。最好是能結合自己的工作與生活,做一些自己感興趣的項目,興趣是最好的老師和最強的動力,如果做的東西感興趣,就很容易鑽進去,學下來。

接下來我們聊聊成為一個能實戰的 C++ 程式設計師都會經歷的那些事兒:

簡要來說說吧。

>> 1. IDE 選擇

我比較喜歡的選擇是 Qt Creator(注意下載 Qt SDK 時選擇 mingw 版本,其中自帶 gcc 編譯工具鏈)。而且這個選擇是跨平臺的,也可以在 Linux 、 Mac OS X上使用。

Windows 下還有一個不錯的選擇—— VS 2013或更高版本,對 C++11 支持還算不錯(不如 gcc )。

>> 2. C++ 語言的學習

結合 C++ 的知識圖譜,對 C++ 語言的學習,建議順序是這樣的:

基礎語言

類與面向對象

輸入輸出

字符串處理(類庫和正則表達式)

容器類庫

泛型算法

多線程

原子操作

大概過一下知識點,具體可以參考知識圖譜。孟巖有一篇名為「快速掌握一個語言最常用的50%」的文章,有很強的參考意義,值得一讀。對於 C++ 語言來講,快速熟悉1、2、3、4、5這幾部分,就可以動手做一些好玩的小程序了。

這部分要了解 C++ 語言的基本數據類型、比如 int 、 char 、 bool 、 unsigned int 、 long 、 float 、 double 、 、 long long 、 enum 、 union 等等。能理解指針、引用等概念。

掌握基本的編程語法,比如表達式、運算符、函數等。關於函數,多說兩句,C++ 裡有函數對象,在標準庫裡廣泛應用,需要了解;另外 C++11 支持 lambda 表達式(匿名函數),威力強大,建議學習。不過這兩點可以稍往後放放。

主要的語言結構,比如 if-else 、 for 、 switch-case 、 while 、 do-while等。

了解 class 的概念,了解繼承、虛函數、重載、重寫、多態、純虛函數、多重繼承等概念,它們是面向對象編程在語言層面的基礎。

面向對象更重要的是思想,很多 C 系程式設計師一直都在用類來寫過程式程序。

要做編程練習,了解基本的輸入輸出操作是必須的。

C++ 裡輸入輸出分 C 和 C++ 兩部分。C 風格的 printf 系列函數、 FILE 、 fopen 、 fread 、 fwrite 等等或 C++ 風格的 istream 、 ostream 、 iostream 、 ifstream 、 ofstream 、 fstream等都可以完成輸入輸出操作 。

字符串處理是我們編程時使用頻率最高的,C++ 裡有 C 風格的字符串庫,比如 strcmp 、 strcpy 、 strstr 、 strchr 等函數,也有更為方便和智能的字符串類,如 string 、 wstring 等,看看 API ,練習一下就可以掌握。

C++11 為了更方便字符串處理,提供了正則表達式類庫,比如 regex 類,regex_match、regex_search、regex_replace等方法,以及 regex_iterator 這個迭代器類。用起來非常方便,功能也很強大。

常見的容器,如 vector 、 list 、 map 、 set 、queue 、 stack 、 deque 、 multimap 、 multiset 等,基本可以滿足日常的開發需要。C++11 引入了定長數組 array ,具有 C 風格數據的特性,更有 C++ 的便利操作;還有 unordered_set 、 unordered_map 等新的非排序容器,可以適應不需要排序的場景。

C++ 裡的泛型算法庫,用起來非常方便,比如 find 、 find_if 、 count 、 count_if 、search 、search_n 、 copy 、 copy_n 、 copy_if 、 sort 、 partial_sort 、 binary_search 、 stable_sort 等等,功能非常強大。這些算法多數基於容器和迭代器,忽略具體數據類型,使用起來稍稍有些難度,不過掌握了容器、模板、迭代器等內容後,就可以很快應用起來。

這些都是 C++11 引入的類庫,從此以後,C++語言本身有了並發編程的能力,非常酷。一個 thread 類,三五行代碼,就可以啟動一個線程,簡單的使用 mutex 和 lock_guard ,就可以完成線程間的資源同步與保護,棒極了。

>> 3. 系統調用

C++ 語言本身只能完成獨立於系統的工作,實際的產品往往是與系統緊密相關的,因此必須熟悉系統調用。常見的系統調用,有 socket ,窗口管理系統(GUI)、文件操作等等。推薦我認為經典的幾本書,可以幫助我們系統學習。

Windows 下推薦兩本書,《Windows 程序設計》和《Windows 核心編程》,應用開發的話,基本有這兩本就夠了。Unix/Linux下也推薦兩本書,《Unix 高級環境編程》和《Unix 網絡編程卷1,套接字》、《Unix網絡編程卷2,進程間通信》。前面我們提到 socket ,其實是屬於網絡編程的一部分,《Unix 網絡編程》講到的東西,Windows 和 Unix/Linux 都能用。

>> 4. 第三方庫類庫

開始學習一門語言時,造輪子可以讓我們快速進步,然而一旦你入了門,開始做實際的產品開發時,在穩定性、可維護性和交付期的壓力下,就需要合理的利用第三方類庫。

圍繞 C++ 語言的第三方類庫非常多,簡單列一下,僅供參考。

GUI:Qt、MFC、WTL、wxWidgets、DirectUI

網絡:ACE,libevent,libuv,libev, ASIO

多媒體與遊戲:Skia、Cairo,SDL,AV3D, OGRE 3D, Cocos2d-x,ffmpeg、OpenH264、VLC、CxImage、CImg

XML:Xerces-C++,CMarkup,libxml++,TinyXML

科學計算:MTL,POOMA, Blitz++ ,CGAL

學習和使用第三方類庫,又分三個階段(我的訂閱號「程序視界」發布過一篇名為「兩招讓你成為牛X的T型人才」,裡面有詳細介紹和實例):

基礎開發,主要是了解API、基於API完成應用

熟悉內核及原理,主要是了解框架的設計原理,閱讀源碼,洞悉內在機理

優化框架,主要是針對框架的已有功能的不足進行完善、優化,或者使用框架提供的機制擴展框架功能,或者對框架進行定製,讓它適合特定情境

有些類庫功能非常豐富,比如 Qt 、 MFC 、 Cocos2d-x 等,單單一個類庫就可以讓人鑽研幾個月到幾年,實際使用時,應當根據實際工作需要,先解決眼前的開發任務,然後設定目標、合理利用時間,沿著上面三個階段來深入學習,培育自己的競爭力。

總結

C++ 語言是一門複雜的語言,學習難度較高,學習時應當快速掌握基本知識,然後不斷在項目中練習,以點帶面擴展學習範圍,閒暇時間有計劃的在深度和廣度兩方面持續學習和積累。一旦形成了這樣的良性循環,就可以熟練掌握 C++ 語言及相關的類庫,不斷精進。

相關閱讀

戳閱讀原文,到分答問我,我們一起賺冰棍消消暑~

>> 福利,送書

這次送的書是C++ 之父 Bjarne Stroustrup 親自撰寫的 《The C++ Programming Language (4th Edition)》,上下兩冊哦。送書規則(必須同時滿足哦):

本人在本文後留言

邀請朋友在本文後按照【支持-你的暱稱】的格式留言,比如你的暱稱是葉良辰,別人要支持你,需要留言【支持-葉良辰】。截止7月9日早上7點,支持者最多且超過15的兩位朋友獲得贈書。支持者最多的,獲得上冊(1到3部分),次多的,獲得下冊(第4部分)。

注意,我會在7月9日發文時公布活動結果。獲得贈書的朋友到時請加我微信a316576715,提供快遞地址和聯繫方式,我會快遞書給你。

號外:凡是有人支持的朋友,都會獲得我收藏的6本經典電子書,加我微信留下郵箱,活動結束後統一發郵件。

相關焦點

  • C++機器學習庫介紹 | 文末送書
    依靠這些庫,我們的學習能力和編寫代碼,無論是在C++或Python,都是如此的簡單和直觀。C++中的機器學習庫在本節中,我們將介紹C+中兩個最流行的機器學習庫:1.SHARK庫Shark是一個快速的模塊庫,它對監督學習算法(如線性回歸、神經網絡、聚類、k-means等)提供了強大的支持,還包括線性代數和數值優化的功能,這些是在執行機器學習任務時非常重要的關鍵數學函數。
  • Google C++項目編程風格指南 (中文版) 分享
    源GitHub項目:https://github.com/google/styleguide中文翻譯:https://github.com/zh-google-styleguide/zh-google-styleguide如果下載有問題,可以在後臺回覆:「c++
  • C++伺服器開發完整學習路線(含免費學習資料下載地址)
    C++伺服器開發完整學習路線(含免費學習資料下載地址)相信大部分同學剛畢業或者想轉行做c++服務端開發的時候都很迷茫不知道從哪裡開始學習,於是準備參加各種培訓班或者網絡培訓,無奈動不動成千上萬元的高昂的價格另人望而卻步,對於在校學生或者剛出來就業的新人無疑是沉重都打擊,最後決定自學,但是卻不知道從哪裡下手。
  • 跟我學C++中級篇——STL的學習
    同時,隨著c++標準的不斷迭代,還推出了很多新的庫,同學們需要不斷的學習跟進,目前最新的c++標準為c++20。c++庫主要包括:1、標準的IO類,如std::cout,std::in,ofstream等。2、必須要提到的std::string。3、數值處理相關類,numeric的complex。4、本地化庫。5、異常庫。6、其它。7、STL(標準模板庫)。在後面的學習應用中將以STL為主,穿插學習標準庫的其它用法。
  • 學習c++筆記——標準輸出流cout
    前和往常一樣,一邊喝早茶,一邊上網和女粉絲侃大山,在手機和平板電腦上整理修改《html5》、《javascript》、《css3》、《c語言》等多年前寫的教程(c++
  • C++、java 和 C 的區別
    2.java和c#裡面都有字符串型 和byte型, 但c++裡面沒有,但它是以另外的形式存儲這類型的數據的,比如 java和c#裡面的 byte其實就是unsigned char類型;c++中字符數組就能存儲字符串 (char a[]={"hello"}; ps:注意c++裡面定義數組 變量必須在中括號前面)。
  • C++機器學習庫介紹
    依靠這些庫,我們的學習能力和編寫代碼,無論是在C++或Python,都是如此的簡單和直觀。C++中的機器學習庫在本節中,我們將介紹C+中兩個最流行的機器學習庫:SHARK庫MLPACK庫讓我們逐一查看並查看他們的C++代碼。
  • 那些容易犯錯的c++保留字
    本文首發 | 公眾號:lunvey目前正在學習vc++6.0開發,而這裡面使用的是c++98標準。
  • c++的輸入與輸出
    c++輸入與輸出C++ 標準庫提供了一組豐富的輸入/輸出功能,本章將討論 C++ 編程中最基本和最常見的 I/O 操作。輸入輸出並不是c++語言的正式組成成分,c和c++沒有為輸入輸出提供專門的結構。在c語言中輸入輸出是通過調用scanf和printf 實現的,在c++中是通過調用流對象cin和cout實現的。
  • c++之重載函數學習總結
    c++中通過函數名和函數參數確定函數調用二、重載函數進階學習1、重載與指針:下面的函數指針將保存哪個函數的地址?/a.outc=2從輸出結果來看,很明顯調用了第一個func函數。+編譯器能夠兼容c語言的編譯方式c++編譯器會優先使用c++編譯的方式extern關鍵字能夠強制讓C++編譯器進行c方式的編譯:extern "c"{
  • C 2 C++進階篇(1)
    之前一直是對於面向過程的編程,python有過那種對象風格的編程,但是對於oop的實際開發還停留在表面,沒有獨立的開發c++經驗,也有好幾年沒有碰過c了。由於接手Qt的相關項目,所以對c to c++的進階希望能進行個自我總結。
  • C++之標準庫的學習總結
    ;<2它的意義是將整數1按位左移2位,即:0000 0001   演變成      0000 0100重載左移操作符,將變量或者常量左移到一個對象中       return *this;    }};Console cout;int main(){     cout<<1 << endl;     cout<<"TXP"<<endl;     double a = 0.1;     double b = 0.2
  • C++之字符串類學習總結
    一、回顧c語言對字符串的實現:一般我們在c語言要實現對字符串操作的話,一般是採用字符數組或者一組函數來實現的,為啥這樣做呢,那是因為c語言裡面根本就沒有字符串類型的關鍵字;而且c語言也支持自定義類型,所以更加無法獲得字符串類型為了解決這個問題,在c++
  • 九大程式語言優缺點第四期:c++
    C++:c++誕生於1983年,緊隨c語言的步伐,c++是C語言的超集,大家所知道的C語言是面向過程的,java是面向對象的,那麼C語言為了面向對象,所以誕生出現在大家所熟知的c++,被廣泛視為大規模應用構建軟體。
  • scratch/python/c++,小孩學編程學哪個好?
    一般會建議三年級開始學習,但是從我家孩子的情況來看,由於識字較早,一年級完全可以了,不過不要進行強迫。有的家長認為學幾天停幾天就前功盡棄了,不是的。多學一天就肯定多一天的收穫,並不會因為中間停了,以前學的就白學了。這個階段是培養興趣階段,非常忌諱強迫性學習,厭學一般都是強迫的結果。scratch和編程貓各有優缺點。
  • C++ 優先隊列priority_queue
    學習優先隊列之前先看個單詞隊列 queue, 這個單詞的讀法很多人都能讀對吧,音標是 /kjuː/ ,再看一個雙端隊列 deque,它的音標是
  • c++ 之布爾類型和引用的學習總結!
    2、C++編譯器會將非0值轉換為true,0值轉換為false。,不過在c++中的三目運算符的用法就比c語言更加高級了,來先看一個示例:int a = 1;int b = 2;( a < b) ?
  • 學習C++,這13本書就夠了!
    本書單針對C++的學習,主要分為四大部分,以程式語言學習為主,涉及部分作業系統、計算機網絡、Linux開發的必讀書籍。有初學者入門必讀,也有適合高階段同學讀的書籍,大家可以選擇性閱讀!1、《c++語言的設計與演化》作者:[美]BjarneStroustrup推薦原因:C++的設計者關於C++語言的最主要著作之一,可以用來理解C++的設計思路 2、C++ primer作者:[美] Stanley B.
  • python+C、C++混合編程的應用
    有的語言專注於簡單高效,比如python,內建的list,dict結構比c/c++易用太多,但同樣為了安全、易用,語言也犧牲了部分性能。在有些領域,比如通信,性能很關鍵,但並不意味這個領域的coder只能苦苦掙扎於c/c++的陷阱中,比如可以使用多種語言混合編程。
  • C++卡牌小遊戲
    以前上學的時候業餘學了點c++ ,也僅僅用來做過一個控制臺版的「學生管理系統」,現在工作接觸最多的還是C語言,c++那各種屌炸天的語法和