重新系統(tǒng)學(xué)習(xí)下C++;但是還是少了好多知識點;socket淳梦;unix;stl昔字;boost等谭跨;
C++ 教程 | 菜鳥教程
http://www.runoob.com/cplusplus/cpp-tutorial.html
$ g++ -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin16.1.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$ g++ hello.cpp
$ ./a.out
Hello World
您也可以使用 makefile 來編譯 C/C++ 程序。
從Microsoft Visual C++ 2010版開始李滴,該編譯器默認(rèn)不再自動替換三字符組。如果需要使用三字符組替換(如為了兼容古老的軟件代碼)蛮瞄,需要設(shè)置編譯器命令行選項/Zc:trigraphs
g++仍默認(rèn)支持三字符組所坯,但會給出編譯警告。
typedef int feet;
define POP_EXTERN_C_BEGIN extern "C" {
define POP_EXTERN_C_END }
在程序中挂捅,局部變量和全局變量的名稱可以相同芹助,但是在函數(shù)內(nèi),局部變量的值會覆蓋全局變量的值。
當(dāng)局部變量被定義時状土,系統(tǒng)不會對其初始化无蜂,您必須自行對其初始化。定義全局變量時蒙谓,系統(tǒng)會自動初始化為下列值:
整數(shù)常量也可以帶一個后綴斥季,后綴是 U 和 L 的組合,U 表示無符號整數(shù)(unsigned)累驮,L 表示長整數(shù)(long)酣倾。后綴可以是大寫,也可以是小寫谤专,U 和 L 的順序任意躁锡。
我們不應(yīng)把 true 的值看成 1,把 false 的值看成 0置侍。
字符常量是括在單引號中映之。如果常量以 L(僅當(dāng)大寫時)開頭,則表示它是一個寬字符常量(例如 L'x')蜡坊,此時它必須存儲在 wchar_t 類型的變量中杠输。否則,它就是一個窄字符常量(例如 'x')算色,此時它可以存儲在 char 類型的簡單變量中抬伺。
字符串字面值或常量是括在雙引號 "" 中的。
在 C++ 中灾梦,有兩種簡單的定義常量的方式:
使用 #define 預(yù)處理器峡钓。
使用 const 關(guān)鍵字。
請注意若河,把常量定義為大寫字母形式能岩,是一個很好的編程實踐。
修飾符 signed萧福、unsigned拉鹃、long 和 short 可應(yīng)用于整型,signed 和 unsigned 可應(yīng)用于字符型鲫忍,long 可應(yīng)用于雙精度型膏燕。
修飾符 signed 和 unsigned 也可以作為 long 或 short 修飾符的前綴。例如:unsigned long int悟民。
const const 類型的對象在程序執(zhí)行期間不能被修改改變坝辫。
volatile 修飾符 volatile 告訴編譯器,變量的值可能以程序未明確指定的方式被改變射亏。
restrict 由 restrict 修飾的指針是唯一一種訪問它所指向的對象的方式近忙。只有 C99 增加了新的類型限定符 restrict竭业。
C++ 程序中可用的存儲類:
auto
register
static
extern
mutable
thread_local (C++11)
從 C++ 11 開始,auto 關(guān)鍵字不再是 C++ 存儲類說明符及舍,且 register 關(guān)鍵字被棄用未辆。
使用 static 修飾局部變量可以在函數(shù)調(diào)用之間保持局部變量的值。
當(dāng) static 修飾全局變量時锯玛,會使變量的作用域限制在聲明它的文件內(nèi)咐柜。
在 C++ 中,當(dāng) static 用在類數(shù)據(jù)成員上時更振,會導(dǎo)致僅有一個該成員的副本被類的所有對象共享炕桨。
extern 存儲類用于提供一個全局變量的引用,全局變量對所有的程序文件都是可見的肯腕。當(dāng)您使用 'extern' 時献宫,對于無法初始化的變量,會把變量名指向一個之前定義過的存儲位置实撒。
當(dāng)您有多個文件且定義了一個可以在其他文件中使用的全局變量或函數(shù)時姊途,可以在其他文件中使用 extern 來得到已定義的變量或函數(shù)的引用≈可以這么理解捷兰,extern 是用來在另一個文件中聲明一個全局變量或函數(shù)。
extern 修飾符通常用于當(dāng)有兩個或多個文件共享相同的全局變量或函數(shù)的時候负敏,如下所示:
$ g++ main.cpp support.cpp -o write
這會產(chǎn)生 write 可執(zhí)行程序
mutable 說明符僅適用于類的對象贡茅,它允許對象的成員替代常量。也就是說其做,mutable 成員可以通過 const 成員函數(shù)修改顶考。
使用 thread_local 說明符聲明的變量僅可在它在其上創(chuàng)建的線程上訪問。 變量在創(chuàng)建線程時創(chuàng)建妖泄,并在銷毀線程時銷毀驹沿。 每個線程都有其自己的變量副本。
thread_local 說明符可以與 static 或 extern 合并蹈胡。
可以將 thread_local 僅應(yīng)用于數(shù)據(jù)聲明和定義渊季,thread_local 不能用于函數(shù)聲明或定義。
thread_local int x; // 命名空間下的全局變量
class X
{
static thread_local std::string s; // 類的static成員變量
};
static thread_local std::string X::s; // X::s 是需要定義的
void foo()
{
thread_local std::vector<int> v; // 本地變量
}
" ~ "二進(jìn)制補(bǔ)碼運(yùn)算符是一元運(yùn)算符罚渐,具有"翻轉(zhuǎn)"位效果却汉,即0變成1,1變成0荷并。
" << " 二進(jìn)制左移運(yùn)算符病涨。 60 右移兩位,相當(dāng)于乘以4璧坟;60 << 2 將得到 240既穆,即為 1111 0000;
" >> " 二進(jìn)制右移運(yùn)算符雀鹃。 60 >> 2 將得到 15幻工,即為 0000 1111;
雜項運(yùn)算符
sizeof 運(yùn)算符返回變量的大小黎茎。
逗號運(yùn)算符會順序執(zhí)行一系列運(yùn)算囊颅。整個逗號表達(dá)式的值是以逗號分隔的列表中的最后一個表達(dá)式的值。
C++ 中的運(yùn)算符優(yōu)先級
C++ 標(biāo)準(zhǔn)庫提供了大量的程序可以調(diào)用的內(nèi)置函數(shù)傅瞻。例如踢代,函數(shù) strcat() 用來連接兩個字符串,函數(shù) memcpy() 用來復(fù)制內(nèi)存到另一個位置嗅骄。
數(shù)名和參數(shù)列表一起構(gòu)成了函數(shù)簽名胳挎。
如果函數(shù)要使用參數(shù),則必須聲明接受參數(shù)值的變量溺森。這些變量稱為函數(shù)的形式參數(shù)慕爬。
當(dāng)調(diào)用函數(shù)時,有兩種向函數(shù)傳遞參數(shù)的方式:
傳值調(diào)用 該方法把參數(shù)的實際值復(fù)制給函數(shù)的形式參數(shù)屏积。在這種情況下医窿,修改函數(shù)內(nèi)的形式參數(shù)對實際參數(shù)沒有影響。
指針調(diào)用 該方法把參數(shù)的地址復(fù)制給形式參數(shù)炊林。在函數(shù)內(nèi)姥卢,該地址用于訪問調(diào)用中要用到的實際參數(shù)。這意味著渣聚,修改形式參數(shù)會影響實際參數(shù)独榴。
引用調(diào)用 該方法把參數(shù)的引用復(fù)制給形式參數(shù)。在函數(shù)內(nèi)饵逐,該引用用于訪問調(diào)用中要用到的實際參數(shù)括眠。這意味著,修改形式參數(shù)會影響實際參數(shù)倍权。
都是復(fù)制一份掷豺;
參數(shù)的默認(rèn)值
當(dāng)您定義一個函數(shù),您可以為參數(shù)列表中后邊的每一個參數(shù)指定默認(rèn)值薄声。當(dāng)調(diào)用函數(shù)時当船,如果實際參數(shù)的值留空,則使用這個默認(rèn)值默辨。
Lambda 函數(shù)與表達(dá)式
C++11 提供了對匿名函數(shù)的支持,稱為 Lambda 函數(shù)(也叫 Lambda 表達(dá)式)德频。
Lambda 表達(dá)式把函數(shù)看作對象。Lambda 表達(dá)式可以像對象一樣使用缩幸,比如可以將它們賦給變量和作為參數(shù)傳遞壹置,還可以像函數(shù)一樣對其求值竞思。
Lambda 表達(dá)式本質(zhì)上與函數(shù)聲明非常類似。Lambda 表達(dá)式具體形式如下:
[](int x, int y) -> int { int z = x + y; return z + x; }
如果 lambda 函數(shù)沒有傳回值(例如 void)钞护,其回返類型可被完全忽略盖喷。
在Lambda表達(dá)式內(nèi)可以訪問當(dāng)前作用域的變量,這是Lambda表達(dá)式的閉包(Closure)行為难咕。 與JavaScript閉包不同课梳,C++變量傳遞有傳值和傳引用的區(qū)別∮嗟瑁可以通過前面的[]來指定:
[] // 沒有定義任何變量暮刃。使用未定義變量會引發(fā)錯誤。
[x, &y] // x以傳值方式傳入(默認(rèn))爆土,y以引用方式傳入椭懊。
[&] // 任何被使用到的外部變量都隱式地以引用方式加以引用。
[=] // 任何被使用到的外部變量都隱式地以傳值方式加以引用雾消。
[&, x] // x顯式地以傳值方式加以引用灾搏。其余變量以引用方式加以引用。
[=, &z] // z顯式地以引用方式加以引用立润。其余變量以傳值方式加以引用狂窑。
對于[=]或[&]的形式,lambda 表達(dá)式可以直接使用 this 指針桑腮。但是泉哈,對于[]的形式,如果要使用 this 指針破讨,必須顯式傳入:
為了利用這些函數(shù)丛晦,您需要引用數(shù)學(xué)頭文件 <cmath>。
C++ 隨機(jī)數(shù)
關(guān)于隨機(jī)數(shù)生成器提陶,有兩個相關(guān)的函數(shù)烫沙。一個是 rand(),該函數(shù)只返回一個偽隨機(jī)數(shù)隙笆。生成隨機(jī)數(shù)之前必須先調(diào)用 srand() 函數(shù)锌蓄。
下面是一個關(guān)于生成隨機(jī)數(shù)的簡單實例。實例中使用了 time() 函數(shù)來獲取系統(tǒng)時間的秒數(shù)撑柔,通過調(diào)用 rand() 函數(shù)來生成隨機(jī)數(shù):
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main ()
{
int i,j;
// 設(shè)置種子
srand( (unsigned)time( NULL ) );
/* 生成 10 個隨機(jī)數(shù) */
for( i = 0; i < 10; i++ )
{
// 生成實際的隨機(jī)數(shù)
j= rand();
cout <<"隨機(jī)數(shù): " << j << endl;
}
return 0;
}
C++ 支持?jǐn)?shù)組數(shù)據(jù)結(jié)構(gòu)瘸爽,它可以存儲一個固定大小的相同類型元素的順序集合。
所有的數(shù)組都是由連續(xù)的內(nèi)存位置組成铅忿。最低的地址對應(yīng)第一個元素剪决,最高的地址對應(yīng)最后一個元素。
初始化數(shù)組
double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
所有的數(shù)組都是以 0 作為它們第一個元素的索引,也被稱為基索引柑潦,數(shù)組的最后一個索引是數(shù)組的總大小減去 1享言。
setw() 函數(shù)來格式化輸出。
多維數(shù)組 C++ 支持多維數(shù)組渗鬼。多維數(shù)組最簡單的形式是二維數(shù)組担锤。
指向數(shù)組的指針 您可以通過指定不帶索引的數(shù)組名稱來生成一個指向數(shù)組中第一個元素的指針。
傳遞數(shù)組給函數(shù) 您可以通過指定不帶索引的數(shù)組名稱來給函數(shù)傳遞一個指向數(shù)組的指針乍钻。
從函數(shù)返回數(shù)組 C++ 允許從函數(shù)返回數(shù)組。
C++ 指向數(shù)組的指針
數(shù)組名是一個指向數(shù)組中第一個元素的常量指針.
C++ 提供了以下兩種類型的字符串表示形式:
C 風(fēng)格字符串
C++ 引入的 string 類類型
字符串實際上是使用 null 字符 '\0' 終止的一維字符數(shù)組铭腕。
C++ 中有大量的函數(shù)用來操作以 null 結(jié)尾的字符串:supports a wide range of functions that manipulate null-terminated strings:
include <cstring>
include <string>
想要成為一名優(yōu)秀的 C++ 程序員银择,學(xué)習(xí)指針是很有必要的。
int ip; / 一個整型的指針 */
星號是用來指定一個變量是指針累舷。
所有指針的值的實際數(shù)據(jù)類型浩考,不管是整型、浮點型被盈、字符型析孽,還是其他的數(shù)據(jù)類型,都是一樣的只怎,都是一個代表內(nèi)存地址的長的十六進(jìn)制數(shù)袜瞬。不同數(shù)據(jù)類型的指針之間唯一的不同是,指針?biāo)赶虻淖兞炕虺A康臄?shù)據(jù)類型不同身堡。
使用指針時會頻繁進(jìn)行以下幾個操作:定義一個指針變量邓尤、把變量地址賦值給指針、訪問指針變量中可用地址的值贴谎。這些是通過使用一元運(yùn)算符 * 來返回位于操作數(shù)所指定地址的變量的值汞扎。
C++ Null 指針 C++ 支持空指針。NULL 指針是一個定義在標(biāo)準(zhǔn)庫中的值為零的常量擅这。
C++ 指針的算術(shù)運(yùn)算 可以對指針進(jìn)行四種算術(shù)運(yùn)算:++澈魄、--、+仲翎、-
C++ 指針 vs 數(shù)組 指針和數(shù)組之間有著密切的關(guān)系痹扇。
C++ 指針數(shù)組 可以定義用來存儲指針的數(shù)組。
C++ 指向指針的指針 C++ 允許指向指針的指針谭确。
C++ 傳遞指針給函數(shù) 通過引用或地址傳遞參數(shù)帘营,使傳遞的參數(shù)在調(diào)用函數(shù)中被改變。
C++ 從函數(shù)返回指針 C++ 允許函數(shù)返回指針到局部變量逐哈、靜態(tài)變量和動態(tài)內(nèi)存分配芬迄。
在變量聲明的時候,如果沒有確切的地址可以賦值昂秃,為指針變量賦一個 NULL 值是一個良好的編程習(xí)慣禀梳。賦為 NULL 值的指針被稱為空指針杜窄。
NULL 指針是一個定義在標(biāo)準(zhǔn)庫中的值為零的常量。
假設(shè) ptr 是一個指向地址 1000 的整型指針算途,是一個 32 位的整數(shù)塞耕,ptr++,運(yùn)算之后,ptr 將指向位置 1004嘴瓤,因為 ptr 每增加一次扫外,它都將指向下一個整數(shù)位置,即當(dāng)前位置往后移 4 個字節(jié)廓脆。
如果 ptr 指向一個地址為 1000 的字符筛谚,上面的運(yùn)算(ptr++)會導(dǎo)致指針指向位置 1001,因為下一個字符位置是在 1001停忿。
我們喜歡在程序中使用指針代替數(shù)組驾讲,因為變量指針可以遞增,而數(shù)組不能遞增席赂,因為數(shù)組是一個常量指針吮铭。
while ( ptr <= &var[MAX - 1] )
只要變量指針?biāo)赶虻牡刂沸∮诨虻扔跀?shù)組的最后一個元素的地址 &var[MAX - 1],則把變量指針進(jìn)行遞增:
把指針運(yùn)算符 * 應(yīng)用到 var 上是完全可以的颅停,但修改 var 的值是非法的谓晌。這是因為 var 是一個指向數(shù)組開頭的常量,不能作為左值便监。
我們想要讓數(shù)組存儲指向 int 或 char 或其他數(shù)據(jù)類型的指針扎谎。下面是一個指向整數(shù)的指針數(shù)組的聲明:int *ptr[MAX];
在這里,把 ptr 聲明為一個數(shù)組烧董,由 MAX 個整數(shù)指針組成毁靶。
C++ 指向指針的指針(多級間接尋址)
通常,一個指針包含一個變量的地址逊移。當(dāng)我們定義一個指向指針的指針時预吆,第一個指針包含了第二個指針的地址,第二個指針指向包含實際值的位置胳泉。
一個指向指針的指針變量必須如下聲明拐叉,即在變量名前放置兩個星號。例如扇商,下面聲明了一個指向 int 類型指針的指針:
int **var;
C++ 允許您傳遞指針給函數(shù)凤瘦,只需要簡單地聲明函數(shù)參數(shù)為指針類型即可。
C++ 引用
引用變量是一個別名案铺,也就是說蔬芥,它是某個已存在變量的另一個名字。一旦把引用初始化為某個變量,就可以使用該引用名稱或變量名稱來指向變量
C++ 引用 vs 指針
引用很容易與指針混淆笔诵,它們之間有三個主要的不同:
不存在空引用返吻。引用必須連接到一塊合法的內(nèi)存。
一旦引用被初始化為一個對象乎婿,就不能被指向到另一個對象测僵。指針可以在任何時候指向到另一個對象。
引用必須在創(chuàng)建時被初始化谢翎。指針可以在任何時間被初始化捍靠。
int i = 17;
int& r = i;
在這些聲明中,& 讀作引用森逮。讀作 "r 是一個初始化為 i 的整型引用"剂公。
引用通常用于函數(shù)參數(shù)列表和函數(shù)返回值
把引用作為參數(shù) C++ 支持把引用作為參數(shù)傳給函數(shù),這比傳一般的參數(shù)更安全吊宋。
把引用作為返回值 可以從 C++ 函數(shù)中返回引用,就像返回其他數(shù)據(jù)類型一樣颜武。
通過使用引用來替代指針璃搜,會使 C++ 程序更容易閱讀和維護(hù)。C++ 函數(shù)可以返回一個引用鳞上,方式與返回一個指針類似这吻。
當(dāng)函數(shù)返回一個引用時,則返回一個指向返回值的隱式指針篙议。這樣唾糯,函數(shù)就可以放在賦值語句的左邊。
為了使用日期和時間相關(guān)的函數(shù)和結(jié)構(gòu)鬼贱,需要在 C++ 程序中引用 <ctime> 頭文件移怯。
有四個與時間相關(guān)的類型:clock_t、time_t这难、size_t 和 tm舟误。類型 clock_t、size_t 和 time_t 能夠把系統(tǒng)時間和日期表示為某種整數(shù)姻乓。
C++ 的 I/O 發(fā)生在流中嵌溢,流是字節(jié)序列。如果字節(jié)流是從設(shè)備(如鍵盤蹋岩、磁盤驅(qū)動器赖草、網(wǎng)絡(luò)連接等)流向內(nèi)存,這叫做輸入操作剪个。如果字節(jié)流是從內(nèi)存流向設(shè)備(如顯示屏秧骑、打印機(jī)、磁盤驅(qū)動器、網(wǎng)絡(luò)連接等)腿堤,這叫做輸出操作阀坏。
<iostream> 該文件定義了 cin、cout笆檀、cerr 和 clog 對象忌堂,分別對應(yīng)于標(biāo)準(zhǔn)輸入流、標(biāo)準(zhǔn)輸出流酗洒、非緩沖標(biāo)準(zhǔn)錯誤流和緩沖標(biāo)準(zhǔn)錯誤流士修。
<iomanip> 該文件通過所謂的參數(shù)化的流操縱器(比如 setw 和 setprecision),來聲明對執(zhí)行標(biāo)準(zhǔn)化 I/O 有用的服務(wù)樱衷。
<fstream> 該文件為用戶控制的文件處理聲明服務(wù)棋嘲。我們將在文件和流的相關(guān)章節(jié)討論它的細(xì)節(jié)。
C/C++ 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量矩桂,但是結(jié)構(gòu)是 C++ 中另一種用戶自定義的可用的數(shù)據(jù)類型沸移,它允許您存儲不同類型的數(shù)據(jù)項。
下面是聲明 Book 結(jié)構(gòu)的方式:
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
}book;
結(jié)構(gòu)作為函數(shù)參數(shù)
指向結(jié)構(gòu)的指針
為了使用指向該結(jié)構(gòu)的指針訪問結(jié)構(gòu)的成員侄榴,您必須使用 -> 運(yùn)算符雹锣,如下所示:
可以為創(chuàng)建的類型取一個"別名"
typedef struct
{
char title[50];
char author[50];
char subject[100];
int book_id;
}Books;
C++ 類 & 對象
類定義是以關(guān)鍵字 class 開頭,后跟類的名稱癞蚕。類的主體是包含在一對花括號中蕊爵。類定義后必須跟著一個分號或一個聲明列表。
class Box
{
public:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};
私有的成員和受保護(hù)的成員不能使用直接成員訪問運(yùn)算符 (.) 來直接訪問桦山。我們將在后續(xù)的教程中學(xué)習(xí)如何訪問私有成員和受保護(hù)的成員攒射。
您也可以在類的外部使用范圍解析運(yùn)算符 :: 定義該函數(shù)
double Box::getVolume(void)
{
return length * breadth * height;
}
類成員的訪問限制是通過在類主體內(nèi)部對各個區(qū)域標(biāo)記 public、private恒水、protected 來指定的会放。關(guān)鍵字 public、private钉凌、protected 稱為訪問說明符鸦概。
私有成員變量或函數(shù)在類的外部是不可訪問的,甚至是不可查看的甩骏。只有類和友元函數(shù)可以訪問私有成員窗市。
默認(rèn)情況下,類的所有成員都是私有的饮笛。
實際操作中咨察,我們一般會在私有區(qū)域定義數(shù)據(jù),在公有區(qū)域定義相關(guān)的函數(shù)福青,以便在類的外部也可以調(diào)用這些函數(shù)
保護(hù)(protected)成員
保護(hù)成員變量或函數(shù)與私有成員十分相似摄狱,但有一點不同脓诡,保護(hù)成員在派生類(即子類)中是可訪問的。
構(gòu)造函數(shù)的名稱與類的名稱是完全相同的媒役,并且不會返回任何類型祝谚,也不會返回 void。構(gòu)造函數(shù)可用于為某些成員變量設(shè)置初始值酣衷。
使用初始化列表來初始化字段
使用初始化列表來初始化字段:
Line::Line( double len): length(len)
{
cout << "Object is being created, length = " << len << endl;
}
類的析構(gòu)函數(shù)是類的一種特殊的成員函數(shù)交惯,它會在每次刪除所創(chuàng)建的對象時執(zhí)行。
析構(gòu)函數(shù)的名稱與類的名稱是完全相同的穿仪,只是在前面加了個波浪號(~)作為前綴席爽,它不會返回任何值,也不能帶有任何參數(shù)啊片。析構(gòu)函數(shù)有助于在跳出程序(比如關(guān)閉文件只锻、釋放內(nèi)存等)前釋放資源。
拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù)紫谷,它在創(chuàng)建對象時齐饮,是使用同一類中之前創(chuàng)建的對象來初始化新創(chuàng)建的對象◇宰颍拷貝構(gòu)造函數(shù)通常用于:
通過使用另一個同類型的對象來初始化新創(chuàng)建的對象沈矿。
復(fù)制對象把它作為參數(shù)傳遞給函數(shù)。
復(fù)制對象咬腋,并從函數(shù)返回這個對象。
如果在類中沒有定義拷貝構(gòu)造函數(shù)睡互,編譯器會自行定義一個根竿。如果類帶有指針變量,并有動態(tài)內(nèi)存分配就珠,則它必須有一個拷貝構(gòu)造函數(shù)寇壳。
Line( int len ); // 簡單的構(gòu)造函數(shù)
Line( const Line &obj); // 拷貝構(gòu)造函數(shù)
~Line(); // 析構(gòu)函數(shù)
類的友元函數(shù)是定義在類外部,但有權(quán)訪問類的所有私有(private)成員和保護(hù)(protected)成員妻怎。盡管友元函數(shù)的原型有在類的定義中出現(xiàn)過壳炎,但是友元函數(shù)并不是成員函數(shù)。
友元可以是一個函數(shù)逼侦,該函數(shù)被稱為友元函數(shù)匿辩;友元也可以是一個類,該類被稱為友元類榛丢,在這種情況下铲球,整個類及其所有成員都是友元。
如果一個函數(shù)是內(nèi)聯(lián)的晰赞,那么在編譯時稼病,編譯器會把該函數(shù)的代碼副本放置在每個調(diào)用該函數(shù)的地方选侨。
對內(nèi)聯(lián)函數(shù)進(jìn)行任何修改,都需要重新編譯函數(shù)的所有客戶端然走,因為編譯器需要重新更換一次所有的代碼援制,否則將會繼續(xù)使用舊的函數(shù)。
在類定義中的定義的函數(shù)都是內(nèi)聯(lián)函數(shù)芍瑞,即使沒有使用 inline 說明符晨仑。
在 C++ 中,每一個對象都能通過 this 指針來訪問自己的地址啄巧。this 指針是所有成員函數(shù)的隱含參數(shù)寻歧。因此,在成員函數(shù)內(nèi)部秩仆,它可以用來指向調(diào)用對象码泛。
友元函數(shù)沒有 this 指針,因為友元不是類的成員澄耍。只有成員函數(shù)才有 this 指針噪珊。
一個指向 C++ 類的指針與指向結(jié)構(gòu)的指針類似,訪問指向類的指針的成員齐莲,需要使用成員訪問運(yùn)算符 ->痢站,就像訪問指向結(jié)構(gòu)的指針一樣。與所有的指針一樣选酗,您必須在使用指針之前佛致,對指針進(jìn)行初始化。
我們可以使用 static 關(guān)鍵字來把類成員定義為靜態(tài)的声滥。當(dāng)我們聲明類的成員為靜態(tài)時妓蛮,這意味著無論創(chuàng)建多少個類的對象,靜態(tài)成員都只有一個副本殿衰。
靜態(tài)成員在類的所有對象中是共享的朱庆。如果不存在其他的初始化語句,在創(chuàng)建第一個對象時闷祥,所有的靜態(tài)數(shù)據(jù)都會被初始化為零娱颊。我們不能把靜態(tài)成員放置在類的定義中,但是可以在類的外部通過使用范圍解析運(yùn)算符 :: 來重新聲明靜態(tài)變量從而對它進(jìn)行初始化凯砍,
靜態(tài)成員函數(shù)即使在類對象不存在的情況下也能被調(diào)用箱硕,靜態(tài)函數(shù)只要使用類名加范圍解析運(yùn)算符 :: 就可以訪問。
靜態(tài)成員函數(shù)只能訪問靜態(tài)數(shù)據(jù)成員悟衩,不能訪問其他靜態(tài)成員函數(shù)和類外部的其他函數(shù)颅痊。
靜態(tài)成員函數(shù)有一個類范圍,他們不能訪問類的 this 指針局待。您可以使用靜態(tài)成員函數(shù)來判斷類的某些對象是否已被創(chuàng)建斑响。
C++ 繼承
派生類可以訪問基類中所有的非私有成員菱属。因此基類成員如果不想被派生類的成員函數(shù)訪問,則應(yīng)在基類中聲明為 private舰罚。
一個派生類繼承了所有的基類方法纽门,但下列情況除外:
基類的構(gòu)造函數(shù)、析構(gòu)函數(shù)和拷貝構(gòu)造函數(shù)营罢。
基類的重載運(yùn)算符赏陵。
基類的友元函數(shù)。
我們幾乎不使用 protected 或 private 繼承饲漾,通常使用 public 繼承蝙搔。當(dāng)使用不同類型的繼承時,遵循以下幾個規(guī)則:
公有繼承(public):當(dāng)一個類派生自公有基類時考传,基類的公有成員也是派生類的公有成員吃型,基類的保護(hù)成員也是派生類的保護(hù)成員,基類的私有成員不能直接被派生類訪問僚楞,但是可以通過調(diào)用基類的公有和保護(hù)成員來訪問勤晚。
保護(hù)繼承(protected): 當(dāng)一個類派生自保護(hù)基類時,基類的公有和保護(hù)成員將成為派生類的保護(hù)成員泉褐。
私有繼承(private):當(dāng)一個類派生自私有基類時赐写,基類的公有和保護(hù)成員將成為派生類的私有成員。
C++ 重載運(yùn)算符和重載函數(shù)
重載聲明是指一個與之前已經(jīng)在該作用域內(nèi)聲明過的函數(shù)或方法具有相同名稱的聲明膜赃,但是它們的參數(shù)列表和定義(實現(xiàn))不相同挺邀。
選擇最合適的重載函數(shù)或重載運(yùn)算符的過程,稱為重載決策跳座。
在同一個作用域內(nèi)端铛,可以聲明幾個功能類似的同名函數(shù),但是這些同名函數(shù)的形式參數(shù)(指參數(shù)的個數(shù)躺坟、類型或者順序)必須不同。您不能僅通過返回類型的不同來重載函數(shù)乳蓄。
重載的運(yùn)算符是帶有特殊名稱的函數(shù)咪橙,函數(shù)名是由關(guān)鍵字 operator 和其后要重載的運(yùn)算符符號構(gòu)成的。與其他函數(shù)一樣虚倒,重載運(yùn)算符有一個返回類型和一個參數(shù)列表美侦。
Box operator+(const Box&);
多數(shù)的重載運(yùn)算符可被定義為普通的非成員函數(shù)或者被定義為類成員函數(shù)。如果我們定義上面的函數(shù)為類的非成員函數(shù)魂奥,那么我們需要為每次操作傳遞兩個參數(shù)菠剩,
C++ 輸入/輸出運(yùn)算符重載
我們需要把運(yùn)算符重載函數(shù)聲明為類的友元函數(shù),這樣我們就能不用創(chuàng)建對象而直接調(diào)用函數(shù)耻煤。
函數(shù)調(diào)用運(yùn)算符 () 可以被重載用于類的對象具壮。當(dāng)重載 () 時准颓,您不是創(chuàng)造了一種新的調(diào)用函數(shù)的方式,相反地棺妓,這是創(chuàng)建一個可以傳遞任意數(shù)目參數(shù)的運(yùn)算符函數(shù)攘已。
下標(biāo)操作符 [] 通常用于訪問數(shù)組元素。重載該運(yùn)算符用于增強(qiáng)操作 C++ 數(shù)組的功能怜跑。
運(yùn)算符 -> 必須是一個成員函數(shù)样勃。如果使用了 -> 運(yùn)算符,返回類型必須是指針或者是類的對象性芬。
運(yùn)算符 -> 通常與指針引用運(yùn)算符 * 結(jié)合使用峡眶,用于實現(xiàn)"智能指針"的功能。這些指針是行為與正常指針相似的對象植锉,唯一不同的是辫樱,當(dāng)您通過指針訪問對象時,它們會執(zhí)行其他的任務(wù)汽煮。比如搏熄,當(dāng)指針銷毀時,或者當(dāng)指針指向另一個對象時暇赤,會自動刪除對象心例。
智能指針
C++ 多態(tài)
C++ 多態(tài)意味著調(diào)用成員函數(shù)時,會根據(jù)調(diào)用函數(shù)的對象的類型來執(zhí)行不同的函數(shù)鞋囊。
導(dǎo)致錯誤輸出的原因是止后,調(diào)用函數(shù) area() 被編譯器設(shè)置為基類中的版本,這就是所謂的靜態(tài)多態(tài)溜腐,或靜態(tài)鏈接 - 函數(shù)調(diào)用在程序執(zhí)行前就準(zhǔn)備好了译株。有時候這也被稱為早綁定,因為 area() 函數(shù)在程序編譯期間就已經(jīng)設(shè)置好了挺益。
但現(xiàn)在歉糜,讓我們對程序稍作修改,在 Shape 類中望众,area() 的聲明前放置關(guān)鍵字 virtual匪补,如下所示:
虛函數(shù) 是在基類中使用關(guān)鍵字 virtual 聲明的函數(shù)。在派生類中重新定義基類中定義的虛函數(shù)時烂翰,會告訴編譯器不要靜態(tài)鏈接到該函數(shù)夯缺。
我們想要的是在程序中任意點可以根據(jù)所調(diào)用的對象類型來選擇調(diào)用的函數(shù),這種操作被稱為動態(tài)鏈接甘耿,或后期綁定踊兜。
您可能想要在基類中定義虛函數(shù),以便在派生類中重新定義該函數(shù)更好地適用于對象佳恬,但是您在基類中又不能對虛函數(shù)給出有意義的實現(xiàn)捏境,這個時候就會用到純虛函數(shù)于游。
C++ 數(shù)據(jù)抽象
數(shù)據(jù)抽象是一種依賴于接口和實現(xiàn)分離的編程(設(shè)計)技術(shù)。
設(shè)計策略
抽象把代碼分離為接口和實現(xiàn)典蝌。所以在設(shè)計組件時曙砂,必須保持接口獨(dú)立于實現(xiàn),這樣骏掀,如果改變底層實現(xiàn)鸠澈,接口也將保持不變。
在這種情況下截驮,不管任何程序使用接口笑陈,接口都不會受到影響,只需要將最新的實現(xiàn)重新編譯即可葵袭。
C++ 數(shù)據(jù)封裝
數(shù)據(jù)封裝是一種把數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)捆綁在一起的機(jī)制涵妥,數(shù)據(jù)抽象是一種僅向用戶暴露接口而把具體的實現(xiàn)細(xì)節(jié)隱藏起來的機(jī)制。
把一個類定義為另一個類的友元類坡锡,會暴露實現(xiàn)細(xì)節(jié)蓬网,從而降低了封裝性。理想的做法是盡可能地對外隱藏每個類的實現(xiàn)細(xì)節(jié)鹉勒。
C++ 接口(抽象類)
接口描述了類的行為和功能帆锋,而不需要完成類的特定實現(xiàn)。
C++ 接口是使用抽象類來實現(xiàn)的禽额,抽象類與數(shù)據(jù)抽象互不混淆锯厢,數(shù)據(jù)抽象是一個把實現(xiàn)細(xì)節(jié)與相關(guān)的數(shù)據(jù)分離開的概念。
如果類中至少有一個函數(shù)被聲明為純虛函數(shù)脯倒,則這個類就是抽象類实辑。純虛函數(shù)是通過在聲明中使用 "= 0" 來指定的,
設(shè)計抽象類(通常稱為 ABC)的目的藻丢,是為了給其他類提供一個可以繼承的適當(dāng)?shù)幕惣羟恕3橄箢惒荒鼙挥糜趯嵗瘜ο螅荒茏鳛榻涌谑褂糜品础H绻噲D實例化一個抽象類的對象残黑,會導(dǎo)致編譯錯誤。
因此问慎,如果一個 ABC 的子類需要被實例化萍摊,則必須實現(xiàn)每個虛函數(shù)挤茄,這也意味著 C++ 支持使用 ABC 聲明接口如叼。如果沒有在派生類中重載純虛函數(shù),就嘗試實例化該類的對象穷劈,會導(dǎo)致編譯錯誤笼恰。
設(shè)計策略
面向?qū)ο蟮南到y(tǒng)可能會使用一個抽象基類為所有的外部應(yīng)用程序提供一個適當(dāng)?shù)挠环小⑼ㄓ玫摹?biāo)準(zhǔn)化的接口社证。然后逼龟,派生類通過繼承抽象基類,就把所有類似的操作都繼承下來追葡。
外部應(yīng)用程序提供的功能(即公有函數(shù))在抽象基類中是以純虛函數(shù)的形式存在的腺律。這些純虛函數(shù)在相應(yīng)的派生類中被實現(xiàn)。
這個架構(gòu)也使得新的應(yīng)用程序可以很容易地被添加到系統(tǒng)中宜肉,即使是在系統(tǒng)被定義之后依然可以如此匀钧。
C++ 文件和流
要在 C++ 中進(jìn)行文件處理,必須在 C++ 源代碼文件中包含頭文件 <iostream> 和 <fstream>谬返。
當(dāng) C++ 程序終止時之斯,它會自動關(guān)閉刷新所有流,釋放所有分配的內(nèi)存遣铝,并關(guān)閉所有打開的文件佑刷。但程序員應(yīng)該養(yǎng)成一個好習(xí)慣,在程序終止前關(guān)閉所有打開的文件酿炸。
寫入文件
在 C++ 編程中瘫絮,我們使用流插入運(yùn)算符( << )向文件寫入信息,就像使用該運(yùn)算符輸出信息到屏幕上一樣梁沧。唯一不同的是檀何,在這里您使用的是 ofstream 或 fstream 對象,而不是 cout 對象廷支。
讀取文件
在 C++ 編程中频鉴,我們使用流提取運(yùn)算符( >> )從文件讀取信息,就像使用該運(yùn)算符從鍵盤輸入信息一樣恋拍。唯一不同的是垛孔,在這里您使用的是 ifstream 或 fstream 對象,而不是 cin 對象施敢。
cin 對象的附加函數(shù)周荐,比如 getline()函數(shù)從外部讀取一行,ignore() 函數(shù)會忽略掉之前讀語句留下的多余字符僵娃。
istream 和 ostream 都提供了用于重新定位文件位置指針的成員函數(shù)概作。這些成員函數(shù)包括關(guān)于 istream 的 seekg("seek get")和關(guān)于 ostream 的 seekp("seek put")
查找方向可以是 ios::beg(默認(rèn)的,從流的開頭開始定位)默怨,也可以是 ios::cur(從流的當(dāng)前位置開始定位)讯榕,也可以是 ios::end(從流的末尾開始定位)。
文件位置指針是一個整數(shù)值,指定了從文件的起始位置到指針?biāo)谖恢玫淖止?jié)數(shù)愚屁。
C++ 異常處理
C++ 異常處理涉及到三個關(guān)鍵字:try济竹、catch、throw霎槐。
throw: 當(dāng)問題出現(xiàn)時送浊,程序會拋出一個異常。這是通過使用 throw 關(guān)鍵字來完成的丘跌。
catch: 在您想要處理問題的地方袭景,通過異常處理程序捕獲異常。catch 關(guān)鍵字用于捕獲異常闭树。
try: try 塊中的代碼標(biāo)識將被激活的特定異常浴讯。它后面通常跟著一個或多個 catch 塊。
如果您想讓 catch 塊能夠處理 try 塊拋出的任何類型的異常蔼啦,則必須在異常聲明的括號內(nèi)使用省略號 ...榆纽,
由于我們拋出了一個類型為 const char* 的異常,因此捏肢,當(dāng)捕獲該異常時奈籽,我們必須在 catch 塊中使用 const char*。當(dāng)上面的代碼被編譯和執(zhí)行時鸵赫,
在這里衣屏,what() 是異常類提供的一個公共方法,它已被所有子異常類重載辩棒。這將返回異常產(chǎn)生的原因狼忱。
C++ 動態(tài)內(nèi)存
了解動態(tài)內(nèi)存在 C++ 中是如何工作的是成為一名合格的 C++ 程序員必不可少的。C++ 程序中的內(nèi)存分為兩個部分:
棧:在函數(shù)內(nèi)部聲明的所有變量都將占用棧內(nèi)存一睁。
堆:這是程序中未使用的內(nèi)存,在程序運(yùn)行時可用于動態(tài)分配內(nèi)存窘俺。
在 C++ 中,您可以使用特殊的運(yùn)算符為給定類型的變量在運(yùn)行時分配堆內(nèi)的內(nèi)存瘤泪,這會返回所分配的空間地址育八。這種運(yùn)算符即 new 運(yùn)算符对途。
如果您不需要動態(tài)分配內(nèi)存,可以使用 delete 運(yùn)算符髓棋,刪除之前由 new 運(yùn)算符分配的內(nèi)存实檀。
malloc() 函數(shù)在 C 語言中就出現(xiàn)了,在 C++ 中仍然存在,但建議盡量不要使用 malloc() 函數(shù)劲妙。new 與 malloc() 函數(shù)相比,其主要的優(yōu)點是儒喊,new 不只是分配了內(nèi)存镣奋,它還創(chuàng)建了對象。
C++ 命名空間
因此怀愧,引入了命名空間這個概念侨颈,專門用于解決上面的問題,它可作為附加信息來區(qū)分不同庫中相同名稱的函數(shù)芯义、類哈垢、變量等。使用了命名空間即定義了上下文扛拨。本質(zhì)上耘分,命名空間就是定義了一個范圍。
命名空間的定義使用關(guān)鍵字 namespace绑警,后跟命名空間的名稱.
namespace namespace_name {
// 代碼聲明
}
為了調(diào)用帶有命名空間的函數(shù)或變量求泰,需要在前面加上命名空間的名稱,
name::code; // code 可以是變量或函數(shù)
您可以使用 using namespace 指令计盒,這樣在使用命名空間時就可以不用在前面加上命名空間的名稱渴频。這個指令會告訴編譯器,后續(xù)的代碼將使用指定的命名空間中的名稱北启。
C++ 模板
模板是泛型編程的基礎(chǔ)卜朗,泛型編程即以一種獨(dú)立于任何特定類型的方式編寫代碼。
模板是創(chuàng)建泛型類或函數(shù)的藍(lán)圖或公式咕村。庫容器,比如迭代器和算法惹悄,都是泛型編程的例子泣港,它們都使用了模板的概念当纱。
函數(shù)模板
模板函數(shù)定義的一般形式如下所示:
template <class type> ret-type func-name(parameter list)
{
// 函數(shù)的主體
}
template <typename T>
inline T const& Max (T const& a, T const& b)
{
return a < b ? b:a;
}
類模板
template <class type> class class-name {
.
.
.
}
template <class T>
class Stack {
private:
vector<T> elems; // 元素
public:
void push(T const&); // 入棧
void pop(); // 出棧
T top() const; // 返回棧頂元素
bool empty() const{ // 如果為空則返回真。
return elems.empty();
}
};
C++ 預(yù)處理器
預(yù)處理器是一些指令,指示編譯器在實際編譯之前所需完成的預(yù)處理手形。
預(yù)處理指令不是 C++ 語句库糠,所以它們不會以分號(;)結(jié)尾瞬欧。
define 預(yù)處理指令用于創(chuàng)建符號常量艘虎。該符號常量通常稱為宏野建,
$gcc -E test.cpp > test.p
接下來使用 -E 選項進(jìn)行編譯,并把結(jié)果重定向到 test.p妄呕。
和 ## 預(yù)處理運(yùn)算符在 C++ 和 ANSI/ISO C 中都是可用的绪励。# 運(yùn)算符會把 replacement-text 令牌轉(zhuǎn)換為用引號引起來的字符串停做。
運(yùn)算符用于連接兩個令牌蛉腌。下面是一個實例:
LINE__ 這會在程序編譯時包含當(dāng)前行號烙丛。
FILE 這會在程序編譯時包含當(dāng)前文件名河咽。
DATE 這會包含一個形式為 month/day/year 的字符串忘蟹,它表示把源文件轉(zhuǎn)換為目標(biāo)代碼的日期狠毯。
TIME 這會包含一個形式為 hour:minute:second 的字符串嚼松,它表示程序被編譯的時間。
C++ 信號處理
信號是由操作系統(tǒng)傳給進(jìn)程的中斷少辣,會提早終止一個程序漓帅。在 UNIX忙干、LINUX、Mac OS X 或 Windows 系統(tǒng)上爱葵,可以通過按 Ctrl+C 產(chǎn)生中斷萌丈。
這些信號是定義在 C++ 頭文件 <csignal> 中辆雾。
SIGABRT 程序的異常終止藤乙,如調(diào)用 abort湾盒。
SIGFPE 錯誤的算術(shù)運(yùn)算罚勾,比如除以零或?qū)е乱绯龅牟僮鳌?br>
SIGILL 檢測非法指令丈莺。
SIGINT 接收到交互注意信號缔俄。
SIGSEGV 非法訪問內(nèi)存。
SIGTERM 發(fā)送到程序的終止請求登失。
void (signal (int sig, void (func)(int)))(int);
這個函數(shù)接收兩個參數(shù):第一個參數(shù)是一個整數(shù)状婶,代表了信號的編號;第二個參數(shù)是一個指向信號處理函數(shù)的指針稍刀。
讓我們編寫一個簡單的 C++ 程序掉丽,使用 signal() 函數(shù)捕獲 SIGINT 信號捶障。不管您想在程序中捕獲什么信號,您都必須使用 signal 函數(shù)來注冊信號示绊,并將其與信號處理程序相關(guān)聯(lián)拌禾。
可以使用函數(shù) raise() 生成信號闻蛀,該函數(shù)帶有一個整數(shù)信號編號作為參數(shù)
int raise (signal sig);
在這里,sig 是要發(fā)送的信號的編號茵休,這些信號包括:SIGINT俐芯、SIGABRT吧史、SIGFPE扣蜻、SIGILL锐极、SIGSEGV灵再、SIGTERM、SIGHUP翎迁。
C++ 多線程
基于進(jìn)程和基于線程栋猖。
基于進(jìn)程的多任務(wù)處理是程序的并發(fā)執(zhí)行。
基于線程的多任務(wù)處理是同一程序的片段的并發(fā)執(zhí)行汪榔。
本教程假設(shè)您使用的是 Linux 操作系統(tǒng)蒲拉,我們要使用 POSIX 編寫多線程 C++ 程序。POSIX Threads 或 Pthreads 提供的 API 可在多種類 Unix POSIX 系統(tǒng)上可用痴腌,比如 FreeBSD雌团、NetBSD、GNU/Linux锦援、Mac OS X 和 Solaris替久。
include <pthread.h>
pthread_create (thread, attr, start_routine, arg)
在這里蒂誉,pthread_create 創(chuàng)建一個新的線程绍移,并讓它可執(zhí)行瞬测。
hread 指向線程標(biāo)識符指針。
attr 一個不透明的屬性對象,可以被用來設(shè)置線程屬性摔寨。您可以指定線程屬性對象逗余,也可以使用默認(rèn)值 NULL啥繁。
start_routine 線程運(yùn)行函數(shù)起始地址,一旦線程被創(chuàng)建就會執(zhí)行嘶居。
arg 運(yùn)行函數(shù)的參數(shù)。它必須通過把引用作為指針強(qiáng)制轉(zhuǎn)換為 void 類型進(jìn)行傳遞戈钢。如果沒有傳遞參數(shù)众弓,則使用 NULL俯艰。
pthread_exit 用于顯式地退出一個線程
$ g++ test.cpp -lpthread -o test.o
我們可以使用以下兩個函數(shù)來連接或分離線程:
pthread_join (threadid, status)
pthread_detach (threadid)
pthread_join() 子程序阻礙調(diào)用程序良拼,直到指定的 threadid 線程終止為止肘习。當(dāng)創(chuàng)建一個線程時养葵,它的某個屬性會定義它是否是可連接的(joinable)或可分離的(detached)夏醉。只有創(chuàng)建時定義為可連接的線程才可以被連接靶擦。如果線程創(chuàng)建時被定義為可分離的枚粘,則它永遠(yuǎn)也不能被連接。
C++ Web 編程 (沒怎么看完)
然而默色,以這種方式搭建起來的 HTTP 服務(wù)器,不管何時請求目錄中的某個文件英遭,HTTP 服務(wù)器發(fā)送回來的不是該文件间护,而是以程序形式執(zhí)行,并把執(zhí)行產(chǎn)生的輸出發(fā)送回瀏覽器顯示出來挖诸。
公共網(wǎng)關(guān)接口(CGI)汁尺,是使得應(yīng)用程序(稱為 CGI 程序或 CGI 腳本)能夠與 Web 服務(wù)器以及客戶端進(jìn)行交互的標(biāo)準(zhǔn)協(xié)議。這些 CGI 程序可以用 Python多律、PERL痴突、Shell、C 或 C++ 等進(jìn)行編寫
有由 HTTP 服務(wù)器執(zhí)行的 CGI 程序狼荞,都必須在預(yù)配置的目錄中辽装。該目錄稱為 CGI 目錄,按照慣例命名為 /var/www/cgi-bin相味。雖然 CGI 文件是 C++ 可執(zhí)行文件拾积,但是按照慣例它的擴(kuò)展名是 .cgi。
HTTP 頭信息
CGI 環(huán)境變量
C++ STL 教程
C++ STL(標(biāo)準(zhǔn)模板庫)是一套功能強(qiáng)大的 C++ 模板類丰涉,提供了通用的模板類和函數(shù)殷勘,這些模板類和函數(shù)可以實現(xiàn)多種流行和常用的算法和數(shù)據(jù)結(jié)構(gòu),如向量昔搂、鏈表玲销、隊列、棧摘符。
容器(Containers) 容器是用來管理某一類對象的集合贤斜。C++ 提供了各種不同類型的容器,比如 deque逛裤、list瘩绒、vector、map 等带族。
算法(Algorithms) 算法作用于容器锁荔。它們提供了執(zhí)行各種操作的方式,包括對容器內(nèi)容執(zhí)行初始化蝙砌、排序阳堕、搜索和轉(zhuǎn)換等操作。
迭代器(iterators) 迭代器用于遍歷對象集合的元素择克。這些集合可能是容器恬总,也可能是容器的子集。
下面的程序演示了向量容器(一個 C++ 標(biāo)準(zhǔn)的模板)肚邢,它與數(shù)組十分相似壹堰,唯一不同的是拭卿,向量在需要擴(kuò)展大小的時候,會自動處理它自己的存儲需求:
include <vector>
push_back( ) 成員函數(shù)在向量的末尾插入值贱纠,如果有必要會擴(kuò)展向量的大小峻厚。
size( ) 函數(shù)顯示向量的大小。
begin( ) 函數(shù)返回一個指向向量開頭的迭代器谆焊。
end( ) 函數(shù)返回一個指向向量末尾的迭代器目木。
C++ 標(biāo)準(zhǔn)庫
C++ 標(biāo)準(zhǔn)庫可以分為兩部分:
標(biāo)準(zhǔn)函數(shù)庫: 這個庫是由通用的、獨(dú)立的懊渡、不屬于任何類的函數(shù)組成的刽射。函數(shù)庫繼承自 C 語言。
面向?qū)ο箢悗欤?這個庫是類及其相關(guān)函數(shù)的集合剃执。
C++ 標(biāo)準(zhǔn)庫包含了所有的 C 標(biāo)準(zhǔn)庫誓禁,為了支持類型安全,做了一定的添加和修改肾档。