注意以下細(xì)節(jié)
(1)###
int *ptr;
強(qiáng)調(diào) *ptr 是一個(gè)int類型的值
int* ptr;
強(qiáng)調(diào) int* 一種類型勤晚,是指向int的指針
(2)###
下面的代碼中
int* p1, p2;
聲明了一個(gè)指針 p1 和一個(gè)常規(guī)變量 p2重绷,也就是說炸卑,對(duì)于每一個(gè)指針變量名洼滚,都需要使用一個(gè) (*) 號(hào):
int *p1, *p2;
(3)###
int *i_ptr;
double *f_ptr;
char *ch_ptr;
盡管他們都是指針,卻是不同類型的指針(指針基于其它類型)设易;
*i_ptr *f_ptr *ch_ptr 指向長(zhǎng)度不同的數(shù)據(jù)類型芥吟,但它們本身的長(zhǎng)度通常是相同的,即地址的長(zhǎng)度夫啊。
(4)###
int higgens = 5;
int *pt = &higgens;
將pt(而不是*pt)的值設(shè)置為&higgens函卒,即:
int higgens= 5;
int *pt;
pt = &higgens;
(5)###
警告:一定要在對(duì)指針使用解除引用操作符(*)之前,將指針初始化為一個(gè)確定的撇眯、適當(dāng)?shù)牡刂贰?/p>
(6)###
給指針賦地址(數(shù)字整型)的一種方法报嵌,是強(qiáng)制類型轉(zhuǎn)換:
int *pt;
pt = (int*)0x8000000;
(7)###
使用 new 和 delete 時(shí),應(yīng)遵守以下規(guī)則:
- 不要使用 delete 刪除不是 new 分配的內(nèi)存熊榛;
- 不要使用 delete 釋放同一內(nèi)存兩次锚国;
- 如果使用 new[] 為數(shù)組分配內(nèi)存,則應(yīng)使用 delete[] 來釋放玄坦;
- 如果使用 new[] 為一個(gè)實(shí)體分配內(nèi)存血筑,則應(yīng)使用 delete 來釋放;
- 對(duì)空值指針使用 delete 是安全的煎楣。
(8)###
可以用指針代替數(shù)組名是因?yàn)椋耗憧梢孕薷闹羔樀闹挡蜃埽鴶?shù)組名是常量:
pointername = pointername + 1; // right
arrayname = arrayname + 1; // error 是常量,不能進(jìn)行賦值
(9)###
對(duì)數(shù)組名應(yīng)用sizeof得到的是數(shù)組的長(zhǎng)度择懂,而對(duì)指針應(yīng)用sizeof得到的是指針的長(zhǎng)度(與平臺(tái)相關(guān)喻喳,通常為4)。
(10)###
cout.setf(ios_base::boolalpha);
使其后的表達(dá)式的cout語句的結(jié)果以“bool”方式顯示
(11)###
遞增/遞減操作符和指針(假設(shè)pt指向a[1])
*++pt; // 此時(shí)pt指向a[2]
++*pt; // “a[2]+1”
(*pt)++; // “a[2]++”
*pt++; // pt仍指向a[2],但是該語句完成后困曙,pt的值為a[3]的地址
(12)###
可以使用如下方式讀取標(biāo)準(zhǔn)輸入
for (cin>>x; x==0 ; cin>>x); // 如果 x == 0 繼續(xù)輸入
(13)###
如果不對(duì)函數(shù)內(nèi)部定義的變量進(jìn)行初始化表伦,該變量的值將是不確定的。這意味著該變量的值將是它被創(chuàng)建之前赂弓,該內(nèi)存單元保存的值绑榴。
(14)###
C++ 通常的約定是,退出值為 0 則意味著程序運(yùn)行成功盈魁,為非零則意味著存在問題翔怎。
(15)###
C++ 中,在可以使用數(shù)字轉(zhuǎn)義序列或符號(hào)轉(zhuǎn)義序列(如 \0x8 和 \b)時(shí),應(yīng)使用符號(hào)序列赤套。數(shù)字表示與特定的編碼方式(如 ASCII 碼)相關(guān)飘痛,而符號(hào)表示適用于任何編碼方式,其可讀性也更強(qiáng)容握。
(16)###
如果你在學(xué)習(xí) C++ 之前學(xué)習(xí)了 C 語言宣脉,并打算使用 #define 來定義符號(hào)常量,請(qǐng)不要這樣做,而應(yīng)使用 const。
(17)###
C++ 不提倡使用外部變量品姓,但是提倡外部結(jié)構(gòu)( struct )聲明。另外羊苟,在外部聲明符號(hào)常量通常更合理。
(18)###
警告:一定要在對(duì)指針應(yīng)用解除引用操作符(*)之前感憾,將指針初始化為一個(gè)確定的蜡励、適當(dāng)?shù)牡刂贰_@是關(guān)于指針的金科玉律阻桅。
(19)###
在 cout 和多數(shù) C++ 表達(dá)式中凉倚,char 數(shù)組名、指向 char 的指針以及用引號(hào)括起的字符串常量都被解釋為字符串第一個(gè)字符的地址嫂沉。
(20)###
必須在聲明引用時(shí)進(jìn)行初始化(int & zdsTest = tiger;)稽寒。
(21)###
返回引用的函數(shù)實(shí)際上是被引用變量的別名。
(22)###
應(yīng)避免返回當(dāng)函數(shù)終止時(shí)不再存在的內(nèi)存單元引用趟章。
(23)###
結(jié)構(gòu)的默認(rèn)訪問類型是 public瓦胎,而類為 private。C++ 通常把結(jié)構(gòu)限制為只表示純粹的數(shù)據(jù)對(duì)象或沒有私有部分的類尤揣。
(24)###
缺省形參值的說明次序:必須以從右向左的順序來聲明,并且缺省形參的右面不能有非缺省形參值的參數(shù)柬祠。因?yàn)檎{(diào)用時(shí)實(shí)參取代形參是從左向右的順序北戏。
(25)###
如果既可以通過初始化,也可以通過賦值來設(shè)置對(duì)象的值漫蛔,則應(yīng)采用初始化的方式嗜愈。通常這種方式效率更高。舉例:
Exam e1 = Exam("zds",25,12); // #1
Exam e2;
e2 = Exam("Toby",25,12); // #2
#1語句是初始化莽龟,它創(chuàng)建有指定值的對(duì)象蠕嫁,可能會(huì)創(chuàng)建臨時(shí)對(duì)象(也可能不會(huì));#2語句是賦值毯盈。像這樣在賦值語句中使用構(gòu)造函數(shù)總會(huì)導(dǎo)致在賦值前創(chuàng)建一個(gè)臨時(shí)對(duì)象剃毒。
(26)###
在默認(rèn)情況下,將一個(gè)對(duì)象賦給同類型的另一個(gè)對(duì)象時(shí),C++ 將源對(duì)象的每個(gè)數(shù)據(jù)成員的內(nèi)容復(fù)制到目標(biāo)對(duì)象中相應(yīng)的數(shù)據(jù)成員中赘阀。
(27)###
記滓娌:接受一個(gè)參數(shù)的構(gòu)造函數(shù)允許使用賦值句法來將對(duì)象初始化為一個(gè)值。例:
Exam zdsEx = value;
(28)###
要?jiǎng)?chuàng)建類對(duì)象數(shù)組基公,則這個(gè)類必須有默認(rèn)構(gòu)造函數(shù)幅慌。
(29)###
不要返回指向局部變量或臨時(shí)對(duì)象的引用。函數(shù)執(zhí)行完畢后轰豆,局部變量和臨時(shí)對(duì)象將消失胰伍,引用將指向不存在的數(shù)據(jù)。
(30)###
在類聲明中定義的函數(shù)酸休,將自動(dòng)成為內(nèi)聯(lián)函數(shù)骂租。
(31)###
如果方法通過計(jì)算得到一個(gè)新的類對(duì)象,則應(yīng)考慮是否可以使用類構(gòu)造函數(shù)來完成這種工作雨席。這樣不僅可以避免麻煩菩咨,而且可以確保新的對(duì)象是按照正確的方式創(chuàng)建的。例如:
Exa Exa::zdsText(const Exa& bExa) const{
Exa zdsExa;
zdsExa.x = x + bExa.x;
zdsExa.y = y + bExa.y;
return zdsExa;
}
可以用如下“更好”的代碼取代:
Exa Exa::zdsText(const Exa& bExa) const{
return Exa(x + bExa.x,y + bExa.y);
}
當(dāng)然陡厘,我們的類中需要有對(duì)應(yīng) Exa(x + bExa.x, y + bExa.y) 的構(gòu)造函數(shù)抽米。
(32)###
只接受一個(gè)參數(shù)的構(gòu)造函數(shù)定義了從參數(shù)到類類型的轉(zhuǎn)換。但是如果使用關(guān)鍵字 explicit 限定了這種構(gòu)造函數(shù)糙置,則它就只能用于顯示轉(zhuǎn)換云茸,否則也可以用于隱式轉(zhuǎn)換。
(33)###
使用 delete 刪除對(duì)象可以釋放對(duì)象本身占用的內(nèi)存谤饭,但并不能自動(dòng)釋放屬于對(duì)象成員的指針指向的內(nèi)存标捺。因此,必須使用析構(gòu)函數(shù)揉抵。在析構(gòu)函數(shù)中使用 delete 語句可確保對(duì)象過期時(shí)亡容,由構(gòu)造函數(shù)使用 new 分配的內(nèi)存被釋放。
(34)###
指針策略是 C++ 內(nèi)存管理理念的核心冤今,它將地址視為指定的量闺兢,而將值視為派生量。一種特殊類型的變量——指針——用于存儲(chǔ)值的地址戏罢。因此屋谭,指針名表示的是地址。* 操作符稱為間接值或解除引用操作符龟糕,將其應(yīng)用于指針桐磁,可以得到該地址處存儲(chǔ)的值(這和乘法使用的符號(hào)相同;C++ 根據(jù)上下文來確定所指的是乘法還是解除引用)讲岁。
(35)###
* 操作符兩邊的空格是可選的我擂。傳統(tǒng)上衬以,C 程序員使用這種格式:
int *ptr;
這里強(qiáng)調(diào) *ptr 是一個(gè) int 類型的值。而很多 C++ 程序員使用這種格式:
int* ptr;
這里強(qiáng)調(diào)的是 int* 是一種類型扶踊,是指向 int 的指針泄鹏。在哪里添加空格對(duì)于編譯器來說是沒有任何區(qū)別的。不過:
int* ptr1,ptr2;
將創(chuàng)建一個(gè)指針(ptr1)和一個(gè)常規(guī) int 變量(ptr2)秧耗。對(duì)于每個(gè)指針變量名备籽,都需要使用一個(gè) *
(36)###
雖然指針指向的數(shù)據(jù)類型的長(zhǎng)度可能不同,但指針變量本身的長(zhǎng)度通常是相同的分井。
(37)###
指針的危險(xiǎn)
極其重要的一點(diǎn)是:在 C++ 中創(chuàng)建指針時(shí)车猬,計(jì)算機(jī)將分配用來存儲(chǔ)地址的內(nèi)存,但不會(huì)分配用來存儲(chǔ)指針?biāo)赶虻臄?shù)據(jù)的內(nèi)存尺锚。為數(shù)據(jù)提供空間是一個(gè)獨(dú)立的步驟珠闰,忽略這一步驟無疑是自找麻煩。
警告:一定要在對(duì)指針應(yīng)用解除引用操作符(*)之前瘫辩,將指針初始化為一個(gè)確定的伏嗜、適當(dāng)?shù)牡刂贰_@是關(guān)于指針的金科玉律伐厌。
(38)###
要將數(shù)字值作為地址來使用承绸,應(yīng)通過強(qiáng)制類型轉(zhuǎn)換將數(shù)字轉(zhuǎn)換為適當(dāng)?shù)牡刂奉愋停?/p>
int* ptr;
ptr =(int*)0xB8000000;
(39)###
只能用 delete 來釋放由 new 分配的內(nèi)存。這并不意味著要使用用于 new 的指針挣轨,而是用于 new 的地址军熏。不過,對(duì)空指針使用 delete 是安全的卷扮。
(40)###
可以修改指針的值荡澎,因?yàn)樗亲兞俊5遣荒苄薷臄?shù)組名的值晤锹,因?yàn)閿?shù)組名是常量摩幔。
(41)###
對(duì)數(shù)組名使用 sizeof 操作符得到的是數(shù)組的長(zhǎng)度,而對(duì)指針應(yīng)用 sizeof 得到的是指針的長(zhǎng)度鞭铆,即使指針指向的是一個(gè)數(shù)組热鞍。
(42)###
絕對(duì)不要對(duì)為被初始化為適當(dāng)?shù)刂返闹羔樈獬谩?/p>
(43)###
在 cout 和多數(shù) C++ 表達(dá)式中,char 數(shù)組名衔彻、指向 char 的指針以及用引號(hào)括起的字符串常量都被解釋為字符串第一個(gè)字符的地址。