話說如今我已經習慣了這種生活,之前俺是中午不睡覺會死星人,如今感受不睡覺也就是那樣了,準備把本身的時間好好安排一下了,因爲我是在培訓班,因此天天的時間也很緊的,之前打算天天晚上更新博客的,如今看來實現不了了。我決定在天天中午,回顧前天學習的內容,並鞏固上午所學的。我想這應該是我學習效率最高的方法了。在這感謝一下@奮鬥的小歌謝謝你的鼓勵,我想這將是我之後堅持不下去的動力,我會堅持的不就是6個月嗎?加油!!ios
好了,廢話不說了,進入今天的主題吧!c++
析構函數:就是用來釋放對象的。c++中一切都是按對象來講的,可是對象裏面也有成員變量,成員函數之類的,因此析構函數就是來釋放對象所佔的內存空間的。
ide
析構函數的特色:無返回值,不能重載,必須公有,不帶任何參數
函數
那麼,何時會用到析構函數呢?總結一句話就是對象立刻釋放的時候!學習
一、離開對象的做用域this
二、 銷燬對象spa
三、刪除一個指向對象的時候指針
#include <iostream> using namespace std; class Test { public: Test(){cout<<"這是不帶參的默認構造函數"<<endl;} ~Test(){cout << "這是析構函數"} }; void main() { Test t; return ; } /******************************************/ The output is 這是不帶參的默認構造函數 這是析構函數
淺拷貝:一個類的對象同過賦值操做能夠把本身拷貝給相同類的另一個對象。可是這種賦值方式是對象數據成員之間的相互賦值,這可能建立的僅僅是一種物理拷貝對象
當所拷貝的對象裏面包含指針的成員變量的時候,這種淺拷貝會形成二次刪除,這是不合法的。因此應當避免這種拷貝
內存
class Thing { private: int a,b; int *p public: Thing ():b(0){a=0,p=&a} }; Thing t1,t2; t1=t2;
在這個程序段裏,我聲明瞭一個類Thing ,裏面包含一個指針類型的成員變量,int *p,在接着我把 Thing 類型的 t2 賦值給t1,這個時候就把t2的指針的值付給了t1 ,指針同時指向t2的 成員變量a,在釋放內存的時候,先釋放t2,再釋放t1的時候,發現t1的指針變量所指向的內存已經被釋放了,因此就會拋出異常,就是二次刪除。
固然在這個程序中構造方法使用了初始化列表對數據成員進行初始化,比在函數中進行賦值要高效
在一個類中,訪問函數get和print函數一般要做爲const成員函數,常成員函數,不能修改爲員變量的值。
this 指針
每個對象都包含了一個指向自身的指針,稱做this指針。他是隱藏的,可是能夠在須要的地方顯式的調用。
在用指針的時候要注意操做符的優先級,通常咱們要像(*this)這樣用
this指針的鏈式表達式:
class Thing { public: Thing & setx(int a ) { (*this).x=a; return *this; } Thing & sety(int b) { (*this).y=b; return *this; } Thing & setz(int c) { (*this).z=c; return *this; } }; Thing thing ; thing.setx(1).sety(2).setz(3); /********************************/ 打印輸出後會輸出Thing的xyz的值:1 2 3
若是把引用去掉會發生怎麼樣的變化呢?
去掉引用 函數返回的就是一個臨時的對象,他會把 2 3 付給新生成的兩個臨時對象,因此去掉引用發生的結果不能預測,所以咱們必定要避免這種狀況。
this指針的特色:
一、this指針由編譯器自動在聲明類對象是建立(不須要本身定義)
二、每一個對象或者函數(成員變量,或函數 非static都隱藏了一個this指針)
三、this指針都保留了指向該對象的地址
四、當類的非static成員函數訪問另外一個非static函數時,編譯器會自動將對象的地址傳遞給內部調用的函數。(就是在一個成員函數內調用另外一個成員函數時,不用管對象的地址)