現代C++學習筆記(0):開篇

2022-01-10 不靠譜顏論

收錄於話題 #C++ 2個

這是我的第 20 篇原創文章

(題圖來自網絡並做適當修改)

安身立命的本事,還是不能丟的。從這篇起,我將以筆記分享的方式,開啟一段重新學習C++的新旅程。

1

C++是計算機語言中的絕對神器。尤其是近十多年來快速推出的新標準,C++11/14/17/20……,通常被稱為現代C++(與之相對應的舊標準,則稱為經典C++),可以做到在底層接近字節級或機器代碼級的精細操控,同時在頂層還能夠比拼Java、C#等語言,架構企業級超大型應用。這種「跨層次」性,使得通過學習C++語言所建立起的計算機科學思維,具備獨特的延展性,在各種不同場景都能撥雲見日、遊刃有餘。

C++算是我的日常工作語言之一,但是新標準的語法,我用得並不算多。很早我就希望能夠系統性地學習一遍,但始終未果。最近剛好開始閱讀Scott Meyers的經典《Effective Modern C++》,借著這個契機,我開始重新學習C++。

這本書並不是教材,它是延續早年同系列的《Effective C++》和《More Effective C++》的條款文體,對現代C++的重要內容及最佳實踐,進行詳細闡釋,屬於能力拔高型的書籍。因此,作為學習筆記,我將不限於這本書的內容,並在需要的時候,追溯到其他任何可能有幫助的資料。我的計劃是以這本書為主線,查缺補漏地,完成這次系統性的學習。

2

關於C++新標準,經歷過一段有意思的歷史。經典的C++標準是1998年發布的,被稱為C++98。在那之後的很長時間裡,C++委員會一直試圖推出新標準,卻一再延期。當時對新標準的暫命名為C++0x,然而直到2010年,新標準都未能敲定,以至於當時大家都調侃戲稱「C++0x中的0x,其實是十六進位的意思,所以我們還可以拖五六年」。直到2011年,C++11新標準最終發布,才算讓很多人都鬆了口氣,也看到了C++語言的新希望。同時,為了讓這種拖延症不再如此表現嚴重,C++委員會宣布了之後每三年就會推出一版新標準,而這規則竟然一直堅持到了今天。是的,現在C++23標準已經在向我們揮手啦。

(圖片來自:https://www.modernescpp.com/index.php/c-20-an-overview)

既然現在新標準推出這麼快,以至於很多編譯器都未必能夠很快且很穩定地全部實現。那麼,一個值得了解的問題是,到底大家在現實中會用哪套標準呢?針對這個問題,C++ Stories網站(由Bartlomiej Filipek建立並維護,他也是《C++17 in Detail》和《C++ Lambda Story》兩本書的作者)上每年年末都會在網上發起一個投票統計並展示結果,可以做參考:

(以上兩個截圖來自:https://www.cppstories.com/2021/cpp-status-2021/)

可見,還是有相當多人會快速跟進並使用較新的語言標準的,這應該與新標準帶來的語法簡化和便利性有很大關係(C++能保持向後兼容性,在不犧牲原標準的強大能力的情況下,擴展出更加簡便的語法,這也是很神奇的事)。而C++17的使用率遠高於C++20,則很可能與編譯器的支持情況等有關。所以,預期隨著C++23標準的成熟和推出,C++20的使用者人數及比例應該也會越來越多。

3

那麼,C++語言在生物信息學領域的應用又如何呢?

針對這個問題,可以在GitHub上查詢並選擇bioinformatics這個主題標籤,看到生信相關的不同語言實現的軟體倉庫數量:

(截圖自GitHub,https://github.com/topics/bioinformatics?o=desc&s=stars)

果然,Python獨佔鰲頭,其比例遠高於其他語言。而R緊隨其後。再之後就是C++(Jupyter Notebook中使用的大概率會是Python),比例大概佔到1/20。

然而,在我們通常了解到的生信培訓或課程中,幾乎沒有講授C++語言的內容。大概我們培訓的目的,主要還是希望能快速入門和上手,能夠充當工具人吧。既然如此,在我後續的筆記中,我還是有必要多結合生信的相關背景來做展開,這對於幫助生信從業者們擺脫「工具人」標籤,我想應該會有一定幫助吧。

相關焦點

  • C++語言學習筆記1
    聲明:       本系列是我從csdn上學習c++語言基礎記錄的筆記,是跟著賀利堅老師所學,這位老師在教學上有獨特的見解,而且人非常耐心,他的課程也非常適合我這種跨專業程式語言學習者。        本系列將記錄C++語言學習的點點滴滴,內容中會有部分賀老師的課件截圖,現已獲得賀老師授權,發出來分享給大家。
  • 學習c++筆記——標準輸出流cout
    前和往常一樣,一邊喝早茶,一邊上網和女粉絲侃大山,在手機和平板電腦上整理修改《html5》、《javascript》、《css3》、《c語言》等多年前寫的教程(c++
  • 現代C++學習筆記(1):工具資源篇
    這是我的第 26 篇原創文章(題圖來自網絡並做適當修改)所謂「工欲善其事,必先利其器
  • 如何正確通過 C++ Primer 學習 C++?
    16章講泛型編程,第一次讀16.1節,掌握最基本的函數模板和類模板就行了。Part4就更高檔了,很多內容第一次就算啃下來,長久不用又忘了。第一次讀推薦把18.2節讀懂,命名空間簡單易用效果好。別的內容可以觀其大略,用時再看。17.1節的tuple是個有趣的東東,可以讀一讀。17.3節的正則表達式和17.4節的隨機數也許有用,也可以讀一讀。如
  • 跟我學C++中級篇——STL的學習
    一、c++標準庫C++的標準庫主要包含兩大類,首先是包含C的標準庫的,當然,為了適應c++對一些C庫進行了少許的修改和增加。最重要的當然是面向對象的c++庫;而c++庫又可以分成兩大類,即面向對象的c++庫和標準模板庫,也就是題目中的STL。
  • c++之重載函數學習總結
    }上面在c++編譯器裡面編譯時沒有問題的,如果放在c語言編譯器裡面編譯是會報錯的:root@txp-virtual-machine:/home/txp# gcc test5.ctest5.c:8:5: error: conflicting
  • C++伺服器開發完整學習路線(含免費學習資料下載地址)
    C++伺服器開發完整學習路線(含免費學習資料下載地址)相信大部分同學剛畢業或者想轉行做c++服務端開發的時候都很迷茫不知道從哪裡開始學習,於是準備參加各種培訓班或者網絡培訓,無奈動不動成千上萬元的高昂的價格另人望而卻步,對於在校學生或者剛出來就業的新人無疑是沉重都打擊,最後決定自學,但是卻不知道從哪裡下手。
  • C 2 C++進階篇(1)
    之前一直是對於面向過程的編程,python有過那種對象風格的編程,但是對於oop的實際開發還停留在表面,沒有獨立的開發c++經驗,也有好幾年沒有碰過c了。由於接手Qt的相關項目,所以對c to c++的進階希望能進行個自我總結。
  • C++之字符串類學習總結
    一、回顧c語言對字符串的實現:一般我們在c語言要實現對字符串操作的話,一般是採用字符數組或者一組函數來實現的,為啥這樣做呢,那是因為c語言裡面根本就沒有字符串類型的關鍵字;而且c語言也支持自定義類型,所以更加無法獲得字符串類型為了解決這個問題,在c++
  • C++之標準庫的學習總結
    0.1;     double b = 0.2;     cout << a + b <<endl;     return 0;}運行結果:root@txp-virtual-machine
  • C/C++學習實踐利器bcw5.02(提供下載)
    bcw5.02是大名鼎鼎的Borland公司於上世紀90年代推出的最後一個C/C++集成開發環境,是筆者非常喜愛的C/C++學習實踐利器。筆者從學習tubroC開始,一直粉該公司的bcw2.0、bcw3.0、bcw3.1、bcw4.0、bcw4.5、bcw5.0、bcw5.02直到後來的c++build系列版本並且保存收藏。從開發現代軟體角度看,肯定選擇cbuild集成開發包,但從大中小學生學習C/C++編程看,筆者認為bcw5.02是不二選擇,幫助料足、源碼例子豐富。
  • c++ 之布爾類型和引用的學習總結!
    :1、bool類型只有true(非0)和false(0)兩個值。2、C++編譯器會將非0值轉換為true,0值轉換為false。/a.outsizeof(b) = 1b = 0, a = 0b = 1, a = 1b = 1, a = 1a = 10, b = 1a = 0, b = 02、C++中的三目運算符:對三目運算符,想必大家都再熟悉不過了
  • c++之內存分配、命名空間、強制類型轉換學習總結
    一、C++動態內存分配:在學習c語言的時候,我們一般都是使用庫函數malloc()來進行內存的申請分配,然後使用庫函數free()來進行釋放申請到的內存;現在在c++裡面採用了另外一種內存申請的方法:c++中通過
  • c++入門教程-1
    1、安裝g++編譯器用root用戶登錄伺服器,執行以下命令安裝或升級gcc-c++編譯器。yum -y install gcc-c++如果您的CentOS系統沒有安裝gcc-c++,以上命令就會安裝最新版本的gcc-c++,如果已經安裝了gcc-c++,就會更新到最新版本的gcc-c++,所以,以上命令不管執行多少次都沒有問題。
  • 001 初識c++/利用vs2019寫c++程序
    C++擅長面向對象程序設計的同時,還可以進行基於過程的程序設計,因而C++就適應的問題規模而論,大小由之。C++不僅擁有計算機高效運行的實用性特徵,同時還致力於提高大規模程序的編程質量與程序設計語言的問題描述能力。
  • C++機器學習庫介紹
    C++是我學習過的第一種程式語言,我喜歡在機器學習中使用它。我在之前寫過關於構建機器學習模型的文章。我收到了一個回復,問我C++有沒有機器學習的庫?這是個公平的問題。像Python和R這樣的語言有大量的包和庫來滿足不同的機器學習任務。那麼C++有沒有這樣的產品呢?是的,是的!
  • 整理了一份C++學習路線圖!
    ++學習路線圖分享給大家!項目最好統一使用C++11新特性,可以看這個:《c++11新特性,所有知識點都在這了!》如何設計這個項目的架構呢?這是個技術活,也是個經驗活,你可以參考參考別的項目?或者自底向下,走一步看一步,哪個模塊的代碼寫完後看著不順眼了重構一波,一般我看自己兩個月前寫的那些代碼都會感到彆扭,這時就可以考慮考慮學習一波設計模式!
  • 學習筆記:學好《習近平談治國理政》第三卷開篇之作
    這一重要著作出版以來,在廣大黨員、幹部、群眾中引起強烈反響,迅速掀起學習熱潮。即日起,「學而時習工作室」推出系列文章,與大家一起分享學習體會。今天,筆記君與您一起重溫該書開篇之作《決勝全面建成小康社會,奪取新時代中國特色社會主義偉大勝利》。
  • C++ 的幾個for 循環,範圍for語句
    我認為做嵌入式開發也需要學習
  • 2021年最新整理, C++ 學習資料,含C++ 新特性、入門教程、推薦書籍、優質文章、學習筆記、教學視頻等​
    +開發人員都應該使用的10個c++11特性在c++項目中你必須真正使用的15個c++11特性如何在 C++11 中使用 Lambda 表達式深入理解C++11P29 16 複合&繼承關係下的構造和析構P30 17 關於vptr和vtblP31 18 關於thisP32 19 0