C++ 一些值得注意的小細(xì)節(jié)

注意以下細(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)###

使用 newdelete 時(shí),應(yīng)遵守以下規(guī)則:

  1. 不要使用 delete 刪除不是 new 分配的內(nèi)存熊榛;
  2. 不要使用 delete 釋放同一內(nèi)存兩次锚国;
  3. 如果使用 new[] 為數(shù)組分配內(nèi)存,則應(yīng)使用 delete[] 來釋放玄坦;
  4. 如果使用 new[] 為一個(gè)實(shí)體分配內(nèi)存血筑,則應(yīng)使用 delete 來釋放;
  5. 對(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è)字符的地址。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末偷办,一起剝皮案震驚了整個(gè)濱河市艰额,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌椒涯,老刑警劉巖柄沮,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡祖搓,警方通過查閱死者的電腦和手機(jī)狱意,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拯欧,“玉大人详囤,你說我怎么就攤上這事「渥鳎” “怎么了藏姐?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)该贾。 經(jīng)常有香客問我羔杨,道長(zhǎng),這世上最難降的妖魔是什么杨蛋? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任兜材,我火速辦了婚禮,結(jié)果婚禮上逞力,老公的妹妹穿的比我還像新娘曙寡。我一直安慰自己,他們只是感情好掏击,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布卵皂。 她就那樣靜靜地躺著,像睡著了一般砚亭。 火紅的嫁衣襯著肌膚如雪灯变。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天捅膘,我揣著相機(jī)與錄音添祸,去河邊找鬼。 笑死寻仗,一個(gè)胖子當(dāng)著我的面吹牛刃泌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播署尤,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼耙替,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了曹体?” 一聲冷哼從身側(cè)響起俗扇,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎箕别,沒想到半個(gè)月后铜幽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滞谢,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年除抛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狮杨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡到忽,死狀恐怖橄教,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绘趋,我是刑警寧澤颤陶,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站陷遮,受9級(jí)特大地震影響滓走,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜帽馋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一搅方、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绽族,春花似錦姨涡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至检诗,卻和暖如春匈仗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逢慌。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工悠轩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人攻泼。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓火架,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親忙菠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子何鸡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一牛欢。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu)骡男; ...
    朱森閱讀 3,430評(píng)論 3 44
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評(píng)論 1 51
  • 重新系統(tǒng)學(xué)習(xí)下C++;但是還是少了好多知識(shí)點(diǎn)氢惋;socket洞翩;unix;stl焰望;boost等骚亿; C++ 教程 | 菜...
    kakukeme閱讀 19,823評(píng)論 0 50
  • 一、小鹿般活潑的蘇菲&甜膩的浪漫 這里參考一下里面的小屋子: 雖然只是租的一件小屋子熊赖,但是布置得非常美好来屠,粉紅的地...
    修一云閱讀 1,214評(píng)論 0 1
  • 百無聊賴的深夜俱笛, 紫騰半躺在床上, 怎么也睡不著传趾。 于是迎膜,拿起擱在一邊充電的手機(jī),點(diǎn)開社交軟件浆兰,熟練的戳開“附近的...
    把地球揍成方的閱讀 398評(píng)論 0 2