【軟件開發(fā)】編程語言C++(下篇)
Start:關(guān)注本公眾號后,可直接聯(lián)系后臺獲取排版美化的詳細文檔!
Hints:本篇文章所編纂的資料均來自網(wǎng)絡(luò),特此感謝參與奉獻的有關(guān)人員。
C++的語法組成:
-類 - 類可以定義為描述對象行為/狀態(tài)的模板/藍圖。
-對象 - 對象具有狀態(tài)和行為。例如:一只狗的狀態(tài) - 顏色、名稱、品種,行為 - 搖動、叫喚、吃。對象是類的實例。
-方法 - 從基本上說,一個方法表示一種行為。一個類可以包含多個方法。可以在方法中寫入邏輯、操作數(shù)據(jù)以及執(zhí)行所有的動作。
-即時變量 - 每個對象都有其獨特的即時變量。對象的狀態(tài)是由這些即時變量的值創(chuàng)建的。
C++的內(nèi)容組成:
1核心語言,提供了所有構(gòu)件塊,包括變量、數(shù)據(jù)類型和常量,等等。
2C++ 標準庫,提供了大量的函數(shù),用于操作文件、字符串等。
3標準模板庫(STL),提供了大量的方法,用于操作數(shù)據(jù)結(jié)構(gòu)等。
C++ 的標準庫
C++ 標準庫可以分為兩部分:
-標準函數(shù)庫: 這個庫是由通用的、獨立的、不屬于任何類的函數(shù)組成的。函數(shù)庫繼承自 C 語言。
-面向?qū)ο箢悗欤?/span> 這個庫是類及其相關(guān)函數(shù)的集合。
-標準函數(shù)庫
-輸入/輸出 I/O
-字符串和字符處理
-數(shù)學
-時間、日期和本地化
-動態(tài)分配
-其他
-寬字符函數(shù)
-面向?qū)ο箢悗?/span>
標準的 C++ 面向?qū)ο箢悗於x了大量支持一些常見操作的類,比如輸入/輸出 I/O、字符串處理、數(shù)值處理。面向?qū)ο箢悗彀韵聝?nèi)容:
-標準的 C++ I/O 類
-String 類
-數(shù)值類
-STL 容器類
-STL 算法
-STL 函數(shù)對象
-STL 迭代器
-STL 分配器
-本地化庫
-異常處理類
-雜項支持庫
C++ 的STL庫
C++ 標準模板庫的核心包括以下三個組件:
組件 | 描述 |
容器(Containers) | 容器是用來管理某一類對象的集合。C++ 提供了各種不同類型的容器,比如 deque、list、vector、map 等。 |
算法(Algorithms) | 算法作用于容器。它們提供了執(zhí)行各種操作的方式,包括對容器內(nèi)容執(zhí)行初始化、排序、搜索和轉(zhuǎn)換等操作。 |
迭代器(iterators) | 迭代器用于遍歷對象集合的元素。這些集合可能是容器,也可能是容器的子集。 |
C++的存儲類:
存儲類定義 C++ 程序中變量/函數(shù)的范圍(可見性)和生命周期。
auto 存儲類
auto 關(guān)鍵字用于兩種情況:聲明變量時根據(jù)初始化表達式自動推斷該變量的類型、聲明函數(shù)時函數(shù)返回值的占位符。在C++11中已刪除這一用法。
register 存儲類
register 存儲類用于定義存儲在寄存器中而不是 RAM 中的局部變量。
static 存儲類
static 存儲類指示編譯器在程序的生命周期內(nèi)保持局部變量的存在,而不需要在每次它進入和離開作用域時進行創(chuàng)建和銷毀。
extern 存儲類
extern 存儲類用于提供一個全局變量的引用,全局變量對所有的程序文件都是可見的。當您使用 'extern' 時,對于無法初始化的變量,會把變量名指向一個之前定義過的存儲位置。
mutable 存儲類
mutable 說明符僅適用于類的對象,mutable 成員可以通過 const 成員函數(shù)修改。
thread_local 存儲類
使用 thread_local 說明符聲明的變量僅可在它在其上創(chuàng)建的線程上訪問。變量在創(chuàng)建線程時創(chuàng)建,并在銷毀線程時銷毀。每個線程都有其自己的變量副本。
C++的輸入輸出
C++ 的 I/O 發(fā)生在流中,流是字節(jié)序列。如果字節(jié)流是從設(shè)備(如鍵盤、磁盤驅(qū)動器、網(wǎng)絡(luò)連接等)流向內(nèi)存,這叫做輸入操作。如果字節(jié)流是從內(nèi)存流向設(shè)備(如顯示屏、打印機、磁盤驅(qū)動器、網(wǎng)絡(luò)連接等),這叫做輸出操作。
/O 庫頭文件
下列的頭文件在 C++ 編程中很重要。
頭文件 | 函數(shù)和描述 |
<iostream> | 該文件定義了 cin、cout、cerr 和 clog 對象,分別對應于標準輸入流、標準輸出流、非緩沖標準錯誤流和緩沖標準錯誤流。 |
<iomanip> | 該文件通過所謂的參數(shù)化的流操縱器(比如 setw 和 setprecision),來聲明對執(zhí)行標準化 I/O 有用的服務。 |
<fstream> | 該文件為用戶控制的文件處理聲明服務。我們將在文件和流的相關(guān)章節(jié)討論它的細節(jié)。 |
標準輸入流(cin)
預定義的對象 cin 是 iostream 類的一個實例。cin 對象附屬到標準輸入設(shè)備,通常是鍵盤。cin 是與流提取運算符 >> 結(jié)合使用的
標準錯誤流(cerr)
預定義的對象 cerr 是 iostream 類的一個實例。cerr 對象附屬到標準錯誤設(shè)備,通常也是顯示屏,但是 cerr 對象是非緩沖的,且每個流插入到 cerr 都會立即輸出。
標準日志流(clog)
預定義的對象 clog 是 iostream 類的一個實例。clog 對象附屬到標準錯誤設(shè)備,通常也是顯示屏,但是 clog 對象是緩沖的。這意味著每個流插入到 clog 都會先存儲在緩沖區(qū),直到緩沖填滿或者緩沖區(qū)刷新時才會輸出。
C++ 文件和流
使用了 iostream 標準庫,它提供了 cin 和 cout 方法分別用于從標準輸入讀取流和向標準輸出寫入流。
數(shù)據(jù)類型 | 描述 |
ofstream | 該數(shù)據(jù)類型表示輸出文件流,用于創(chuàng)建文件并向文件寫入信息。 |
ifstream | 該數(shù)據(jù)類型表示輸入文件流,用于從文件讀取信息。 |
fstream | 該數(shù)據(jù)類型通常表示文件流,且同時具有 ofstream 和 ifstream 兩種功能,這意味著它可以創(chuàng)建文件,向文件寫入信息,從文件讀取信息。 |
在從文件讀取信息或者向文件寫入信息之前,必須先打開文件。ofstream 和 fstream 對象都可以用來打開文件進行寫操作,如果只需要打開文件進行讀操作,則使用 ifstream 對象。
下面是 open() 函數(shù)的標準語法,open() 函數(shù)是 fstream、ifstream 和 ofstream 對象的一個成員。
void open(const char *filename, ios::openmodemode);
模式標志 | 描述 |
ios::app | 追加模式。所有寫入都追加到文件末尾。 |
ios::ate | 文件打開后定位到文件末尾。 |
ios::in | 打開文件用于讀取。 |
ios::out | 打開文件用于寫入。 |
ios::trunc | 如果該文件已經(jīng)存在,其內(nèi)容將在打開文件之前被截斷,即把文件長度設(shè)為 0。 |
當 C++ 程序終止時,它會自動關(guān)閉刷新所有流,釋放所有分配的內(nèi)存,并關(guān)閉所有打開的文件。但程序員應該養(yǎng)成一個好習慣,在程序終止前關(guān)閉所有打開的文件。
下面是 close() 函數(shù)的標準語法,close() 函數(shù)是 fstream、ifstream 和 ofstream 對象的一個成員。
void close();
寫入文件
在 C++ 編程中,我們使用流插入運算符( << )向文件寫入信息,就像使用該運算符輸出信息到屏幕上一樣。唯一不同的是,在這里您使用的是 ofstream 或 fstream 對象,而不是 cout 對象。
讀取文件
在 C++ 編程中,我們使用流提取運算符( >> )從文件讀取信息,就像使用該運算符從鍵盤輸入信息一樣。唯一不同的是,在這里您使用的是 ifstream 或 fstream 對象,而不是 cin 對象。
文件位置指針
istream 和 ostream 都提供了用于重新定位文件位置指針的成員函數(shù)。這些成員函數(shù)包括關(guān)于 istream 的 seekg("seekget")和關(guān)于 ostream 的 seekp("seek put")。
seekg 和 seekp 的參數(shù)通常是一個長整型。第二個參數(shù)可以用于指定查找方向。查找方向可以是 ios::beg(默認的,從流的開頭開始定位),也可以是 ios::cur(從流的當前位置開始定位),也可以是 ios::end(從流的末尾開始定位)。
C++ 的異常處理
異常是程序在執(zhí)行期間產(chǎn)生的問題。C++ 異常是指在程序運行時發(fā)生的特殊情況,比如嘗試除以零的操作。

異常提供了一種轉(zhuǎn)移程序控制權(quán)的方式。C++ 異常處理涉及到三個關(guān)鍵字:try、catch、throw。
-throw: 當問題出現(xiàn)時,程序會拋出一個異常。這是通過使用 throw 關(guān)鍵字來完成的。
-catch: 在您想要處理問題的地方,通過異常處理程序捕獲異常。catch 關(guān)鍵字用于捕獲異常。
-try: try 塊中的代碼標識將被激活的特定異常。它后面通常跟著一個或多個 catch 塊。
異常 | 描述 |
std::exception | 該異常是所有標準 C++ 異常的父類。 |
std::bad_alloc | 該異常可以通過 new 拋出。 |
std::bad_cast | 該異??梢酝ㄟ^ dynamic_cast 拋出。 |
std::bad_exception | 這在處理 C++ 程序中無法預期的異常時非常有用。 |
std::bad_typeid | 該異常可以通過 typeid 拋出。 |
std::logic_error | 理論上可以通過讀取代碼來檢測到的異常。 |
std::domain_error | 當使用了一個無效的數(shù)學域時,會拋出該異常。 |
std::invalid_argument | 當使用了無效的參數(shù)時,會拋出該異常。 |
std::length_error | 當創(chuàng)建了太長的 std::string 時,會拋出該異常。 |
std::out_of_range | 該異常可以通過方法拋出,例如 std::vector 和 std::bitset<>::operator[]()。 |
std::runtime_error | 理論上不可以通過讀取代碼來檢測到的異常。 |
std::overflow_error | 當發(fā)生數(shù)學上溢時,會拋出該異常。 |
std::range_error | 當嘗試存儲超出范圍的值時,會拋出該異常。 |
std::underflow_error | 當發(fā)生數(shù)學下溢時,會拋出該異常。 |
C++ 的動態(tài)內(nèi)存
C++ 程序中的內(nèi)存分為兩個部分:
-棧:在函數(shù)內(nèi)部聲明的所有變量都將占用棧內(nèi)存。
-堆:這是程序中未使用的內(nèi)存,在程序運行時可用于動態(tài)分配內(nèi)存。
在 C++ 中,您可以使用特殊的運算符為給定類型的變量在運行時分配堆內(nèi)的內(nèi)存,這會返回所分配的空間地址。這種運算符即 new 運算符。如果您不再需要動態(tài)分配的內(nèi)存空間,可以使用 delete 運算符,刪除之前由 new 運算符分配的內(nèi)存。
malloc() 函數(shù)在 C 語言中就出現(xiàn)了,在 C++ 中仍然存在,但建議盡量不要使用 malloc() 函數(shù)。new 與 malloc() 函數(shù)相比,其主要的優(yōu)點是,new 不只是分配了內(nèi)存,它還創(chuàng)建了對象。
C++ 的信號處理
信號是由操作系統(tǒng)傳給進程的中斷,會提早終止一個程序。
信號 | 描述 |
SIGABRT | 程序的異常終止,如調(diào)用 abort。 |
SIGFPE | 錯誤的算術(shù)運算,比如除以零或?qū)е乱绯龅牟僮鳌?/span> |
SIGILL | 檢測非法指令。 |
SIGINT | 程序終止(interrupt)信號。 |
SIGSEGV | 非法訪問內(nèi)存。 |
SIGTERM | 發(fā)送到程序的終止請求。 |
C++ 的多線程
多線程是多任務處理的一種特殊形式,多任務處理允許讓電腦同時運行兩個或兩個以上的程序。一般情況下,兩種類型的多任務處理:基于進程和基于線程。
基于進程的多任務處理是程序的并發(fā)執(zhí)行。
基于線程的多任務處理是同一程序的片段的并發(fā)執(zhí)行。
多線程程序包含可以同時運行的兩個或多個部分。這樣的程序中的每個部分稱為一個線程,每個線程定義了一個單獨的執(zhí)行路徑。
創(chuàng)建線程
下面的程序,我們可以用它來創(chuàng)建一個POSIX 線程:
#include <pthread.h>
pthread_create (thread, attr, start_routine,arg)
在這里,pthread_create 創(chuàng)建一個新的線程,并讓它可執(zhí)行。下面是關(guān)于參數(shù)的說明:
參數(shù) | 描述 |
thread | 指向線程標識符指針。 |
attr | 一個不透明的屬性對象,可以被用來設(shè)置線程屬性。您可以指定線程屬性對象,也可以使用默認值 NULL。 |
start_routine | 線程運行函數(shù)起始地址,一旦線程被創(chuàng)建就會執(zhí)行。 |
arg | 運行函數(shù)的參數(shù)。它必須通過把引用作為指針強制轉(zhuǎn)換為 void 類型進行傳遞。如果沒有傳遞參數(shù),則使用 NULL。 |
創(chuàng)建線程成功時,函數(shù)返回 0,若返回值不為 0 則說明創(chuàng)建線程失敗。
終止線程
使用下面的程序,我們可以用它來終止一個POSIX 線程:
#include <pthread.h>
pthread_exit (status)
在這里,pthread_exit 用于顯式地退出一個線程。通常情況下,pthread_exit() 函數(shù)是在線程完成工作后無需繼續(xù)存在時被調(diào)用。
如果 main() 是在它所創(chuàng)建的線程之前結(jié)束,并通過 pthread_exit() 退出,那么其他線程將繼續(xù)執(zhí)行。否則,它們將在 main() 結(jié)束時自動被終止。
C++ 的Web編程
公共網(wǎng)關(guān)接口(CGI),是使得應用程序(稱為 CGI 程序或 CGI 腳本)能夠與 Web 服務器以及客戶端進行交互的標準協(xié)議。
CGI 的架構(gòu):

Web 服務器配置
在您進行 CGI 編程之前,請確保您的 Web 服務器支持 CGI,并已配置成可以處理 CGI 程序。所有由 HTTP服務器執(zhí)行的 CGI 程序,都必須在預配置的目錄中。該目錄稱為 CGI 目錄,按照慣例命名為 /var/www/cgi-bin。雖然 CGI 文件是 C++ 可執(zhí)行文件,但是按照慣例它的擴展名是 .cgi。
HTTP 頭信息
行 Content-type:text/html\r\n\r\n 是 HTTP 頭信息的組成部分,它被發(fā)送到瀏覽器,以便更好地理解頁面內(nèi)容。HTTP 頭信息的形式如下:
HTTP 字段名稱: 字段內(nèi)容
例如
Content-type: text/html\r\n\r\n
還有一些其他的重要的 HTTP 頭信息,這些在您的 CGI 編程中都會經(jīng)常被用到。
頭信息 | 描述 |
Content-type: | MIME 字符串,定義返回的文件格式。例如 Content-type:text/html。 |
Expires: Date | 信息變成無效的日期。瀏覽器使用它來判斷一個頁面何時需要刷新。一個有效的日期字符串的格式應為 01 Jan 1998 12:00:00 GMT。 |
Location: URL | 這個 URL 是指應該返回的 URL,而不是請求的 URL。你可以使用它來重定向一個請求到任意的文件。 |
Last-modified: Date | 資源的最后修改日期。 |
Content-length: N | 要返回的數(shù)據(jù)的長度,以字節(jié)為單位。瀏覽器使用這個值來表示一個文件的預計下載時間。 |
Set-Cookie: String | 通過 string 設(shè)置 cookie。 |
CGI 環(huán)境變量
所有的 CGI 程序都可以訪問下列的環(huán)境變量。這些變量在編寫 CGI 程序時扮演了非常重要的角色。
變量名 | 描述 |
CONTENT_TYPE | 內(nèi)容的數(shù)據(jù)類型。當客戶端向服務器發(fā)送附加內(nèi)容時使用。例如,文件上傳等功能。 |
CONTENT_LENGTH | 查詢的信息長度。只對 POST 請求可用。 |
HTTP_COOKIE | 以鍵 & 值對的形式返回設(shè)置的 cookies。 |
HTTP_USER_AGENT | 用戶代理請求標頭字段,遞交用戶發(fā)起請求的有關(guān)信息,包含了瀏覽器的名稱、版本和其他平臺性的附加信息。 |
PATH_INFO | CGI 腳本的路徑。 |
QUERY_STRING | 通過 GET 方法發(fā)送請求時的 URL 編碼信息,包含 URL 中問號后面的參數(shù)。 |
REMOTE_ADDR | 發(fā)出請求的遠程主機的 IP 地址。這在日志記錄和認證時是非常有用的。 |
REMOTE_HOST | 發(fā)出請求的主機的完全限定名稱。如果此信息不可用,則可以用 REMOTE_ADDR 來獲取 IP 地址。 |
REQUEST_METHOD | 用于發(fā)出請求的方法。最常見的方法是 GET 和 POST。 |
SCRIPT_FILENAME | CGI 腳本的完整路徑。 |
SCRIPT_NAME | CGI 腳本的名稱。 |
SERVER_NAME | 服務器的主機名或 IP 地址。 |
SERVER_SOFTWARE | 服務器上運行的軟件的名稱和版本。 |
在 CGI 中使用 Cookies
HTTP 協(xié)議是一種無狀態(tài)的協(xié)議。但對于一個商業(yè)網(wǎng)站,它需要在不同頁面間保持會話信息。例如,一個用戶在完成多個頁面的步驟之后結(jié)束注冊。但是,如何在所有網(wǎng)頁中保持用戶的會話信息。
在許多情況下,使用 cookies 是記憶和跟蹤有關(guān)用戶喜好、購買、傭金以及其他為追求更好的游客體驗或網(wǎng)站統(tǒng)計所需信息的最有效的方法。
它是如何工作的
服務器以 cookie 的形式向訪客的瀏覽器發(fā)送一些數(shù)據(jù)。如果瀏覽器接受了 cookie,則 cookie 會以純文本記錄的形式存儲在訪客的硬盤上?,F(xiàn)在,當訪客訪問網(wǎng)站上的另一個頁面時,會檢索 cookie。一旦找到 cookie,服務器就知道存儲了什么。
cookie 是一種純文本的數(shù)據(jù)記錄,帶有 5 個可變長度的字段:
Expires : cookie 的過期日期。如果此字段留空,cookie 會在訪客退出瀏覽器時過期。
Domain : 網(wǎng)站的域名。
Path : 設(shè)置 cookie 的目錄或網(wǎng)頁的路徑。如果您想從任意的目錄或網(wǎng)頁檢索 cookie,此字段可以留空。
Secure : 如果此字段包含單詞 "secure",那么 cookie 只能通過安全服務器進行檢索。如果此字段留空,則不存在該限制。
Name=Value : cookie 以鍵值對的形式被設(shè)置和獲取。
設(shè)置 Cookies
向瀏覽器發(fā)送 cookies 是非常簡單的。這些 cookies 會在 Content-type 字段之前,與 HTTP 頭一起被發(fā)送。假設(shè)您想設(shè)置 UserID 和 Password 為 cookies
C++的編譯規(guī)則:
-結(jié)束符
在 C++ 中,分號是語句結(jié)束符。也就是說,每個語句必須以分號結(jié)束。它表明一個邏輯實體的結(jié)束。
-空白符
在 C++ 中,空格用于描述空白符、制表符、換行符和注釋。空格分隔語句的各個部分,讓編譯器能識別語句中的某個元素(比如 int)在哪里結(jié)束,下一個元素在哪里開始。
-變量類型
變量的類型大小會根據(jù)編譯器和所使用的電腦而有所不同。
-變量定義
變量其實只不過是程序可操作的存儲區(qū)的名稱。C++ 中每個變量都有指定的類型,類型決定了變量存儲的大小和布局,該范圍內(nèi)的值都可以存儲在內(nèi)存中,運算符可應用于變量上。
-變量聲明
變量聲明向編譯器保證變量以給定的類型和名稱存在,這樣編譯器在不需要知道變量完整細節(jié)的情況下也能繼續(xù)進一步的編譯。變量聲明只在編譯時有它的意義,在程序連接時編譯器需要實際的變量聲明。當您使用多個文件且只在其中一個文件中定義變量時(定義變量的文件在程序連接時是可用的),變量聲明就顯得非常有用。您可以使用 extern 關(guān)鍵字在任何地方聲明一個變量。
-左值與右值
C++ 中有兩種類型的表達式:
-左值(lvalue):指向內(nèi)存位置的表達式被稱為左值(lvalue)表達式。左值可以出現(xiàn)在賦值號的左邊或右邊。
-右值(rvalue):術(shù)語右值(rvalue)指的是存儲在內(nèi)存中某些地址的數(shù)值。右值是不能對其進行賦值的表達式,也就是說,右值可以出現(xiàn)在賦值號的右邊,但不能出現(xiàn)在賦值號的左邊。
變量是左值,因此可以出現(xiàn)在賦值號的左邊。數(shù)值型的字面值是右值,因此不能被賦值,不能出現(xiàn)在賦值號的左邊。
-變量作用域
在函數(shù)或一個代碼塊內(nèi)部聲明的變量,稱為局部變量。
在函數(shù)參數(shù)的定義中聲明的變量,稱為形式參數(shù)。
在所有函數(shù)外部聲明的變量,稱為全局變量。
-變量初始化
當局部變量被定義時,系統(tǒng)不會對其初始化,您必須自行對其初始化。定義全局變量時,系統(tǒng)會自動初始化為默認值
-運算符
運算符是一種告訴編譯器執(zhí)行特定的數(shù)學或邏輯操作的符號。
-在 C++ 中,您可以使用特殊的運算符為給定類型的變量在運行時分配堆內(nèi)的內(nèi)存,這會返回所分配的空間地址。這種運算符即 new 運算符。如果您不再需要動態(tài)分配的內(nèi)存空間,可以使用 delete 運算符,刪除之前由 new 運算符分配的內(nèi)存。
-命名空間,可作為附加信息來區(qū)分不同庫中相同名稱的函數(shù)、類、變量等。使用了命名空間即定義了上下文。本質(zhì)上,命名空間就是定義了一個范圍。
C++的相關(guān)術(shù)語:
-gcc & g++
Linux上的gcc是Gnu的C語言編譯器,至于C++編譯器,它的名字叫做g++。
-ram
隨機存取存儲器RAM也叫主存,是與CPU直接交換數(shù)據(jù)的內(nèi)部存儲器。
-cgi
公共網(wǎng)關(guān)接口(CGI),是一套標準,定義了信息是如何在 Web 服務器和客戶端腳本之間進行交換的。
參考資料:
C++ 教程 | 菜鳥教程 (runoob.com)
https://www.runoob.com/cplusplus/cpp-tutorial.html
公眾號二維碼
End:如果有興趣了解量化交易、數(shù)據(jù)分析和互聯(lián)網(wǎng)+的實用技術(shù),歡迎關(guān)注本公眾號
