一、Objects的創建 依據已有的class CPoint ,我們可以產生一個或多個object(對象),或者說是產生一個instance(實體): CPoint aPoint(7.2); // aPoint._x 初始值為 7.2 aPoint.x(5.3); // aPoint._x 現值為 ...
一、Objects的創建
依據已有的class CPoint ,我們可以產生一個或多個object(對象),或者說是產生一個instance(實體):
CPoint aPoint(7.2); // aPoint._x 初始值為 7.2 aPoint.x(5.3); // aPoint._x 現值為 5.3
這樣的objects可能放在函數的stack之中(對象是在函數內部創建的,例如在函數的作用域內),也有可能放在程式的data segment中(對象是在函數外部創建的,例如在全局作用域或靜態作用域內)。我們也可以這樣來產生一個objects:
CPoint* pPoint = new CPoint(3.6); // pPoint->_x 初 值 為 3.6 pPoint->x(5.3); // pPoint->_x 現值為 5.3 delete pPoint;
使用new operator產生的objects,是放在程式的heap(堆)之內。
不管哪一種方式來產生objects,我們依據某個class產生一個object的動作稱為instantiation(實例化)。object的誕生和死亡時,會自動調用class中特殊的member function,稱為constructor 和 destructor。
Constructor:object誕生時會自動調用的class member functions稱為構造函數,此函數的命名必須與class相同,參數可以自定,沒有返回值。class可以有一個以上的constructors,其中無參數的那個稱為default constructor;只有一個參數,並且以該class為參數類型的,稱為copy constructor。
Destructor :object生命結束時會自動調用的class member function稱為析構函數,一個class只能有一個destructor,沒有參數,沒有返回值,其命名必須與class相同,並以~為前置符號。
二、Objects 的生命(Scope of Objects)
由於objects可能位於stack或heap或data segment之中,所以objects的生命周期就有差異。
1. 放在stack之中的稱為local objects,它的生命隨著objects的產生產而開始,隨著所在函數的執行結束而結束。
2.放在data segment之中的稱為gobal objects,它的生命隨著程式的開(比程式進入點還早),隨著程式的結束而結束。
3.放 在heap之中的稱為heap objects,它的生命隨著new operator而開始,隨著delete operator而結束。
下麵這個例子出現了剛剛所提到的三種不同的生命周期的objects。從程式的執行結果,我們可以清楚的看到三種objects的生命範圍。其中用到的constructors(構造函數)和destructors(析構函數)。這個例子出現剛剛所提的三種不同生命週期的 objects。從程式的執行結果,
我們可以清楚看到三種 objects 的生命範圍。其中用到的 constructors(建構式)和 destructors。
#include <iostream.h> #include <string.h> class CDemo { public: CDemo(const char* str); // constructor ~CDemo(); // destructor private: char name[20]; }; CDemo::CDemo(const char* str) // constructor { strncpy(name, str, 20); cout << "Constructor called for " << name << '\n'; } CDemo::~CDemo() // destructor { cout << "Destructor called for " << name << '\n'; } void func() { CDemo LocalObjectInFunc("LocalObjectInFunc"); static CDemo StaticObject("StaticObject"); CDemo* pHeapObjectInFunc = new CDemo("HeapObjectInFunc"); cout << "Inside func" << endl; } CDemo GlobalObject("GlobalObject"); void main() { CDemo LocalObjectInMain("LocalObjectInMain"); CDemo* pHeapObjectInMain = new CDemo("HeapObjectInMain"); cout << "In main, before calling func\n"; func(); cout << "In main, after calling func\n"; }
執行結果如下(註意,上例有new的動作,卻沒有delete,是個錯誤示範):
1. Constructor called for GlobalObject 2. Constructor called for LocalObjectInMain 3. Constructor called for HeapObjectInMain 4. In main, before calling func 5. Constructor called for LocalObjectInFunc 6. Constructor called for StaticObject 7. Constructor called for HeapObjectInFunc 8. Inside func 9. Destructor called for LocalObjectInFunc 10. In main, after calling func 11. Destructor called for LocalObjectInMain 12. Destructor called for StaticObject 13. Destructor called for GlobalObject