(Boolan)面向對象高級編程(上)第二周筆記

帶指針類設

帶指針類必須含有拷貝構造、拷貝賦值以及析構函數。

1.String類解析

在string類中有一個私有的指針指向內存中的字符串,當我們需要使用這個字符串時才通過指針去申請內存。

三大函數(BigThree)

拷貝構造:一個構造函數傳入的第一個參數是自身類型的引用,而且外參數都有默認值。

例如(Rectangle(const Rectangle& other);)

拷貝賦值:它是對賦值運算符(=)的重載函數。

例如(Rectangle& operator=(const Rectangle& other);)

析構函數:析構函數與構造函數相反,釋放對象使用的資源。

例如(~Rectangle();)

關于棧(stack),堆(heap)

1.棧(stack)

stack存在于某個scope的一塊內存空間。當調用某函數時,函數本身會形成一個stack來放置它所接收的參數、返回地址以及local objects。

在函數本體(function body)內聲明的任何變量,其所用的內存塊都取自上述stack。

2.堆(heap)

所謂system heap,是指由操作系統提供的一塊global內存空間,程序可動態分配從其中獲得若干區塊。

舉例:

classcomplex{... };......//對象C定義在任何作用域之外,因此是全局對象,作用域與static一樣是整個程序。complexC(1,2);{//c1所占空間來自棧,它在作用域結束后會被自動清理,因此稱其為local object或auto object。complexc1(1,2);//c2的生命在其scope結束之后依舊存在,直到整個程序結束。staticcomplexc2(1,2);//使用new新建對象時,是先分配memory再調用ctor,在作用域結束后p依舊存在。complex* p =newcomplex(1,2);//這里的單元由內存動態分配得來,因此用戶有義務將其刪除。deletep;}

分析:

1.用new創建單個對象:

complex* pc =newcomplex(1,2);

上面一句代碼在編譯器中做了如下工作:

complex*pc;void* mem =operatornew(sizeof(complex) );//內部調用malloc分配內存。pc =static_cast( mem );//轉型pc->complex::complex(1,2);

2.使用delete釋放內存:

String* pc =newString("Hello!");...deletepc;

這句代碼在編譯器中是先調用dtor,再釋放內存。

complex::~complex( pc );//析構函數,將內存中的String釋放。operatordelete( pc );//釋放指針的內存,內部調用free( pc )。

如果使用array new建立一個數組時,必須用delete[] 來進行內存釋放。

命名空間:

namespace std

...

直接全部打開:

前置using namespace std;就可以使用命名空間所有名稱

部分打開:

前置using std::cout;就可以在后面直接使用cout而不用提前申明了。

用時寫全名:

例如:std::cin<<...;

std::cout<<...;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容