OnTheWay2012
埋葬昨天的我,迎來(lái)重生的我!
C++博客
首頁(yè)
新文章
新隨筆
聚合
管理
posts - 15, comments - 89, trackbacks - 0
Why I am so stupid?
周五晚上的時(shí)候在看Boost的源碼的時(shí)候發(fā)現(xiàn)了shared_ptr有一個(gè)很好用的功能,該功能的代碼示例如下:
boost::shared_ptr
<
int
>
pInt(
new
int
(
0
));
if
(pInt)
.
.
.
從上述代碼中可以看出,shared_ptr能夠模擬內(nèi)置指針的功能。我很好奇shared_ptr是如何實(shí)現(xiàn)的這個(gè)功能,然后就找到了shared_ptr的源代碼看了看,結(jié)果發(fā)現(xiàn)在VC9的編譯環(huán)境下,shared_ptr不是采用重載bool操作符來(lái)實(shí)現(xiàn)的,為什么不采用重載bool操作符來(lái)實(shí)現(xiàn)呢?用一下代碼說(shuō)明:
//
如果采用重載bool操作符的形式來(lái)實(shí)現(xiàn)的話,會(huì)存在以下的一些問(wèn)題,這些問(wèn)題可以總結(jié)為“在不該使用的地方使用了隱含的類型轉(zhuǎn)換”
shared_ptr
<
int
>
pInt(
new
int
(
0
));
int
n
=
pInt;
//
如果采用重載布爾的方法,這句明顯應(yīng)該是錯(cuò)誤的語(yǔ)句就會(huì)編譯通過(guò)
那么,Boost采用的方法是什么方法呢?Boost所采用的方法的是:
typedef T
*
(this_type::
*
unspecified_bool_type)()
const
; //Ln 1
operator
unspecified_bool_type()
const
//
never throws Ln2
{
return
px
==
0
?
0
:
&
this_type::
get
; //Ln3
}
當(dāng)?shù)谝淮慰吹竭@三行代碼的時(shí)候,我被震驚了!
我看了半天都不知道這三行代碼到底是什么意思!周五晚上我用baidu,google搜了半天,終于發(fā)現(xiàn)Ln1不就是自己以前用過(guò)的指向成員函數(shù)的指針嗎?!我真蠢,看了半天還是沒(méi)看明白。那么一個(gè)問(wèn)題解決了,另外一個(gè)更無(wú)法理解的問(wèn)題出現(xiàn)了:為什么在寫(xiě)下
if
(pInt)
Ln2和Ln3所定義的函數(shù)會(huì)被調(diào)用!!!我找呀找,還是不明白!我問(wèn)google呀,還是不明白!我問(wèn)baidu呀,還是不明白!
這個(gè)問(wèn)題,折磨了我兩天,今天晚上的時(shí)候,有打開(kāi)VC9,有一次看到這段代碼,突然就明白了。
在Ln1定義了一個(gè)類型(指向成員函數(shù)指針);
在Ln2和Ln3定義了一個(gè)函數(shù),該函數(shù)是一個(gè)類型轉(zhuǎn)換函數(shù),把shared_ptr,轉(zhuǎn)換為一個(gè)指向成員函數(shù)的指針。
舉一個(gè)簡(jiǎn)單的類型轉(zhuǎn)換函數(shù)的例子:
class
A
{
public
:
operator
int
()
{
return
0
;
}
}
void
Test(
int
a)
{
cout
<<
a
<<
endl;
}
void
main()
{
A a;
Test(a);
//
這里調(diào)用的是類型轉(zhuǎn)換函數(shù)
}
至于為什么這種方法比重載bool好,是因?yàn)橹赶虺蓡T函數(shù)的指針很少能夠被編譯器用來(lái)做隱含的類型轉(zhuǎn)換。
現(xiàn)在終于明白了上面的代碼。雖然代碼里面的技術(shù)我都用過(guò),但是當(dāng)時(shí)為什么沒(méi)有像明白呢?!
我分析原因有兩條:
1. 最近好久沒(méi)有寫(xiě)過(guò)代碼,生疏了。這是次要原因。
2.對(duì)C++缺乏了解。這是主要原因。
在解決這個(gè)問(wèn)題的時(shí)候用google搜到了一個(gè)老外發(fā)的貼,大致內(nèi)容如下:
每當(dāng)我覺(jué)得對(duì)C++有所了解或者掌握它的秘密的時(shí)候,我總發(fā)現(xiàn)一些改變我看發(fā)的事情。
....
另外一個(gè)老外回答的時(shí)候用了一句話。I know the feelings.
現(xiàn)在,我終于也有第一個(gè)老外的感覺(jué)了。
posted on 2010-12-05 18:56
OnTheWay
閱讀(2309)
評(píng)論(4)
編輯
收藏
引用
所屬分類:
個(gè)人感悟
FeedBack:
#
re: Why I am so stupid?
2010-12-05 23:19 |
right
最近不知道怎么搞的,如果有人跟我研究這些C++的高級(jí)語(yǔ)法高級(jí)特性時(shí),我總是有種想潑冷水的沖動(dòng)。不過(guò)想想自己也是這么走過(guò)來(lái)的,也就逐漸釋然了。
回復(fù)
更多評(píng)論
#
re: Why I am so stupid?
2010-12-06 08:44 |
Sosi
Boost 乃一大寶藏。。。
回復(fù)
更多評(píng)論
#
re: Why I am so stupid?
2010-12-06 10:27 |
空明流轉(zhuǎn)
寫(xiě)boost的人是挖空心思從Spec里面想摳出點(diǎn)東西拿來(lái)用。
那個(gè)令人發(fā)指的typeof更是連編譯器bug都用上了。
你要是挖空心思,其實(shí)也是可以的。。。
回復(fù)
更多評(píng)論
#
re: Why I am so stupid?
2010-12-13 17:53 |
crossgate
不覺(jué)得這個(gè)是C++的高級(jí)語(yǔ)法特性,覺(jué)得是比較常規(guī)的,實(shí)用的特性。
如果if判斷的時(shí)候,統(tǒng)一用 if (!pInt),會(huì)更合適。重載!操作符,會(huì)更容易,也更一般化一些。
回復(fù)
更多評(píng)論
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
【推薦】100%開(kāi)源!大型工業(yè)跨平臺(tái)軟件C++源碼提供,建模,組態(tài)!
相關(guān)文章:
對(duì)“隨筆”所寫(xiě)的一篇文章《鏈表實(shí)驗(yàn)》的一點(diǎn)看法
一種基于引用計(jì)數(shù)機(jī)制的智能指針實(shí)現(xiàn)
Why I am so stupid?
令人氣憤的現(xiàn)象
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問(wèn)
Chat2DB
管理
<
2010年12月
>
日
一
二
三
四
五
六
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
常用鏈接
我的隨筆
我的評(píng)論
我參與的隨筆
留言簿
(4)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類
C、C++(2)
操作系統(tǒng)(Windows、Linux、Unix)
讀書(shū)筆記
個(gè)人感悟(4)
面經(jīng) (4)
軟件設(shè)計(jì)(1)
數(shù)據(jù)庫(kù)
算法(3)
線程、進(jìn)程
英語(yǔ)
雜項(xiàng)
轉(zhuǎn)載
隨筆檔案
2011年1月 (1)
2010年12月 (2)
2010年11月 (1)
2010年6月 (1)
2010年5月 (6)
2010年4月 (1)
2010年3月 (3)
友情連接
搜索
最新評(píng)論
1.?re: 對(duì)“隨筆”所寫(xiě)的一篇文章《鏈表實(shí)驗(yàn)》的一點(diǎn)看法
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--陳梓瀚(vczh)
2.?re: 對(duì)“隨筆”所寫(xiě)的一篇文章《鏈表實(shí)驗(yàn)》的一點(diǎn)看法
謝謝咯,呵呵。我喜歡這代碼風(fēng)格,向你學(xué)習(xí)
--あ維wêiセ
3.?re: 一種基于引用計(jì)數(shù)機(jī)制的智能指針實(shí)現(xiàn)
把A *p = new A();這句換成A p;不行嗎?
--叫我老王吧
4.?re: 一種基于引用計(jì)數(shù)機(jī)制的智能指針實(shí)現(xiàn)
Boost 里面有,在C++ TR1 里面也已經(jīng)有這種指針(就是來(lái)自Boost)
--Phuehvk
5.?re: 一種基于引用計(jì)數(shù)機(jī)制的智能指針實(shí)現(xiàn)[未登錄](méi)
比較討厭這種引用計(jì)數(shù)指針的使用,一旦使用就意味這在所有的函數(shù)參數(shù)中必須使用指針引用或者值拷貝,一旦某些函數(shù)要求用裸指針,就可能引發(fā)問(wèn)題。
--hdqqq
閱讀排行榜
1.?一道面試題(求一個(gè)unsigned int 數(shù)的二進(jìn)制表示中有多少個(gè)1?)(6160)
2.?一種線程安全的單例模式實(shí)現(xiàn)方式(5749)
3.?一種基于引用計(jì)數(shù)機(jī)制的智能指針實(shí)現(xiàn)(2920)
4.?不要把類的外衣脫下來(lái),讓類的美麗消失于無(wú)形(2782)
5.?幾道面試題,有的做出來(lái)了,有的不會(huì)做,請(qǐng)大家指教(2620)
評(píng)論排行榜
1.?一道面試題(求一個(gè)unsigned int 數(shù)的二進(jìn)制表示中有多少個(gè)1?)(15)
2.?一種線程安全的單例模式實(shí)現(xiàn)方式(15)
3.?幾道面試題,有的做出來(lái)了,有的不會(huì)做,請(qǐng)大家指教(14)
4.?令人氣憤的現(xiàn)象(13)
5.?不要把類的外衣脫下來(lái),讓類的美麗消失于無(wú)形(9)
Copyright ©2025 OnTheWay Powered By
博客園
模板提供:
滬江博客
久久精品国内一区二区三区
|
久久香蕉国产线看观看精品yw
|
九九精品99久久久香蕉
|
2019久久久高清456
|
国产精品久久久久久搜索
|
久久精品国产精品亚洲精品
|
午夜精品久久久久久久久
|
久久人人超碰精品CAOPOREN
|
久久丝袜精品中文字幕
|
久久99精品国产麻豆婷婷
|
国产高潮国产高潮久久久91
|
亚洲乱亚洲乱淫久久
|
久久99精品国产麻豆宅宅
|
久久精品国产影库免费看
|
国产日韩久久免费影院
|
国产福利电影一区二区三区,免费久久久久久久精
|
亚洲国产成人久久综合野外
|
人妻系列无码专区久久五月天
|
久久亚洲中文字幕精品一区
|
日韩AV毛片精品久久久
|
99久久综合国产精品免费
|
国产成年无码久久久免费
|
波多野结衣AV无码久久一区
|
久久亚洲精品人成综合网
|
久久er热视频在这里精品
|
品成人欧美大片久久国产欧美
|
日本亚洲色大成网站WWW久久
|
久久久久亚洲AV片无码下载蜜桃
|
色综合久久综合中文综合网
|
国产精品久久久久久一区二区三区
|
热re99久久精品国产99热
|
午夜精品久久久内射近拍高清
|
久久国产欧美日韩精品
|
久久99国产精品久久99
|
久久免费视频6
|
国产午夜精品久久久久免费视
|
狠狠精品干练久久久无码中文字幕
|
精品熟女少妇av免费久久
|
久久er国产精品免费观看8
|
久久精品国产亚洲AV忘忧草18
|
好属妞这里只有精品久久
|