Boolan?第二周
class with pointer members:
Big Three:拷貝構造、拷貝賦值、析構
拷貝構造:必須使用深拷貝(申請新的堆空間再復制),否則會出現兩個指針指向同一個堆空間的情況,易出錯。
拷貝賦值過程:1、刪除舊空間;2、重新分配和需復制內容同樣大小的空間;3、拷貝內容
拷貝賦值注意點:必須要先進行自我賦值的檢測,防止出錯(刪除自己,程序出錯)。
析構:釋放申請到的堆空間
stack棧:存在某作用域的一塊內存空間,函數被調用時會形成一個stack來放置接收參數以及返回地址。
heap堆:由操作系統(tǒng)提供的一塊global的內存空間,程序會動態(tài)分配從中取得若干區(qū)塊。
????????????????任何從堆中獲取的空間必須手動刪除。
靜態(tài)static:1、靜態(tài)對象的死亡時間相當于全局對象,程序結束后才會死亡。
? ? ? ? ? ? ? ? ? ? ? 2、靜態(tài)類成員:a、僅有一份,不存在與類內,在全局區(qū)。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?b、靜態(tài)類成員必須在類外申明(可以賦初值)才能使用。
? ? ? ? ? ? ? ? ? ? ? 3、靜態(tài)類成員函數:a、不帶有this指針,僅能操作靜態(tài)成員變量。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? b、調用時可以通過classname::static_function(),或object.static_function(),但無this指針
new:new一個對象時,先分配空間,后調用ctor
delete:delete對象時,先調用dtor,后釋放空間
動態(tài)分配的內存空間:
例:new complex
cookie 4bit ? ? //用于記錄整塊空間大小,空間大小為64bit,cookie內容為00000041(16進制),1表示借給你使用,0表示還給系統(tǒng)
debugger header ?32bit ? ? ? //僅存在于debug版程序中,release版本沒有
complex對象 ? 8bit
debugger header 4bit
pad ?4*3=12bit ? ? ? //為了湊足16的倍數,便于操作系統(tǒng)回收
cookie ?4bit
動態(tài)分配array數組:new type[ ],必須使用delete ?[ ]type,若無[ ],析構函數只調用1次,若為帶指針的對象會造成內存泄漏,統(tǒng)一習慣加[ ]。
Singleton:通過私有隱藏構造函數,私有靜態(tài)類對象,使用靜態(tài)成員函數作為對外接口,獲得僅能有1份的對象。
cout:一種ostream,通過重載<<符號實現
類模板:
例如:
template <typename T>
class complex
{
????????????complex (T r=0,T i=0):re(r),im(i) {}
? ? ? ? ? ? T re;T im;
.......
}
{
complex<double> c1(2.5,1.5); ? ? ? ? ? ? //使用時有一個type就對應生成一份代碼
complex<int> c2(2,6);
}
函數模板 function template:編譯器會自動推導
template <class T>
const T& min(const T& a,const T& b) ?//通用的比較取較小值函數
{
? ? ? ? ? return a<b ? a:b; ? ? ? ? //<符號可以寫重載以實現更多類對象比較
}
namespace命名空間:
namespace std
{ ...... ? ? ? ? ? }
使用范例:
1:
using namespace std;
int main(){ ? ?cin>>....;cout<<.....; ? ? ? ? }
2:
using std::cout;
int main(){ ? ?std::cin>>....;cout<<.....; ? ? ? ? }
3:
int main(){ ? ?std::cin>>....;std::cout<<.....; ? ? ? ? }