術(shù)語(yǔ)“流”(stream)想要表達(dá)的是,隨著時(shí)間的推移,字符是順序生成或消耗的
寫(xiě)入endl的效果是結(jié)束當(dāng)前行,并將與設(shè)備關(guān)聯(lián)的緩沖區(qū)(buffer)中的內(nèi)容刷到設(shè)備中
前綴std::指出名字cout和endl是定義在名為std的命名空間(namespace)中的。命名空間可以幫助我們避免不經(jīng)意的名字定義沖突,以及使用庫(kù)中相同名字導(dǎo)致的沖突。
作用域運(yùn)算符(::)
類(lèi)定義了行為(類(lèi)定義了對(duì)象可以執(zhí)行的所有動(dòng)作)
成員函數(shù)(member function) 是定義為類(lèi)的一部分的函數(shù),有時(shí)也被稱(chēng)為方法(method)。
點(diǎn)運(yùn)算符(.)只能用于類(lèi)類(lèi)型的對(duì)象
調(diào)用運(yùn)算符(())來(lái)調(diào)用一個(gè)函數(shù)。調(diào)用運(yùn)算符是一對(duì)圓括號(hào)
條件(condition)求值結(jié)果為真或假的表達(dá)式。通常用值0表示假,用非零值表示真
數(shù)據(jù)類(lèi)型是程序的基礎(chǔ):它告訴我們數(shù)據(jù)的意義以及我們能在數(shù)據(jù)上執(zhí)行的操作
一個(gè)char的空間應(yīng)確保可以存放機(jī)器基本字符集中的任意字符對(duì)應(yīng)的數(shù)字值。也就是說(shuō),一個(gè)char的大小和一個(gè)機(jī)器字節(jié)一樣。
為了賦予內(nèi)存中某個(gè)地址明確的含義,必須首先知道內(nèi)存在該地址的數(shù)據(jù)的類(lèi)型。類(lèi)型決定了數(shù)據(jù)所占的比特?cái)?shù)以及該如何解釋這些比特的內(nèi)容。
大多數(shù)程序員能夠(也應(yīng)該)對(duì)數(shù)據(jù)類(lèi)型的使用做出限定從而簡(jiǎn)化選擇的過(guò)程。
- 當(dāng)明確知曉數(shù)值不可能為負(fù)時(shí),選用無(wú)符號(hào)類(lèi)型
- 使用int執(zhí)行整數(shù)運(yùn)算
- 在算數(shù)表達(dá)式中不要使用char或bool,因?yàn)閏har在一些機(jī)器上是有符號(hào),另一些機(jī)器上可能沒(méi)有符號(hào)。如果需要使用一個(gè)不大的整數(shù),可以明確指定類(lèi)型是signed char 或者unsigned char
- 執(zhí)行浮點(diǎn)數(shù)運(yùn)算選double
把一個(gè)布爾值賦值給非布爾類(lèi)型是,初始值為false則結(jié)果為0,初始值為true則結(jié)果為1
當(dāng)我們賦給無(wú)符號(hào)類(lèi)型一個(gè)超出它表示范圍的值時(shí),結(jié)果是初始值對(duì)無(wú)符號(hào)類(lèi)型表示數(shù)值的總數(shù)取模后的余數(shù)。 把 -1賦值給8bit大小的unsigned char所得的結(jié)果是255
計(jì)算機(jī)中數(shù)值按補(bǔ)碼存儲(chǔ)的,-1的原碼是10000001(有符號(hào)8位),補(bǔ)碼(反碼+1):11111111。所以直接賦值給unsigned char, 11111111等于255。
變量提供一個(gè)具名的,可供程序操作的儲(chǔ)存空間。c++中的每個(gè)變量都有其數(shù)據(jù)類(lèi)型,數(shù)據(jù)類(lèi)型決定著變量所占內(nèi)存空間的大小和布局方式、該空間能存儲(chǔ)的值的范圍,以及變量能參與的運(yùn)算。對(duì)c++程序員來(lái)說(shuō),“變量”(variable)和“對(duì)象”(object)一般可以互換使用。
對(duì)象是指一塊能存儲(chǔ)數(shù)據(jù)并具有某種類(lèi)型的內(nèi)存空間
初始化不是賦值,初始化的含義是創(chuàng)建變量時(shí)賦予其一個(gè)初始值,而賦值的含義是把對(duì)象的當(dāng)前值擦除,而以一個(gè)新值來(lái)替代。
如果想聲明一個(gè)變量而非定義它,就在變量名前添加關(guān)鍵字extern,而且不要顯式地初始化變量:
extern int i; //聲明i 而非定義i
extern double pi = 3.1416; // 定義
在函數(shù)體內(nèi)部,如果試圖初始化一個(gè)由extern關(guān)鍵字標(biāo)記的變量,將引發(fā)錯(cuò)誤
變量能且只能被定義一次,但是可以被多次聲明
通常將聲明符寫(xiě)成&d的形式來(lái)定義引用類(lèi)型
int val = 1024;
int &refVal = val; //refVal指向val (是val的另一個(gè)名字)
int &refVal2; //報(bào)錯(cuò):引用必須被初始化
int &refVal3 = refVal // refVal3綁定到了那個(gè)與refVal綁定的對(duì)象上,這里就是綁定到val上
引用并非對(duì)象,相反的,它只是為一個(gè)已經(jīng)存在的對(duì)象所起的另外一個(gè)名字。
因?yàn)橐帽旧聿皇且粋€(gè)對(duì)象,所以不能定義引用的引用
引用只能綁定在對(duì)象上,而不能與字面值或某個(gè)表達(dá)式的計(jì)算結(jié)果綁定在一起。
指針(pointer)是“指向”(point to)另外一種類(lèi)型的符合類(lèi)型。與引用類(lèi)似,指針也實(shí)現(xiàn)了對(duì)其他對(duì)象的間接訪問(wèn)。然而指針與引用相比又有很多不同點(diǎn)。
- 指針本身就是一個(gè)對(duì)象,允許對(duì)指針賦值和拷貝,而且在指針的生命周期內(nèi)他可以先后指向幾個(gè)不同的對(duì)象。
- 指針無(wú)須在定義時(shí)賦初值。和其它內(nèi)置類(lèi)型一樣,在塊作用域內(nèi)定義的指針如果沒(méi)有被初始化,也將擁有一個(gè)不確定的值。
獲取對(duì)象的地址
指針存放某個(gè)對(duì)象的地址,要想獲取該地址,需要使用取地址符(操作符&)
int ival = 42;
int *p = &ival; // p存放變量ival的地址,或者說(shuō)p是指向變量ival的指針
引用不是對(duì)象,沒(méi)有實(shí)際地址,所以不能定義指向引用的指針
如果指針指向了一個(gè)對(duì)象,則允許使用解引用符(操作符*)來(lái)訪問(wèn)改對(duì)象
int ival =42 ;
int *p = &ival; // p存放著變量ival的地址,或者說(shuō)p是指向變量ival的指針
cout << *p // 由符號(hào)*得到指針p所指的對(duì)象,輸出42
*p = 0; //有符號(hào)*得到指針p所指向的對(duì)象,即可經(jīng)由p為變量ival賦值
cout << *p; //輸出0
指針和引用都能提供對(duì)其他對(duì)象的間接訪問(wèn),然后在具體實(shí)現(xiàn)細(xì)節(jié)上二者有很大的不同,其中最重要的一點(diǎn)就是引用本身并非一個(gè)對(duì)象。一旦定義了引用,就無(wú)法令其再綁定到另外的對(duì)象,之后每次使用這個(gè)引用都是訪問(wèn)它最初綁定的那個(gè)對(duì)象。