引用使用操作符.但是它們似乎有相同的功能指針與引用都是讓你間接引用其他對象你如何決定在什么時候使用指針在什么時候使用引用呢首先要認識到在任何情況下都不能用指向空值的引用一個引">
歡迎來到天天文庫
瀏覽記錄
ID:34156151
大?。?34.64 KB
頁數(shù):150頁
時間:2019-03-03
《More Effective C (1).pdf》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在學術(shù)論文-天天文庫。
1、條款一指針與引用的區(qū)別指針與引用看上去完全不同指針用操作符*和->引用使用操作符.但是它們似乎有相同的功能指針與引用都是讓你間接引用其他對象你如何決定在什么時候使用指針在什么時候使用引用呢首先要認識到在任何情況下都不能用指向空值的引用一個引用必須總是指向某些對象因此如果你使用一個變量并讓它指向一個對象但是該變量在某些時候也可能不指向任何對象這時你應(yīng)該把變量聲明為指針因為這樣你可以賦空值給該變量相反如果變量肯定指向一個對象例如你的設(shè)計不允許變量為空這時你就可以把變量聲明為引用但是請等一下你懷疑地問這樣的代碼會產(chǎn)生什么樣的后果char*pc=0;//設(shè)置指針為空值char&rc=*pc;//讓引用
2、指向空值這是非常有害的毫無疑問結(jié)果將是不確定的編譯器能產(chǎn)生一些輸出導(dǎo)致任何事情都有可能發(fā)生應(yīng)該躲開寫出這樣代碼的人除非他們同意改正錯誤如果你擔心這樣的代碼會出現(xiàn)在你的軟件里那么你最好完全避免使用引用要不然就去讓更優(yōu)秀的程序員去做我們以后將忽略一個引用指向空值的可能性因為引用肯定會指向一個對象在C里引用應(yīng)被初始化string&rs;//錯誤引用必須被初始化strings("xyzzy");string&rs=s;//正確rs指向s指針沒有這樣的限制string*ps;//未初始化的指針//合法但危險不存在指向空值的引用這個事實意味著使用引用的代碼效率比使用指針的要高因為在使用引用之前不需要測試它
3、的合法性voidprintDouble(constdouble&rd){cout<4、rs仍舊引用s1,//但是s1的值現(xiàn)在是//"Clancy"ps=&s2;//ps現(xiàn)在指向s2;//s1沒有改變總的來說在以下情況下你應(yīng)該使用指針一是你考慮到存在不指向任何對象的可能在這種情況下你能夠設(shè)置指針為空二是你需要能夠在不同的時刻指向不同的對象在這種情況下你能改變指針的指向如果總是指向一個對象并且一旦指向一個對象后就不會改變指向那么你應(yīng)該使用引用還有一種情況就是當你重載某個操作符時你應(yīng)該使用引用最普通的例子是操作符[]這個操作符典型的用法是返回一個目標對象其能被賦值vectorv(10);//建立整形向量vector大小為10;//向量是一個在標準C庫中的一個模板(見條款355、)v[5]=10;//這個被賦值的目標對象就是操作符[]返回的值如果操作符[]返回一個指針那么后一個語句就得這樣寫*v[5]=10;但是這樣會使得v看上去象是一個向量指針因此你會選擇讓操作符返回一個引用這有一個有趣的例外參見條款30當你知道你必須指向一個對象并且不想改變其指向時或者在重載操作符并為防止不必要的語義誤解時你不應(yīng)該使用指針而在除此之外的其他情況下則應(yīng)使用指針條款2盡量使用C++風格的類型轉(zhuǎn)換仔細想想地位卑賤的類型轉(zhuǎn)換功能cast其在程序設(shè)計中的地位就象goto語句一樣令人鄙視但是它還不是無法令人忍受因為當在某些緊要的關(guān)頭類型轉(zhuǎn)換還是必需的這時它是一個必需品不過C風格的類型轉(zhuǎn)換并不代6、表所有的類型轉(zhuǎn)換功能一來它們過于粗魯能允許你在任何類型之間進行轉(zhuǎn)換不過如果要進行更精確的類型轉(zhuǎn)換這會是一個優(yōu)點在這些類型轉(zhuǎn)換中存在著巨大的不同例如把一個指向const對象的指針pointer-to-const-object轉(zhuǎn)換成指向非const對象的指針pointer-to-non-const-object(即一個僅僅去除cosnt的類型轉(zhuǎn)換)把一個指向基類的指針轉(zhuǎn)換成指向子類的指針即完全改變對象類型傳統(tǒng)的C風格的類型轉(zhuǎn)換不對上述兩種轉(zhuǎn)換進行區(qū)分這一點也不令人驚訝因為C風格的類型轉(zhuǎn)換是為C語言設(shè)計的而不是為C++語言設(shè)計的二來C風格的類型轉(zhuǎn)換在程序語句中難以識別在語法上類型轉(zhuǎn)換由圓括號和標識符7、組成而這些可以用在C中的任何地方這使得回答象這樣一個最基本的有關(guān)類型轉(zhuǎn)換的問題變得很困難在這個程序中是否使用了類型轉(zhuǎn)換這是因為人工閱讀很可能忽略了類型轉(zhuǎn)換的語句而利用象grep的工具程序也不能從語句構(gòu)成上區(qū)分出它們來C++通過引進四個新的類型轉(zhuǎn)換操作符克服了C風格類型轉(zhuǎn)換的缺點這四個操作符是,static_cast,const_cast,dynamic_cast,和reinterpret_cast
4、rs仍舊引用s1,//但是s1的值現(xiàn)在是//"Clancy"ps=&s2;//ps現(xiàn)在指向s2;//s1沒有改變總的來說在以下情況下你應(yīng)該使用指針一是你考慮到存在不指向任何對象的可能在這種情況下你能夠設(shè)置指針為空二是你需要能夠在不同的時刻指向不同的對象在這種情況下你能改變指針的指向如果總是指向一個對象并且一旦指向一個對象后就不會改變指向那么你應(yīng)該使用引用還有一種情況就是當你重載某個操作符時你應(yīng)該使用引用最普通的例子是操作符[]這個操作符典型的用法是返回一個目標對象其能被賦值vectorv(10);//建立整形向量vector大小為10;//向量是一個在標準C庫中的一個模板(見條款35
5、)v[5]=10;//這個被賦值的目標對象就是操作符[]返回的值如果操作符[]返回一個指針那么后一個語句就得這樣寫*v[5]=10;但是這樣會使得v看上去象是一個向量指針因此你會選擇讓操作符返回一個引用這有一個有趣的例外參見條款30當你知道你必須指向一個對象并且不想改變其指向時或者在重載操作符并為防止不必要的語義誤解時你不應(yīng)該使用指針而在除此之外的其他情況下則應(yīng)使用指針條款2盡量使用C++風格的類型轉(zhuǎn)換仔細想想地位卑賤的類型轉(zhuǎn)換功能cast其在程序設(shè)計中的地位就象goto語句一樣令人鄙視但是它還不是無法令人忍受因為當在某些緊要的關(guān)頭類型轉(zhuǎn)換還是必需的這時它是一個必需品不過C風格的類型轉(zhuǎn)換并不代
6、表所有的類型轉(zhuǎn)換功能一來它們過于粗魯能允許你在任何類型之間進行轉(zhuǎn)換不過如果要進行更精確的類型轉(zhuǎn)換這會是一個優(yōu)點在這些類型轉(zhuǎn)換中存在著巨大的不同例如把一個指向const對象的指針pointer-to-const-object轉(zhuǎn)換成指向非const對象的指針pointer-to-non-const-object(即一個僅僅去除cosnt的類型轉(zhuǎn)換)把一個指向基類的指針轉(zhuǎn)換成指向子類的指針即完全改變對象類型傳統(tǒng)的C風格的類型轉(zhuǎn)換不對上述兩種轉(zhuǎn)換進行區(qū)分這一點也不令人驚訝因為C風格的類型轉(zhuǎn)換是為C語言設(shè)計的而不是為C++語言設(shè)計的二來C風格的類型轉(zhuǎn)換在程序語句中難以識別在語法上類型轉(zhuǎn)換由圓括號和標識符
7、組成而這些可以用在C中的任何地方這使得回答象這樣一個最基本的有關(guān)類型轉(zhuǎn)換的問題變得很困難在這個程序中是否使用了類型轉(zhuǎn)換這是因為人工閱讀很可能忽略了類型轉(zhuǎn)換的語句而利用象grep的工具程序也不能從語句構(gòu)成上區(qū)分出它們來C++通過引進四個新的類型轉(zhuǎn)換操作符克服了C風格類型轉(zhuǎn)換的缺點這四個操作符是,static_cast,const_cast,dynamic_cast,和reinterpret_cast
此文檔下載收益歸作者所有