構(gòu)造函數(shù)的前世今生

前言:當我們在討論一個新名詞、一個新概念或一個新理論新思想時,其實我們更應(yīng)該先考慮一下這個新事物是從哪里產(chǎn)生的?是為了解決什么問題而提出來的?或者說沒有這一新理論,原來的舊理論哪里不方便了?……

也許我們在思考上面問題的過程中,原本困擾我們的那些疑問也就迎刃而解了。

好了,廢話不多說 ,我們就用這個方法來解決一下題目所提出的新名詞——構(gòu)造函數(shù)。

構(gòu)造函數(shù)是從哪里提出來的?

:這一概念是來自于程序設(shè)計語言中面向?qū)ο筮@一思想,在構(gòu)造類的時候被提出的,是由類引出的。在類實例化時,程序為每個對象都創(chuàng)建了一個默認的初始化方法,而這個方法被稱為構(gòu)造函數(shù)。

從構(gòu)造函數(shù)的前世說起

在面向?qū)ο筮@一思想提出后,最吸引人的概念就是抽象類了。我們通過千辛萬苦,過五關(guān)斬六將的毅力設(shè)計出一個類來,然后我們就可以肆意妄為的實例化對象,這讓很多單身程序猿狠狠地爽了一把,因為我們不僅僅可以new出任意多的對象啦,我們還可以——然后……嘿嘿嘿,你懂的。

Java程序語言更是將面向?qū)ο蟆@一思想,發(fā)揮的淋漓盡致,在這里我們不談具體的語言,思考問題的方式才是關(guān)鍵,有道無術(shù),術(shù)尚可求,有術(shù)無道,止于術(shù)。這也就是說構(gòu)造函數(shù)本身并不具吸引力,讓我們瘋狂的是大師們是如何提出這一思想的。還回到類這一主題,設(shè)計類最初的目的就是為了表示數(shù)據(jù),使數(shù)據(jù)更加符合人的思維模式-----將數(shù)據(jù)隱藏而用其成員方法訪問其內(nèi)部成員變量(封裝)。

所以大師們在剛開始設(shè)計類時,從人類的思維模式出發(fā),將類一般劃分成了兩個部分:成員變量和成員函數(shù)(成員方法),為了得到這一原本的目的,大師們在設(shè)計它的時候,通常的做法是把成員變量設(shè)置成私有,而把成員方法設(shè)置成公開。這樣我們大家可以通過實例化對象,然后用其成員方法來操縱其成員屬性,這一種方式很好地體現(xiàn)了保護作用的特點——將數(shù)據(jù)隱藏。

好,你馬上要問了,那為什么我們非要將數(shù)據(jù)隱藏呢?非常好,你已經(jīng)get到了我們開篇講到的那種蘇格拉底式的精神了。

:將數(shù)據(jù)隱藏是為了更高效的工作,在企業(yè)中,我們都知道分工明確是非常重要的,尤其是大公司更是如此。那為什么將數(shù)據(jù)隱藏就能提高我們的工作效率呢?當然,將數(shù)據(jù)隱藏,我們通過一個一個的函數(shù)名調(diào)用而不必懂得函數(shù)內(nèi)部的工作原理才能完成工作那不是更快,何樂而不為呢?然而這個優(yōu)點只是其一。當這一思想在實際的應(yīng)用道路上曲折前行時,因為分工明確了,我們程序員更加專注于自己的任務(wù)了,人們發(fā)現(xiàn)公司整個系統(tǒng)bug減少了,安全性更高了……既然這樣,那我們就大刀闊斧的用這一思想理論吧!于是乎,這一思想勢如破竹,更以迅雷不及掩耳之勢在短短的幾年內(nèi)就統(tǒng)治了幾乎所有現(xiàn)在流行的高級程序語言。

構(gòu)造函數(shù)的開場白

說了這么多,可與構(gòu)造函數(shù)并沒有半毛錢的關(guān)系啊!不要急,該它出場的時候它自然就出場了,不是不到,時間未到。當我們廢了九牛二虎的力氣終于將一個類設(shè)計出來時,但接著問題來了,怎么賦值呢?你可能會自然地想到像下面這樣的賦值(初始化)方式:

class Person {
    int id;
    string name;
}

Person girl = {123, "LostArt"};

但,我現(xiàn)在告訴你,這樣是肯定不可行的,或者說是暫時還不可行的。那為什么呢?很明顯,如果數(shù)據(jù)是公有的,就可以這樣了,但問題是:數(shù)據(jù)不是公有的。如果數(shù)據(jù)是公有的,這明顯違背了當初設(shè)計類時的一個主要初衷——隱藏數(shù)據(jù)。好好的一個girl ,你竟然讓大家看到了她里面的構(gòu)造(結(jié)構(gòu)),你懂的,這是萬萬使不得的呀!那該如何才能使得呢?最簡單的辦法就是你自己在剛才設(shè)計好的類里面,再多添加一個賦值的方法,讓大家通過這個方法來初始化。不管是誰,在最開始用這個Person類時,必須先調(diào)用你預(yù)先寫好的這個賦值方法。

現(xiàn)在用符合人的思維想一下,既然在類設(shè)計成時,如果實例化,都要先調(diào)用這個方法,那為什么不在設(shè)計這個面向?qū)ο笳Z言開始時,事先讓編譯器自動的為你定義的類賦值呢?或者說你懶得自己調(diào)用自己的這個賦值方法了,因為這是一個很麻煩的事情,如果能讓程序默認地為你賦值,那何樂而不為呢?好了,我們聊到這里,時機已成熟,構(gòu)造函數(shù)這一概念已經(jīng)呼之欲出了。

構(gòu)造函數(shù)的出生

大師們?yōu)榱吮硎具@個賦值函數(shù)很特別,就特別地為這個特別的函數(shù)起了一個特別的名字——構(gòu)造函數(shù),而且大師們還賦予了它一些特別的性質(zhì)

  • 函數(shù)名必須與類名相同。
  • 函數(shù)沒有返回類型,也不能定義為void,在函數(shù)名前面不聲明方法類型。
  • 函數(shù)的主要作用是完成對象的初始化工作,它能夠把定義對象時的參數(shù)傳給對象的域。

后記:
那大師們?yōu)槭裁从?strong>構(gòu)造一詞呢?能不能換一個詞呢?答案是肯定的,然而從藝術(shù)的角度看,構(gòu)造一詞真的再合適不過了。見名知意,一說構(gòu)造,你馬上會想到通過一個模具,然后鑄成了一個實實在在的東西。那么,在計算機程序語言中類不就是一個模具(模板)嗎,而實例化的對象剛好就是那個實實在在的東西了。這個詞用的恰到好處,多一分顯得抽象多余,少一分則顯得表達不足。

構(gòu)造函數(shù)我們明白了,我們好像又發(fā)現(xiàn)一個新現(xiàn)象,藝術(shù)不分學科,不分國界。而這個藝術(shù)就是所有學科的靈魂了。說到這里,不得不贊嘆大師就是大師,已經(jīng)能做到學科間的融會貫通了。而那些所謂的隔行如隔山的說法只是我們管中窺豹罷了。想要一覽廬山的真正瑰麗面貌,還是要走出山中,站在不同的角度去欣賞去發(fā)現(xiàn)才行。

真心希望在摸索藝術(shù)道路上前行的人都能成為這樣的大師,在這個浮躁的年度里能夠堅持探討藝術(shù)的本源,觸摸到那個已經(jīng)失落很久了的藝術(shù)之靈魂。驀然回首,那人卻在燈火闌珊處,剛剛好。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • C++文件 例:從文件income. in中讀入收入直到文件結(jié)束,并將收入和稅金輸出到文件tax. out。 檢查...
    SeanC52111閱讀 3,092評論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,642評論 18 399
  • 11月18日,青島3度°。我在店里上著12小時的班領(lǐng)著80塊錢的薪水,寫著英語四級模擬題。風吹的有些冷,所...
    莫花前閱讀 358評論 2 6
  • 網(wǎng)上的段子都說,最近的天氣晴好,那是黨的光輝,確實如此! 11月了落葉飄飄,屋前的大樹葉子都黃了。 最近心心念念想...
    閑著也是閑著lily閱讀 485評論 2 1

友情鏈接更多精彩內(nèi)容