帶指針類設
帶指針類必須含有拷貝構造、拷貝賦值以及析構函數。
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<<...;