一個類的對象的生命歷程如下:
申請內存——>初始化列表——>構造函數——>參與運算——>析構函數——>釋放內存。
在上述過程中存在三個特殊函數(Big Three):拷貝構造函數、拷貝復制函數、析構函數。
拷貝構造函數(copy constructor function)在以下三種情況下將被調用:
1. 定義一個對象時,以本類另一個對象作為初始值,發生復制構造;
2. 如果函數的形參是類的對象,調用函數時,將使用實參對象初始化形參對象,發生復制構造;
3. 如果函數的返回值是類的對象,函數執行完成返回主調函數時,將使用return語句中的對象初始化一個臨時無名對象,傳遞給主調函數,此時發生復制構造。
對象間的拷貝分為兩種情況,一種叫作淺拷貝,另一種叫作深拷貝。淺拷貝將一個對象相應的成員數據賦給另一個對象,但是他們所指向的是同一塊內存中的數據。深拷貝將一個對象相應的成員數據賦給另一個對象,但是他們占用不同的內存存儲相同的成員數據。
如果數據成員中不包含指針的話就用淺拷貝構造函數就行,如果包含了指針就需要用到深拷貝構造函數,即為該指針在堆上開辟一塊內存空間。若使用淺拷貝,兩個指針將指向同一個內存空間,當析構時,該內存空間將被釋放兩次。
關于堆(Heap)、棧(Stack):
一般說的堆棧指的是就是棧。
棧(操作系統):由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
棧使用的是一級緩存, 他們通常都是被調用時處于存儲空間中,調用完畢立即釋放。
堆(操作系統): 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似于鏈表。
堆則是存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收),所以調用這些對象的速度要相對來得低一些。
堆(數據結構):堆可以被看成是一棵樹,如:堆排序。
棧(數據結構):一種后進先出的數據結構。
詳解參考:http://www.cnblogs.com/kira2will/p/3957545.html
如果沒有自定義的析構函數則系統自動生成,析構函數在對象銷毀時自動調用,析構函數沒有返回值、沒有參數也不能重載。
使用運算符 new 可以申請單個內存時可直接初始化,如?int *p=new int(20)。new 內部調用 malloc 函數,先分配內存,再調用構造函數。申請內存時存在風險,要處理p==NULL的狀況。申請內存之后必須用運算符 delete 釋放,delete 內部先調用析構函數,再釋放內存。new 需要與 delete 搭配使用,array new 則必須與 array delete 搭配使用。
? ?String* p = new String[3];
? ? ...
? ? delete[] p;
類之間的三大關系分別為復合、委托與繼承。復合表示 has-a,構造時由內而外,析構時有外而內。委托同樣表示 has-a,可以看作一種引用形式的復合。繼承表示 is-a,其構造由內而外,即先調用基類的構造函數,再調用派生類的構造函數;析構由外而內,即先調用派生類的析構函數,再調用基類的析構函數。
Container::Container(...): Component() { ... };
Container::~Container(...) { ... ~Component() };
Derived::Derived(...): Base() { ... };
Derived::~Derived(...) { ... ~Base() };
幾種設計模式概述
Singleton 模式:Singleton 是對全局變量的取代策略,保證一個類只能有一個實例,并提供一個全局唯一的訪問點。
Strategy 模式:定義了算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化,不會影響到使用算法的客戶。
Adapter 模式:將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
pImpl 模式:將客戶與所有關于類的私有部分的知識隔離開,其主要作用是解開類的使用接口和實現的耦合,可以作為編譯防火墻。
Template Method 模式:定義一個操作中的算法的骨架。而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
Observer 模式:觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己
Composite 模式:將對象組合成樹形結構以表示“部分-整體”的層次結構。Composite使得用戶對單個對象和組合對象的使用具有一致性。
Prototype 模式:用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。