1. 程式人生 > >引導你逐步深入學習C++

引導你逐步深入學習C++

作者簡介:安曉輝,程式設計師、技術管理者、作家、職業規劃師、在行行家、分答答主,著有《Qt on Android 核心程式設計》、《Qt Quick核心程式設計》和《你好哇,程式設計師》,建立訂閱號“程式視界”。

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++程式設計師都會經歷的那些事兒:

  • IDE選擇
  • C++語言
  • 系統呼叫
  • 第三方類庫

簡要來說說吧。

IDE選擇

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

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

C++語言的學習

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

  1. 基礎語言
  2. 類與面向物件
  3. 輸入輸出
  4. 字串處理(類庫和正則表示式)
  5. 容器類庫
  6. 泛型演算法
  7. 多執行緒
  8. 原子操作

大概過一下知識點,具體可以參考知識圖譜。孟巖有一篇名為“快速掌握一個語言最常用的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 ,就可以完成執行緒間的資源同步與保護,棒極了。

系統呼叫

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

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

第三方庫類庫

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

圍繞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型人才”,裡面有詳細介紹和例項):

  1. 基礎開發,主要是瞭解API、基於API完成應用。
  2. 熟悉核心及原理,主要是瞭解框架的設計原理,閱讀原始碼,洞悉內在機理。
  3. 優化框架,主要是針對框架的已有功能的不足進行完善、優化,或者使用框架提供的機制擴充套件框架功能,或者對框架進行定製,讓它適合特定情境。

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

總結

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

相關推薦

引導逐步深入學習C++

作者簡介:安曉輝,程式設計師、技術管理者、作家、職業規劃師、在行行家、分答答主,著有《Qt on Android 核心程式設計》、《Qt Quick核心程式設計》和《你好哇,程式設計師》,建立訂閱號“程式視界”。 C++是一門古老而複雜的語言,絕不是一門可以速成的語言

[深入學習C#]C#實現多線程的方式:Task——任務

ren avr 利用 run 如何 創建 其中 continue rep 簡介   .NET 4包含新名稱空間System.Threading.Tasks,它 包含的類抽象出了線程功能。 在後臺使用ThreadPool。 任務表示應完成的某個單元的工作。 這個單元的工作可以

如何深入學習C語言

學習C語言不是一朝一夕的事情,但也不需要花費十年時間才能精通。如何以最小的代價學習並精通C語言是本文的主題。請注意,即使是“最小的代價”,也絕不是什麼捷徑,而是以最短的時間取得最多的收穫,同時也意味著你需要經歷艱苦的過程。 一、要讀就讀好書,否則不如不讀    所有初學者

逐步深入瞭解SSM框架——淘淘商城專案之框架整合,後臺系統搭建

1.  今日計劃 1、  SSM框架整合 2、  mybatis逆向工程 3、  商品列表 4、  商品列表分頁處理 2.  SSM框架整合 2.1. 後臺系統所用的技術 框架:Spring + SpringMVC +Mybatis 前端:EasyUI 資料庫:mysql

逐步深入瞭解SSM框架——淘淘商城專案之實現商品新增

1.  課程計劃 完成商品新增功能 1、商品類目選擇 2、圖片上傳 3、圖片伺服器搭建 4、kindEditor富文字編輯器的使用 5、商品新增功能 2.  實現商品類目選擇功能 2.1. 需求

逐步深入瞭解SSM框架——淘淘商城專案之專案總結

1.  專案總結 總結淘淘商城中用到的技術點: 1.1. 專案工程搭建。 1、使用maven構建工程。Maven的繼承、聚合、依賴管理。 2、Svn的使用,svn上傳下載程式碼。 1.2. ssm框

逐步深入瞭解SSM框架——淘淘商城專案之購物車+訂單實現

1   今日大綱 1、  實現淘淘商城的購物車功能 2、  實現訂單系統。 2   購物車功能 2.1  功能說明 1、商品加入購物車時,不是必須要求登入。 2、計算購物車中商品的總價。當商品數量發

逐步深入瞭解SSH框架——ssh框架整合

. 今天內容介紹 SSH三大框架整合 (1)struts2 (2)hibernate5.x                                                    

逐步深入瞭解SSM框架——淘淘商城專案之redis快取

1.  課程計劃 1、  Redis服務搭建 2、  為功能新增快取功能 2.  redis介紹 2.1. 什麼是redis          Redis是用C語言開發的一個開源的高效能鍵值對(k

逐步深入瞭解SSM框架——淘淘商城專案之商品詳情頁面實現

1.  課程計劃 l  商品詳情頁實現    1、商品查詢服務事項       2、商品詳情展示    3、新增快取 2.  實現商品詳情頁功能 2.1. 功能分析 1、Taotao-portal

逐步深入瞭解SSH框架——struts2入門

. 今天內容 1 struts2概述 (1)應用在web層 2 struts2入門案例 3 struts2底層執行過程 4 struts2相關配置 (1)struts.xml配置 - packa

[深入學習C#]利用反射給物件賦值

  C#中利用反射能夠獲取物件的屬性資訊,也可以利用反射給物件賦值。   我們如果想利用凡是給一個物件屬性賦值可以通過PropertyInfo.SetValue()方式進行賦值,但要注意值的型別要與屬

逐步深入瞭解SSM框架——SpringMVC框架詳解

1      SpringMVC架構 1.1    Spring web mvc介紹 Spring web mvc和Struts2都屬於表現層的框架,它是Spring框架的一部分,我們可以從Spring的整體結構中看得出來:   1.2 

應當如何學習C++(以及程式設計)(rev#1)

你應當如何學習C++(以及程式設計)(rev#1) By 劉未鵬(pongba) ,其實C++何嘗不是。坊間流傳的錯誤的C++學習方法一抓就是一大把。我自己在學習C++的過程中也,浪費了不少時間。 為什麼會存在這麼多錯誤認識?原因主要有三個,一是C++語言的細節太多。

逐步深入瞭解SSM框架——淘淘商城專案之單點登入系統實現

1.  課程計劃 1、  實現單點登入系統 2、  實現使用者的登入功能 3、  實現使用者的註冊功能 2.  單點登入系統分析 2.1. 什麼是SSO SSO英文全稱Single Sign On

[深入學習C#]——IEqualityComparer中GetHashCode的作用

總結: 實現IEqualityCompare<T>介面的時候,需要實現Equals()和GetHashCode()兩個方法。實現Equals()方法之後,最好把GetHashCode()

應當如何學習C++(以及程式設計)(劉未鵬)

Javascript是世界上最受誤解的語言,其實C++何嘗不是。坊間流傳的錯誤的C++學習方法一抓就是一大把。我自己在學習C++的過程中也走了許多彎路,浪費了不少時間。 為什麼會存在這麼多錯誤認識?原因主要有三個,一是C++語言的細節太多。二是一些著名的C++書籍總在(不管

深入學習c++--重新審視auto

自定義 變量 eight 重新 遍歷 image png 圖片 技術 1. auto推斷變量類型 2. auto遍歷 3. 自定義類可使用auto 深入學習c++--重新審視auto

深入學習c++--智能指針

typedef mem stream obj ptr oid const class () 1. 幾種智能指針 1. auto_ptr: c++11中推薦不使用他 2. shared_ptr: 每添加一次引用 就+1,減少一次引用,就-1;做到指針進行共享 3. un

深入學習c++--智能指針(二) weak_ptr(打破shared_ptr循環引用)

aud nbsp else 之間 沒有 kobject 智能 one 訪問 1. 幾種智能指針 1. auto_ptr: c++11中推薦不使用他(放棄) 2. shared_ptr: 每添加一次引用 就+1,減少一次引用,就-1;做到指針進行共享 3. unique