c++的分析機(jī)制

曾經(jīng)無(wú)數(shù)次被這個(gè)問(wèn)題困擾:

class A {};

A a();

代碼編譯不過(guò)娘赴。會(huì)提示找不到函數(shù)a的定義....
如果一直這樣也就罷了规哲,可有些時(shí)候,你這樣寫(xiě):

class A
{
    public:
    A(int x) {}
} ;

A a(1); 

代碼居然又可以編譯過(guò)去了诽表。

這樣的問(wèn)題在形式上的不統(tǒng)一往往讓人有種心里上的別扭感覺(jué)唉锌,總覺(jué)得哪里不對(duì)「妥啵可這個(gè)問(wèn)題又太微小袄简,對(duì)程序的功能也好性能也罷,沒(méi)有任何影響泛啸,所以每次遇到這樣的問(wèn)題绿语,稍一修改,也就放過(guò)了候址。后來(lái)慢慢習(xí)慣了吕粹,覺(jué)得是c++語(yǔ)法的不嚴(yán)謹(jǐn)造成的。前一陣翻《effective stl》岗仑,才發(fā)現(xiàn)這個(gè)問(wèn)題的真正原因匹耕。
問(wèn)題的引出是這樣的一段代碼:

ifstream dataFile("ints.data");
list<int> data(istream_iterator<int>(dataFile), istream_iterator<int>());

這段代碼的本意是構(gòu)造一個(gè)list<int>對(duì)象,它可以通過(guò)編譯荠雕,但實(shí)際上并沒(méi)有按照你設(shè)想的來(lái)泌神。

先從最基本的說(shuō)起。
下面的代碼聲明了一個(gè)帶double參數(shù)并返回int的函數(shù):

int f(double d);

下面的代碼做了同樣的事情舞虱。參數(shù)d兩邊的括號(hào)是多余的,會(huì)被忽略:

int f(double (d));

下面的代碼聲明了同樣的函數(shù)母市。只是它省略了參數(shù)名稱(chēng):

int f(double);

現(xiàn)在再看三個(gè)函數(shù)的聲明矾兜。第一個(gè)聲明了一個(gè)函數(shù)g,它的參數(shù)是一個(gè)指向不帶任何參數(shù)的函數(shù)的指針患久,該函數(shù)返回double值:

 int g(double (*pf)());       //g以指向函數(shù)的指針為參數(shù)

有另外一種方式可表名同樣的意思椅寺。唯一的區(qū)別是,pf用非指針的形式來(lái)聲明(這種形式在c和c++中都有效):

 int g(double pf());           //pf 為隱式指針 

跟上面的例子一樣蒋失,參數(shù)名key省略返帕,因此下面是g的第三種聲明,其中參數(shù)名pf被省略了:

 int g(double ());              //省略參數(shù)名

請(qǐng)注意圍繞參數(shù)名的括號(hào)(比如對(duì)f的第二個(gè)聲明中的d)與獨(dú)立的括號(hào)的區(qū)別篙挽。圍繞參數(shù)名的括號(hào)被忽略荆萤,而獨(dú)立的括號(hào)則表名參數(shù)列表的存在,他們說(shuō)明存在一個(gè)函數(shù)的指針參數(shù)。
回到開(kāi)始的問(wèn)題链韭,下面這段代碼:

list<int> data(istream_iterator<int>(dataFile), istream_iterator<int>());

實(shí)際上聲明了一個(gè)函數(shù)data偏竟,其返回值是list<int>,它有兩個(gè)參數(shù):
1 dataFile敞峭,它的類(lèi)型是istream_iterator<int>踊谋。dataFile兩邊的括號(hào)是多余的,會(huì)被忽略旋讹。
2 第二個(gè)參數(shù)沒(méi)有名稱(chēng)殖蚕,它的類(lèi)型是指向不帶參數(shù)的函數(shù)的指針,該函數(shù)返回一個(gè)istream_iterator<int>沉迹。

之所以這樣睦疫,源于c++里的一條普遍規(guī)律:盡可能地將語(yǔ)句解釋為函數(shù)聲明。
因此呢胚股,本文開(kāi)頭的 A a()笼痛,也被解釋為一個(gè)名為a的函數(shù),不帶任何參數(shù)琅拌,返回一個(gè)A對(duì)象缨伊。
當(dāng)知道了這樣的機(jī)制之后,對(duì)一些詭異的問(wèn)題終于可以找到一個(gè)合理的解釋了进宝。

于無(wú)聲處聽(tīng)驚雷刻坊,于細(xì)微處見(jiàn)真知。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末党晋,一起剝皮案震驚了整個(gè)濱河市谭胚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌未玻,老刑警劉巖灾而,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異扳剿,居然都是意外死亡旁趟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)庇绽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锡搜,“玉大人,你說(shuō)我怎么就攤上這事瞧掺「停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵辟狈,是天一觀(guān)的道長(zhǎng)肠缔。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么桩砰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任拓春,我火速辦了婚禮,結(jié)果婚禮上亚隅,老公的妹妹穿的比我還像新娘硼莽。我一直安慰自己,他們只是感情好煮纵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布懂鸵。 她就那樣靜靜地躺著,像睡著了一般行疏。 火紅的嫁衣襯著肌膚如雪匆光。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天酿联,我揣著相機(jī)與錄音终息,去河邊找鬼。 笑死贞让,一個(gè)胖子當(dāng)著我的面吹牛周崭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喳张,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼续镇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了销部?” 一聲冷哼從身側(cè)響起摸航,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舅桩,沒(méi)想到半個(gè)月后酱虎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擂涛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年逢净,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歼指。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖甥雕,靈堂內(nèi)的尸體忽然破棺而出踩身,到底是詐尸還是另有隱情,我是刑警寧澤社露,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布挟阻,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏附鸽。R本人自食惡果不足惜脱拼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坷备。 院中可真熱鬧熄浓,春花似錦、人聲如沸省撑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)竟秫。三九已至娃惯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肥败,已是汗流浹背趾浅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馒稍,地道東北人皿哨。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像筷黔,于是被迫代替她去往敵國(guó)和親往史。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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