欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
你最需要注意的11條要點(diǎn)for C++
標  題: 你最需要注意的11條要點(diǎn)for C++
發(fā)信站: 兩全其美網(wǎng) (Thu Jun  8 21:38:38 2006), 本站(lqqm.net)


關(guān)鍵字   C++,指針,類(lèi),語(yǔ)法,庫   
出處     http://www.codeproject.com/   
   

  下面的這些要點(diǎn)是對所有的C++程序員都適用的。我之所以說(shuō)它們是最重要  
的,是因為這些要點(diǎn)中提到的是你通常在C++書(shū)中或網(wǎng)站上無(wú)法找到的。如:指向  
成員的指針,這是許多資料中都不愿提到的地方,也是經(jīng)常出錯的地方,甚至是對  
一些高級的C++程序員也是如此。  
  這里的要點(diǎn)不僅僅是解釋怎樣寫(xiě)出更好的代碼,更多的是展現出語(yǔ)言規則里面  
的東西。很顯然,它們對C++程序員來(lái)說(shuō)是永久的好資料。我相信這一篇文章會(huì )使  
你收獲不小。  

  首先,我把一些由不同層次的C++程序員經(jīng)常問(wèn)的問(wèn)題歸到一起。我驚奇的發(fā)  
現有很多是有經(jīng)驗的程序員都還沒(méi)意識到 .h 符號是否還應該出現在標準頭文件  
中。  


要點(diǎn)1: <iostream.h> 還是 <iostream>?  

  很多C++程序員還在使用<iostream.h>而不是用更新的標準的<iostream>庫。  
這兩者都有什么不同呢?首先,5年前我們就開(kāi)始反對把.h符號繼續用在標準的頭  
文件中。繼續使用過(guò)時(shí)的規則可不是個(gè)好的方法。從功能性的角度來(lái)講,  
<iostream>包含了一系列模板化的I/O類(lèi),相反地<iostream.h>只僅僅是支持字符  
流。另外,輸入輸出流的C++標準規范接口在一些微妙的細節上都已改進(jìn),因此,  
<iostream>和<iostream.h>在接口和執行上都是不同的。最后,<iostream>的各組  
成都是以STL的形式聲明的,然而<iostream.h>的各組成都是聲明成全局型的。  

  因為這些實(shí)質(zhì)上的不同,你不能在一個(gè)程序中混淆使用這兩個(gè)庫。做為一種習  
慣,在新的代碼中一般使用<iostream>,但如果你處理的是過(guò)去編寫(xiě)的代碼,為了  
繼承可以用繼續用<iostream.h>舊保持代碼的一致性?! ? 


要點(diǎn)2:用引用傳遞參數時(shí)應注意的地方   

  在用引用傳遞參數時(shí),最好把引用聲明為const類(lèi)型。這樣做的好處是:告訴  
程序不能修改這個(gè)參數。在下面的這個(gè)例子中函數f()就是傳遞的引用:  
  
void f(const int & i);  
int main()  
{  
 f(2); /* OK */  
}  
  
  這個(gè)程序傳遞一個(gè)參數2給f()。在運行時(shí),C++創(chuàng )建一個(gè)值為2的int類(lèi)型的臨  
時(shí)變量,并傳遞它的引用給f().這個(gè)臨時(shí)變量和它的引用從f()被調用開(kāi)始被創(chuàng )建  
并存在直到函數返回。返回時(shí),就被馬上刪除。注意,如果我們不在引用前加上  
const限定詞,則函數f()可能會(huì )更改它參數的值,更可能會(huì )使程序產(chǎn)生意想不到的  
行為。所以,別忘了const。  

  這個(gè)要點(diǎn)也適用于用戶(hù)定義的對象。你可以給臨時(shí)對象也加上引用如果是  
const類(lèi)型:  
  
struct A{};  
void f(const A& a);  
int main()  
{  
 f(A()); // OK,傳遞的是一個(gè)臨時(shí)A的const引用  
}   
  

要點(diǎn)3:“逗號分離”表達形式  

 “逗號分離”表達形式是從C繼承來(lái)的,使用在for-和while-循環(huán)中。當然,這  
條語(yǔ)法規則被認為是不直觀(guān)的。首先,我們來(lái)看看什么是“逗號分離”表達形式。  

  一個(gè)表達式由一個(gè)或多個(gè)其它表達式構成,由逗號分開(kāi),如:  
  
 if(++x, --y, cin.good()) //三個(gè)表達式   
  這個(gè)if條件包含了三個(gè)由逗號分離的表達式。C++會(huì )計算每個(gè)表達式,但完整  
的“逗號分離”表達式的結果是最右邊表達式的值。因此,僅當cin.good()返回  
true時(shí),if條件的值才是true。下面是另一個(gè)例子:   
int j=10;   
int i=0;  
while( ++i, --j)  
{  
 //直到j(luò )=0時(shí),循環(huán)結束,在循環(huán)時(shí),i不斷自加  
}   

要點(diǎn)4,使用全局對象的構造函數在程序啟動(dòng)前調用函數  

  有一些應用程序需要在主程序啟動(dòng)前調用其它函數。如:轉態(tài)過(guò)程函數、登記  
功能函數都是必須在實(shí)際程序運行前被調用的。最簡(jiǎn)單的辦法是通過(guò)一個(gè)全局對象  
的構造函數來(lái)調用這些函數。因為全局對象都是在主程序開(kāi)始前被構造,這些函數  
都將會(huì )在main()之前返回結果。如:   
class Logger  
{  

 public:  
 Logger()   
  {   
   activate_log();//譯者注:在構造函數中調用你需要先運行的函數  
  }  
};  
Logger log; //一個(gè)全局實(shí)例  

int main()  
{  
 record * prec=read_log();//譯者注:讀取log文件數據  
 //.. 程序代碼  
}  

  
  全局對象log在main()運行之前被構造,log調用了函數activate_log()。從  
而,當main()開(kāi)始執行時(shí),它就可以從log文件中讀取數據。  


  毫無(wú)疑問(wèn)地,在C++編程中內存管理是最復雜和最容易出現bug的地方。直接訪(fǎng)  
問(wèn)原始內存、動(dòng)態(tài)分配存儲和最大限度的發(fā)揮C++指令效率,都使你必須盡力避免  

有關(guān)內存的bug。  
    
要點(diǎn)5:避免使用復雜構造的指向函數的指針  

  指向函數的指針是C++中可讀性最差的語(yǔ)法之一。你能告訴我下面語(yǔ)句的意思  
嗎?   
  
void (*p[10]) (void (*)());   
  P是一個(gè)“由10個(gè)指針構成的指向一個(gè)返回void類(lèi)型且指向另一個(gè)無(wú)返回和無(wú)  
運算的函數的數組”。這個(gè)麻煩的語(yǔ)法真是讓人難以辨認,不是嗎?你其實(shí)可以簡(jiǎn)  
單的通過(guò)typedef來(lái)聲明相當于上面語(yǔ)句的函數。首先,使用typedef聲明“指向一  
個(gè)無(wú)返回和無(wú)運算的函數的指針”:   
typedef void (*pfv)();   
  接著(zhù),聲明“另一個(gè)指向無(wú)返回且使用pfv的函數指針”:   
typedef void (*pf_taking_pfv) (pfv);   
  現在,聲明一個(gè)由10個(gè)上面這樣的指針構成的數組:   
pf_taking_pfv p[10];   
  與void (*p[10]) (void (*)())達到同樣效果。但這樣是不是更具有可讀性  
了!   

要點(diǎn)6:指向成員的指針  

  一個(gè)類(lèi)有兩種基本的成員:函數成員和數據成員。同樣的,指向成員的指針也  
有兩種:指向函數成員的指針和指向數據成員的指針。后則其實(shí)并不常用,因為類(lèi)  
一般是不含有公共數據成員的,僅當用在繼承用C寫(xiě)的代碼時(shí)協(xié)調結構(struct)和  
類(lèi)(class)時(shí)才會(huì )用到。  

  指向成員的指針是C++語(yǔ)法中最難以理解的構造之一,但是這也是一個(gè)C++最強  
大的特性。它可以讓你調用一個(gè)類(lèi)的函數成員而不必知道這個(gè)函數的名字。這一個(gè)  
非常敏捷的調用工具。同樣的,你也可以通過(guò)使用指向數據成員的指針來(lái)檢查并改  
變這個(gè)數據而不必知道它的成員名字。  

  指向數據成員的指針  

  盡管剛開(kāi)始時(shí),指向成員的指針的語(yǔ)法會(huì )使你有一點(diǎn)點(diǎn)的迷惑,但你不久會(huì )發(fā)  
現它其實(shí)同普通的指針差不多,只不過(guò)是*號的前面多了::符號和類(lèi)的名字,例:  
定義一個(gè)指向int型的指針:  

  
int * pi;    
  定義一個(gè)指向為int型的類(lèi)的數據成員:   
int A::*pmi; //pmi是指向類(lèi)A的一個(gè)int型的成員   
  你可以這樣初始化它:   
class A  
{  
 public:  
 int num;  
 int x;  
};  
int A::*pmi = & A::num;    
  上面的代碼是聲明一個(gè)指向類(lèi)A的一個(gè)int型的num成員并將它初始化為這個(gè)num  
成員的地址.通過(guò)在pmi前面加上*你就可以使用和更改類(lèi)A的num成員的值:   
A a1, a2;  
int n=a1.*pmi; //把a1.num賦值給n  
a1.*pmi=5; // 把5賦值給a1.num   
a2.*pmi=6; // 把6賦值給6a2.num   
  
  如果你定義了一個(gè)指向類(lèi)A的指針,那么上面的操作你必須用 ->*操作符代  
替:   
A * pa=new A;  
int n=pa->*pmi;   
pa->*pmi=5;    

  指向函數成員的指針  

  它由函數成員所返回的數據類(lèi)型構成,類(lèi)名后跟上::符號、指針名和函數的參  
數列表。舉個(gè)例子:一個(gè)指向類(lèi)A的函數成員(該函數返回int類(lèi)型)的指針:  
  
class A   
{  
 public:  
 int func ();   
};   
int (A::*pmf) ();   
  
  上面的定義也就是說(shuō)pmf是一個(gè)指向類(lèi)A的函數成員func()的指針.實(shí)際上,這  
個(gè)指針和一個(gè)普通的指向函數的指針沒(méi)什么不同,只是它包含了類(lèi)的名字和::符  
號。你可以在在任何使用*pmf的地方調用這個(gè)函數   
func():  
pmf=&A::func;  
A a;  
(a.*pmf)(); //調用a.func()   
  如果你先定義了一個(gè)指向對象的指針,那么上面的操作要用->*代替:   
A *pa=&a;  
(pa->*pmf)(); //調用pa->func()   
  指向函數成員的指針要考慮多態(tài)性。所以,當你通過(guò)指針調用一個(gè)虛函數成員  
時(shí),這個(gè)調用將會(huì )被動(dòng)態(tài)回收。另一個(gè)需要注意的地方,你不能取一個(gè)類(lèi)的構造函  
數和析構函數的地址。  

要點(diǎn)7、避免產(chǎn)生內存碎片  


  經(jīng)常會(huì )有這樣的情況:你的應用程序每運行一次時(shí)就因為程序自身缺陷而產(chǎn)生  
內存漏洞而泄漏內存,而你又在周期性地重復著(zhù)你的程序,結果可想而知,它也會(huì )  
使系統崩潰。但怎樣做才能預防呢?首先,盡量少使用動(dòng)態(tài)內存。在大多數情況  
下,你可能使用靜態(tài)或自動(dòng)存儲或者是STL容器。第二,盡量分配大塊的內存而不  
是一次只分配少量?jì)却?。舉個(gè)例子:一次分配一個(gè)數組實(shí)例所需的內存,而不是一  
次只分配一個(gè)數組元素的內存。  

要點(diǎn)8、是delete還是delete[]  

  在程序員中有個(gè)荒誕的說(shuō)法:使用delete來(lái)代替delete[]刪除數組類(lèi)型時(shí)是可  
以的!  
  舉個(gè)例子吧:  
  
 int *p=new int[10];  
 delete p; //錯誤,應該是:delete[] p   
  上面的程序是完全錯誤的。事實(shí)上,在一個(gè)平臺上使用delete代替delete[]的  
應用程序也許不會(huì )造成系統崩潰,但那純粹是運氣。你不能保證你的應用程序是不  
是會(huì )在另一個(gè)編譯器上編譯,在另一個(gè)平臺上運行,所以還是請使用delete[]。  

要點(diǎn)9、優(yōu)化成員的排列  

  一個(gè)類(lèi)的大小可以被下面的方式改變:  
  
struct A  

{  
 bool a;  
 int b;  
 bool c;  
}; //sizeof (A) == 12  
  
  在我的電腦上sizeof (A) 等于12。這個(gè)結果可能會(huì )讓你吃驚,因為A的成員總  
數是6個(gè)字節:1+4+1個(gè)字節。那另6字節是哪兒來(lái)的?編譯器在每個(gè)bool成員后面  
都插入了3個(gè)填充字節以保證每個(gè)成員都是按4字節排列,以便分界。你可以減少A  
的大小,通過(guò)以下方式:  
  
struct B  
{  
 bool a;  
 bool c;  
 int b;  
}; // sizeof (B) == 8  
  
  這一次,編譯器只在成員c后插入了2個(gè)字節。因為b占了4個(gè)字節,所以就很自  
然地把它當作一個(gè)字的形式排列,而a和c的大小1+1=2,再加上2個(gè)字節就剛好按兩  
個(gè)字的形式排列B。    

要點(diǎn)10、為什么繼承一個(gè)沒(méi)有虛析構函數的類(lèi)是危險的?  

  一個(gè)沒(méi)有虛析構函數的類(lèi)意味著(zhù)不能做為一個(gè)基類(lèi)。如std::string,   
std::complex, 和 std::vector 都是這樣的。為什么繼承一個(gè)沒(méi)有虛析構函數的  
類(lèi)是危險的?當你公有繼承創(chuàng )建一個(gè)從基類(lèi)繼承的相關(guān)類(lèi)時(shí),指向新類(lèi)對象中的指  
針和引用實(shí)際上都指向了起源的對象。因為析構函數不是虛函數,所以當你delete  
一個(gè)這樣的類(lèi)時(shí),C++就不會(huì )調用析構函數鏈。舉個(gè)例子說(shuō)明:  
  
class A  
{  
 public:  
 ~A() // 不是虛函數  
 {  
 // ...  
 }  
};   
class B: public A //錯; A沒(méi)有虛析構函數  
{  
 public:  
 ~B()  
 {  
 // ...  
 }  
};  

int main()  
{  
 A * p = new B; //看上去是對的  
 delete p; //錯,B的析構函沒(méi)有被調用  
}  


  

要點(diǎn)11、以友元類(lèi)聲明嵌套的類(lèi)  

  當你以友元類(lèi)聲明一個(gè)嵌套的類(lèi)時(shí),把友元聲明放在嵌套類(lèi)聲明的后面,而不  
前面。  
  
class A   
{  
 private:  
 int i;  
 public:  
 class B //嵌套類(lèi)聲明在前  
 {  
  public:  
  B(A & a) { a.i=0;};   
 };  
 friend class B;//友元類(lèi)聲明  
};  
  
  如果你把友元類(lèi)聲明放在聲明嵌套類(lèi)的前面,編譯器將拋棄友元類(lèi)后的其它聲  
明。    
  
from csdn  
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
structure
C++中將二維數組(靜態(tài)的和動(dòng)態(tài)的)作為函數的參數傳遞
來(lái)一道 C 面試題試試手?
有C基礎,如何快速過(guò)度到C ?
C++知識點(diǎn)梳理
學(xué)習C++
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久