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