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