前言序錦:
很開深也很受教的一次c++學習,今天在圖書館自習,女票說要拿一道c++的題來考考我,說這道題頗有難度,當時的我是很激動的,畢竟作為程式猿來說,就相當於獵人嗅到了食物的味道一樣o(∩_∩)o哈哈~,好了話不多說,直接來上題目吧……
正文:
題目:
calss a
~a()}
a* p;
};老鐵們,請先不要繼續往下看,先來自己品嚐一下這道題吧,看你能不能很快oj她!!!
分析:
看了這道題,我們可以朝著兩個方向去尋找答案,「建構函式」和「析構函式」
1,建構函式方面:
由於a類中有乙個指標a* p;
而建構函式 a()
也就是說整個指標指向了物件本身,
修改為:`a(),`
在實際的程式中,可以將p指向別的物件,比如結構體中的next物件一樣。
2,析構函式方面:
首先我們來看一下delete p,
這一句的操作就是讓我們來手動釋放掉p物件,
而我們又是將其定義在析構函式中,
則會出現,物件本來已經通過析構函式被析構掉了,
然後此處再次呼叫delete,
此時又會再次去進行析構,而析構的都是同乙個物件,
這樣就會形成無限遞迴呼叫析構函式,導致錯誤。
對就是這麼「簡單」的一道題,卻隱含了這麼多的知識,真的是讓人感慨呀,當年學的c++感覺全都還給老師了呀,今天真的很感謝女票^-^給我這麼個機會來好好腦補一下c++知識,下面我們還是來詳細了解一下c++中的
this指標:
我首先看的是建構函式,a(),
好奇特的建構函式,為什麼什麼都沒有,第一句一開始就出現了乙個變數p,還等於this,為了這一點,還專門去看一下this:
c++中的this:
1,對於上面的p = this,意思就是對於p的this就是p的this指標,如果有成員函式呼叫,比如說a.sum(),則sum函式可以通過**形參this來訪問a,所以this是被呼叫物件訪問呼叫他的物件的工具,可以理解為this指向呼叫他的物件;
2,預設情況下,this的型別是指向類型別非常量的常量指標,所以預設情況下,進行初始化時,我們不能把this繫結到乙個常量物件上去。
3,this指標是類成員函式的第乙個預設隱含引數,編譯器自動維護傳遞,類編寫者不能顯示傳遞;
4,只有在類的非靜態成員函式中才可以使用this指標,其他任何函式中都不可以。
3,this指標時刻指向物件,在成員函式的開始執行前構造,在成員的執行結束後清除。
課後習題1:
寫出類a的定義,通過類的靜態成員來記錄已經建立的a類的例項(物件)的個數,使得下面的程式
int main()
得到的輸出為:
there are 10 objects
there are 0 objects
比較簡單但是很有代表性的一道題,歡迎各位夥伴們(^▽^)oj,可以將你們的結果或者問題留下,我們一起學習……
課後習題1答案:
C 類建構函式 析構函式
類的建構函式是類的一種特殊的成員函式,它會在每次建立類的新物件時執行。建構函式的名稱與類的名稱是完全相同的,並且不會返回任何型別,也不會返回 void。建構函式可用於為某些成員變數設定初始值。下面的例項有助於更好地理解建構函式的概念 include using namespace std class...
C 類建構函式 析構函式
類的建構函式是類的一種特殊的成員函式,它會在每次建立類的新物件時執行。建構函式的名稱與類的名稱是完全相同的,並且不會返回任何型別,也不會返回 void。建構函式可用於為某些成員變數設定初始值。下面的例項有助於更好地理解建構函式的概念 include using namespace std class...
C 類建構函式 析構函式
類的建構函式是類的一種特殊的成員函式,它會在每次建立類的新物件時執行。建構函式的名稱與類的名稱是完全相同的,並且不會返回任何型別,也不會返回 void。建構函式可用於為某些成員變數設定初始值。下面的例項有助於更好地理解建構函式的概念 include using namespace std class...