3.1 命名空間的using聲明
每個名字都需要獨立的using聲明
頭文件中不應該包含using聲明
因為頭文件的內(nèi)容會拷貝到所有引用它的文件夾中去嘹害,如果頭文件中有using聲明,可能會產(chǎn)生始料未及的名字沖突吮便。
3.2 標準庫類型string
3.2.1 定義和初始化string對象
string s1; //默認初始化
string s2=s1; //s2是s1的副本
string s2(s1); //等價于string s2=s1,s2是s1的副本
string s3="hiya"; //s3是字面值的副本笔呀,但是不包含字面值最后的那個空字符
string s3("hiya"); //等價于string s3="hiya"
string s4(n,'c'); //把s4初始化為連續(xù)n個字符c組成的字符串
3.2.2 string對象上的操作
- 讀寫string對象
- 讀取未知數(shù)量的string對象
- 使用getline讀取一整行
- string的empty和size操作
string:size_type類型
size_type是一種無符號整形數(shù),如果在表達式中混用了帶符號數(shù)和無符號數(shù)會產(chǎn)生意想不到的后果髓需。
比較string對象
按字典順序
字面值和string類型相加
//錯誤的方式
string s="hello"+"," //錯誤许师,因為兩個運算對象都不是string,不能把兩個字面值直接相加
string s1="hello"+s1+"," //正確
** 字符串字面值與string是不同的類型 **
ex3.3 string類的輸入運算和getline函數(shù)分別如何處理字符串
string的標準輸入:自動忽略字符串開頭的空白僚匆,從第一個真正的字符開始讀取微渠,直到下一個空白為止
getline函數(shù):從給定的輸入流中讀取,直到遇到換行符為止咧擂。
3.3 標準庫類型vector
vector是一種類模板逞盆,需要后加一堆尖括號,在括號內(nèi)放上信息松申。
3.3.1 定義和初始化vector對象
- 1.使用拷貝初始化
- 2.如果提供一個類內(nèi)的初始值云芦,只能使用拷貝初始化或者花括號形式初始化
- 3.如果提供的是初始值元素值的列表,則只能使用花括號初始化贸桶,而不能使用圓括號
- 4.創(chuàng)建指定數(shù)量的元素:采用圓括號
3.3.2 像vector中添加元素
push_back:像一個值添加到vector的尾部舅逸。(如果開始不知道有多少元素,c++中刨啸,一般先創(chuàng)建一個空的vector然后像其中添加元素最好)
不能使用下標形式添加元素堡赔,只能對確知已存在的元素執(zhí)行下標操作。
3.4 迭代器介紹
迭代器這個名詞可能有三種不同的含義:可能是迭代器概念本身设联,可能是容器定義的類型善已,還可能指某個迭代器對象。
某些對Vector對象的操作回事迭代器失效:一個是不能在范圍for循環(huán)內(nèi)向vector中添加元素离例,另一個是任何一種可能改變vector對象容量的操作换团,都有可能是vector對象的迭代器失效。
迭代器的算數(shù)運算
可以令迭代器和一個整數(shù)值相加(或相減)宫蛆,其返回值是向前(或向后)移動了若干個位置的迭代器艘包。
迭代器之間的比較:參與比較的迭代器必須合法且指向同一個容器的元素(或者尾元素的下一個位置)
3.5 數(shù)組
數(shù)組與vector的區(qū)別:數(shù)組的大小確定不變,不能隨意像數(shù)組中添加元素耀盗。性能很好想虎,但是損失了靈活性。
3.5.1 定義和初始化數(shù)組
數(shù)組是一種復合類型叛拷,數(shù)組的維度必須是一個常量表達式舌厨。
定義數(shù)組的時候必須指定數(shù)組的類型。同時忿薇,數(shù)組的元素應該為對象裙椭,不存在引用的數(shù)組躏哩。
字符數(shù)組的特殊性
char a1[]={'C','+','+'}; //列表初始化,沒有空字符
char a2[]={'C','+','+'}; //列表初始化揉燃,含有顯式的空字符
char a3[]="C++"; //自動添加表示字符串結(jié)束的空字符
不允許拷貝和賦值
復雜的數(shù)組聲明
** 要想理解數(shù)組的聲明的含義扫尺,最好的辦法是從數(shù)組的名字開始按照由內(nèi)向外的順序閱讀 **
int &refs[10]=... // 錯誤!不存在數(shù)組的引用
int (*Parray)[10]=&arr; //Parray指向一個含有10個整數(shù)的數(shù)組
int (&arrRef)[10]=arr //arrRef引用一個含有10個整數(shù)的數(shù)組
int *ptrs[10]; //ptrs是一個含有10個整型指針的數(shù)組
3.5.2 訪問數(shù)組元素
- 數(shù)組下標為** size_t類型 **炊汤,是一種機器相關(guān)的無符號類型正驻。
3.5.3 指針和數(shù)組
使用數(shù)組的時候編譯器一般會把它轉(zhuǎn)化成指針
指針也是迭代器
允許使用遞增運算符將指向數(shù)組元素的指針向前移動到下一個位置上
標準庫函數(shù)begin和end
3.5.4 C風格字符串
C風格字符串不是一種類型,而是為了表達和使用字符串而形成的一種約定俗成的寫法婿崭。
C風格字符串和字符數(shù)組的關(guān)系拨拓,尤其需要考慮串尾是否含有空字符。
** 問題:為什么沒有指針相加氓栈? **
指著也是一個對象渣磷,與指針有關(guān)的屬性有三個,分別是指針的值(是一個內(nèi)存地址值)授瘦、指針所指的對象醋界、指針本身在內(nèi)存中的存儲位置。顯然把兩個地址加在一起是沒有意義的提完。
3.5.5 與舊代碼的接口
混用string對象和C風格字符串
- 允許使用以空字符結(jié)束的字符數(shù)組來初始化string對象或為string對象賦值
- 在string對象的加法運算中允許使用以空字符結(jié)束的字符數(shù)組作為其中一個運算對象(但不能兩個都是)形纺;在string對象的賦值運算中允許以空字符串結(jié)束的字符數(shù)組作為右側(cè)的運算對象。
使用數(shù)組初始化vector對象
允許使用數(shù)組初始化vector對象徒欣,只需要指明拷貝區(qū)域的首元素地址和尾后地址即可逐样。但不能使用一個數(shù)組為另一個內(nèi)置類型的數(shù)組賦初值,也不能使用vector對象初始化數(shù)組打肝。
3.6 多維數(shù)組
嚴格來說脂新,C++語言中沒有多維數(shù)組,通常所說的多維數(shù)組其實是數(shù)組的數(shù)組粗梭。
當一個數(shù)組的元素仍然是數(shù)組時争便,通常使用兩個維度來定義它:一個維度表示數(shù)組本身大小,另一個維度表示其元素(也是數(shù)組)大小断医。
int ia[3][4] //大小為3的數(shù)組滞乙,每個元素是含有4個整數(shù)的數(shù)組