作大二《C++高級(jí)程序設(shè)計(jì)》助教已有7周,遇到很多學(xué)生提出來的問題,總的說來都屬于C++基礎(chǔ)問題。然而,由于才疏學(xué)淺,很多次被學(xué)生問懵了,為了面子,不得不私下惡補(bǔ)。Always try to see the half glass full!
惡補(bǔ)的過程中,總結(jié)了一些問題,本著交流與分享的出發(fā)點(diǎn),偶會(huì)在這里不定期更新,希望對(duì)C++初學(xué)者有所幫助!也請(qǐng)指出偶的錯(cuò)誤之處!
PS:下面提到的觀點(diǎn)并非全部屬于自己,很多是來自各技術(shù)論壇大牛之作,在此引用,謝過先
Question:編譯器會(huì)自動(dòng)創(chuàng)建那些成員函數(shù)呢?什么情況下我們不需要自己寫這些函數(shù)呢?(學(xué)生問時(shí),我說了三種,少了assignment operator)
Answer:constructor(構(gòu)造函數(shù));destructor(析構(gòu)函數(shù));copy constructor(復(fù)制構(gòu)造函數(shù));assignment operator(賦值操作符)
以Human為例:
Human();//默認(rèn)構(gòu)造函數(shù)
~Human();//析構(gòu)函數(shù)
Human(const Human& p);//復(fù)制構(gòu)造函數(shù)
Human & operator = (const Human & lvalue);//賦值操作符函數(shù)
學(xué)生又問了既然編譯器給我們自動(dòng)創(chuàng)建了這些構(gòu)造函數(shù),為什么我們還要重新自己定義呢?
暈倒,我問“構(gòu)造函數(shù)的作用是什么呢?” 答曰“初始化數(shù)據(jù)成員(因?yàn)闊o法在類里面給成員變量賦初值)” “僅僅如此嗎,如果需要實(shí)現(xiàn)一些功能呢,要不要在構(gòu)造函數(shù)里寫?回答是肯定的”。至于其他幾個(gè)構(gòu)造函數(shù)別有用途,另行討論;
學(xué)生沒有示弱的意思,反問道“那什么情況下,我們不需要寫這些函數(shù)呢”
稍稍考慮了一下,“如果沒有寫構(gòu)造函數(shù),編譯器會(huì)自動(dòng)生成一個(gè)不帶參數(shù)的構(gòu)造函數(shù)即默認(rèn)構(gòu)造函數(shù),析構(gòu)函數(shù)類似”,暫時(shí)敷衍了一下。后來又想,至于復(fù)制構(gòu)造函數(shù)和賦值呢?查了一下才知道:如果我們只用基本數(shù)據(jù)類型,而沒有用指針或者引用作為數(shù)據(jù)成員,此時(shí)就不需要自己寫這些函數(shù)。所以一般情況下,我們通常都寫上這幾個(gè)構(gòu)造函數(shù)!