web程序員應該如何學習C++?
同類問題:C++ 程序員如何成為一個web開發者?
我是一個4年經驗的PHP程序員,目前使用的是laravel這種抽象程度非常高的PHP框架。追求快速開發。之前有用過易語言,深度到Api Hook、進程注入、IOCP、GDI繪製界面、實現過內存池、線程池、哈希表、HttpServer。後來轉型WEB開發,從html5開發app,學到寫JQuery插件、發現ThinkPHP的抽象層次不夠、換了Laravel這種抽象層次高框架。
學C++的目的是為了寫一些日常小工具,控制台程序和GUI都需要吧。Socket和Http之類的應用層協議最好也能拿來就用的。C#是個很好的選擇,和Laravel的抽象程度相當。但是因為它的GUI不能跨平台、不能很好的接觸數據結構所以沒有選用。目前裝了VS2015,試了試openFrameworks這樣的C++跨平台快速開發框架。但是感覺不太順手。例如它的網路庫,沒有像C#那樣提供解析uri、 query string的方法; 它的TCP Client,connect步驟竟然隱式包含在setUp[1]方法裡面。說明它抽象得不夠好。如果要用來快速開發應用、還是要做一些輪子的工作。請問,我這樣一個程序員,現在想學C++來做一些小工具,什麼樣的路線比較順暢呢? [1]: ofxTCPClient
謝邀,題主的需求如下:
- 控制台、GUI都能做
- 高抽象
- 跨平台
- 有Socket和Http庫
- 可以解析uri、query string
那我推薦一個很完美的C++跨平台框架——Qt
Qt的背景介紹,可以看這裡qt_百度百科我就簡單說下題主幾個需求在這個框架里的實現吧1、高抽象
Qt的抽象做的非常完美,各種設計模式在不經意間很自然地應用其間,整個體系架構和組件分離非常清晰,API設計優雅,具備完善程度堪比MSDN的官方文檔。Qt自帶了近千個Demo,涵蓋了幾乎所有功能。同時,官方也提供了大量的視頻教程,不過得翻牆上油管看。2、開源
Qt全部源碼開源,基於LGPLv3協議,同時提供商業協議3、GUI
Qt有兩套GUI系統。
一套是傳統的基於Widgets的GUI,是目前幾乎最強大的c++ widgets體系的gui框架(暫時已經沒有對手,如果有就是C#的WPF,但C#的性能和C++比么。。。),對界面動畫有狀態機和動畫機制實現,對複雜數據呈現有Model-View-Delegate體系,對高性能繪製提供了直接操作OpenGL的API,甚至還有圖表、數據可視化等現代化數據展示組件。
Qt Widgets框架基於類似XAML的模式描述界面,可使用所見即所得的界面編輯器實現界面。但同樣也可手寫代碼生成界面,並提供將界面描述文件在運行時載入解析為GUI的介面。另一套是現在Qt主推的界面開發模式,Qt Quick,使用基於CSS和JS定義的QML腳本語言編寫。相比默認使用CPU渲染的Qt Widgets,Qt Quick使用GPU渲染,性能更高。而開發的效率和界面的靈活度方面,身為web程序員的題主應該能夠有所體會——QML是在用web的方式寫GUI。
對了,QML支持hiDPI。界面調試上,Qt Creator這個IDE集成了Profile工具,可以像用瀏覽器開發者模式一樣調試分析QML程序的運作。關於Qt Quick與html5體系的對比,可參見這個題目HTML5與Qt QML僅從做UI的角度比較,哪個更便捷,哪個更強大,哪個(被渲染)性能更高呢?QML做的東西有多漂亮么,這個答案里有幾個案例,還僅至只是個人開發的練手之作有哪些顏值高的 PyQt/Qt 應用? - Python4、跨平台
Qt是完美的跨平台類庫,理論上用Qt + c++11寫的代碼,可以無需修改處處編譯。
Qt支持的平台,目前最新版本支持如下平台:WindowsLinux/X11OS XEmbedded LinuxQNXWindows PhoneWindows RuntimeiOSAndroid
vxWorks……實時操作系統方面,Qt是很流行的嵌入式c++應用開發框架主流操作系統方面,Qt幾乎全功能可以在windows、*nix、IOS、Android上運行沒錯,Qt代碼可以直接部署到IOS和Android和WP。目前暫不支持Win10的UWP,但相信增加這個支持也不需要太久編譯工具鏈方面,Qt支持make和cmake,以及vs的nmake,可以完美適配gcc msvc icc clang等主流c++編譯器,自帶功能完備(包括clang靜態分析和valgrind內存檢查)的IDE
Qt有Python版!
Qt有Python版!Qt有Python版!重要的事情說三遍。Qt是Python上最流行的GUI框架,沒有之一(當然不包括web ui)5、成熟的應用
應用有多廣泛,有多少牛x的案例呢……大型商業化合作夥伴,可以直接查看Qt官網Qt | Cross-platform software development for embedded desktopQt的成熟案例,可以看下面兩個傳送門:有什麼很好的軟體是用 Qt 編寫的? - C++ (Autodesk、Opera、Maya、極品飛車、VirtualBox、GoogleEarth、Doxygen、Mathematica、Skype、Xconfig、WPS、YY語音……)Qt 為什麼在桌面應用(Windows 平台)中不流行呢? - Nebula.Trek 的回答 (大型3d,vr,管理軟體和器械嵌入軟體、宇航、軍事系統……)6、豐富的類庫
太多了,這個是Qt的優點也是槽點。優點在於,Qt類庫豐富到堪比Boost甚至比Boost更萬能,從界面到後台,從pc到移動,從exe到app到web無所不能。缺點在於,太龐大。幾十個dll,小的兩三兆,大的一二十兆。不過還好,因為是開源,並且Qt的開源工程里支持了超級豐富的配置,可以精細到以類為單位進行裁剪,並靜態編譯,如 @姚冬 參與開發的YY語音,裁剪後的依賴庫加起來貌似就20M。
對於Qt過於龐大的問題,官方啟動了Qt Lite Project:Introducing the Qt Lite project 目標是Qt for any platform, anything, any size我簡單列舉下Qt的組件列表吧
Qt Core
核心組件,提供信號槽機制(支持同步/非同步的,多對多,發送接收方互相無需可見的,線程安全且類型安全的消息機制,其中同步發送時性能與直接調用幾無差別)、事件循環、基於對象樹的內存自動管理、線程、線程池、Runnable、Locale處理、正則表達式、Codec、內部統一Unicode的字元串、性能和API堪比STL的QTL容器(可和STL演算法庫完美適配)、狀態機、互斥鎖、原子操作、信號量、智能指針、file、fileSystem、tempFile、tempDir、文本流、二進位流(DataStream,可用做數據持久化)、gzip壓縮解壓、base64編碼轉換、各類hash演算法、GUID處理、IODevice(一切基於管道的IO組件介面,包括字元串流操作)、插件機制、本地化……QTL提供Qt風格、STL風格、Java風格的介面,性能和STL的對比分析見我這個回答:Qt的容器庫對比C++的STL?在信號槽機制支撐下,Qt多線程編程可以實現全程無鎖Qt Gui
GUI的基礎支撐組件,包括Accessible、bitmap、pixmap、顏色處理、游標、拖放、界面事件、OpenGL介面、圖標處理、圖片處理(可通過插件方式擴展支持的圖片格式)、動態圖片、paintEngine渲染器、painter繪製器、transform圖像變換、字體渲染、文本渲染(從Document到Frame到Line到Char,包括cursor和format)、觸屏支持、矩陣計算、向量計算……Qt Widgets
GUI控制項庫,包括窗口、MDI子窗口、dock控制項、各類layout、各種widget/frame/label/button/SpinBox/GroupBox/CheckBox/LineEdit/TextEdit(富文本)/PlainTextEdit/ScrollArea/Table/Tree/List/Menu/Action/Slider/Tab/Calender/Dialog等
界面風格可設置,默認使用系統風格,可自行編輯主題,有palette界面調色板,甚至能用類css語法寫stylesheet功能組件豐富,包括fontdialog fonrcombobox filedialog colordialog等等等等……能接入mac os的ns系控制項能接入windows系的ActiveX .COM控制項能獲取到控制項對應的系統本地handle,以和系統本身的gui介面對接這還只是基礎控制項庫。更高級的控制項,通過其他類庫方式接入Qt Quick
Qt Quick ControlQt Quick DialogsQt Quick Layouts
Qt QmlQt Quick ExtrasQt Quick Widgets這幾個都是Qt Quick框架的組件,作為沒寫過web的程序員,我是真弄不清……Qt XML
XML解析,支持dom模式和stream模式Qt XmlPatternsXML高級應用,如XPath, XQuery, XSLT 和 XML schema校驗……Qt Network
網路庫,封裝層級極高,不適合高並發服務端編程。具備tcp、udp、http、ssl、localSocket……Qt WebView
基於Chromium的WebView控制項庫Qt Script
Qt Script ToolsECMA6腳本引擎。對,你沒看錯。Qt Multimedia
多媒體庫,包含多媒體處理、編碼、解碼,包括音頻、視頻、攝像,支持通過插件方式擴展格式Qt Multimedia Widgets多媒體的Widgets和QML控制項Qt Sql
基於SQL語法的關係型資料庫類庫,可通過插件擴展支持資料庫。默認提供DB2、IBASE、MYSQL、OCI、ODBC、PSQL、SQLITE、TDS提供基於Model-View-Delegate的Model和Delegate,可直接將一張表格或一個query關聯到一個Table控制項中,同步界面各種操作,輕鬆實現資料庫瀏覽/編輯器……Qt Test
單元測試框架。沒錯,數據驅動、線程安全、類型安全、帶benchmark的單元測試……每組test case就寫一個類,裡面寫多個test函數,每個函數是一個test case,函數內部只需要正常寫調用,加上三五個宏接入用例數據,然後直接編譯運行就行支持通過spy方式,hook到信號槽過程中,監聽信號槽運行支持模擬滑鼠、鍵盤、觸摸事件支持benchmark,可統計任意代碼段的精確執行時間,包括系統時間、用戶時間、CPU時間等,時間單位可以是毫秒納秒微秒這類,也可以是cpu時鐘周期Qt Bluetooth
Qt LocationQt PositioningQt NfcQt Sensor這幾個不用多解釋了吧……為移動開發設計,包括藍牙、定位、nfc、感測器,具備後台類、widget控制項、qml控制項Qt Purchase
沒錯,支付組件……Active Qt
對Windows的ActiveX和.COM的接入Qt 3D
基於OpenGL的簡單的3D引擎,支持Widgets和QML,並且是准實時的……Enginio
BaaS雲服務接入……是Qt官方提供的雲服務Qt Android Extras
安卓API接入Qt Canvas 3D
可以用JS在QML中,以類似寫OpenGL程序一樣的方式寫3D……Qt Concurrent
並行開發組件。沒做,你沒看錯,並行開發。包含Map-Reduce和Future,都是寫好演算法函數後,一行代碼完成執行。Qt D-Bus
基於D-Bus的IPC、RPC遠程調用。D-BUS在Linux中自動集成,在Windows中可自行編譯支持。話說把這個和Qt Concurrent結合使用後,是不是就成分散式開發框架了(逃Qt Graphical Effects
為Qt Quick提供的界面特效Qt Image Formats
以下幾種圖像格式擴展插件介面:TIFF, MNG, TGA, WBMPQt Mac Extras
OS X的系統API接入Qt Platform Headers
為各平台特有功能接入的平台信息封裝Qt Print Support
列印支持……Qt SVG
SVG文件處理Qt Windows Extras
Windows系統API接入Qt X11 Extras
X11框架API接入Qt Quick Compiler
可以將QML編譯以提高執行效率Qt Gamepad
遊戲手柄硬體支持……(這是要登錄主機平台么)Qt Serial Bus
工業化串列匯流排支持,包括I/O和協議處理Qt Wayland Compositor
Wayland的支持……Qt SCXML
基於SCXML文件生成的狀態機功能以下四個是Qt商業版獨佔的組件,最近的兩個版本中,以GPLv3的方式提供給開源版使用了Qt Charts圖表控制項。包括科學繪圖的2維,3維圖,包括word excel里幾乎一切圖表,同樣c++和qml通用Qt Data Visualization數據可視化組件。數據可視化的常見組件全部都有……Qt Quick 2D RendererQt Quicket的2D渲染引擎Qt Virtual Keyboard為Qt Quick提供的虛擬鍵盤寫小工具還是用腳本語言吧,,比較順手。。跨平台的話,其實c++跨平台的特性並不好。。
如果你的需求僅僅是寫一些能夠跨平台的GUI小工具,為什麼不考慮Python,而是選擇「困難模式」的C++呢?
推薦閱讀:
※初學QT怎麼學?
※如何用 C++ 在 GUI 中畫出各種平衡樹插入刪除的動態變化?
※Qt多線程編程中子線程如何調用主線程中的成員變數?
※用Qt5的Qpainter畫視頻解碼的圖像,發現CPU佔用極高(50%),有方法能夠降低cpu佔用嗎?