一、Objects的創(chuàng)建
依據(jù)已有的class CPoint ,我們可以產(chǎn)生一個(gè)或多個(gè)object(對(duì)象),或者說是產(chǎn)生一個(gè)instance(實(shí)體):
CPoint aPoint(7.2); // aPoint._x 初始值為 7.2 aPoint.x(5.3); // aPoint._x 現(xiàn)值為 5.3
這樣的objects可能放在函數(shù)的stack之中(對(duì)象是在函數(shù)內(nèi)部創(chuàng)建的,例如在函數(shù)的作用域內(nèi)),也有可能放在程序的data segment中(對(duì)象是在函數(shù)外部創(chuàng)建的,例如在全局作用域或靜態(tài)作用域內(nèi))。我們也可以這樣來產(chǎn)生一個(gè)objects:
CPoint* pPoint = new CPoint(3.6); // pPoint->_x 初 值 為 3.6 pPoint->x(5.3); // pPoint->_x 現(xiàn)值為 5.3 delete pPoint;
使用new operator產(chǎn)生的objects,是放在程序的heap(堆)之內(nèi)。
不管哪一種方式來產(chǎn)生objects,我們依據(jù)某個(gè)class產(chǎn)生一個(gè)object的動(dòng)作稱為instantiation(實(shí)例化)。object的誕生和死亡時(shí),會(huì)自動(dòng)調(diào)用class中特殊的member function,稱為constructor 和 destructor。
Constructor:object誕生時(shí)會(huì)自動(dòng)調(diào)用的class member functions稱為構(gòu)造函數(shù),此函數(shù)的命名必須與class相同,參數(shù)可以自定,沒有返回值。class可以有一個(gè)以上的constructors,其中無參數(shù)的那個(gè)稱為default constructor;只有一個(gè)參數(shù),并且以該class為參數(shù)類型的,稱為copy constructor。
Destructor?:object生命結(jié)束時(shí)會(huì)自動(dòng)調(diào)用的class member function稱為析構(gòu)函數(shù),一個(gè)class只能有一個(gè)destructor,沒有參數(shù),沒有返回值,其命名必須與class相同,并以~為前置符號(hào)。
二、Objects 的生命(Scope of Objects)
? ? 由于objects可能位于stack或heap或data segment之中,所以objects的生命周期就有差異。
1. 放在stack之中的稱為local objects,它的生命隨著objects的產(chǎn)生產(chǎn)而開始,隨著所在函數(shù)的執(zhí)行結(jié)束而結(jié)束。
2.放在data segment之中的稱為gobal objects,它的生命隨著程序的開(比程序進(jìn)入點(diǎn)還早),隨著程序的結(jié)束而結(jié)束。
3.放?在heap之中的稱為heap objects,它的生命隨著new operator而開始,隨著delete operator而結(jié)束?! ?/span>
下面這個(gè)例子出現(xiàn)了剛剛所提到的三種不同的生命周期的objects。從程序的執(zhí)行結(jié)果,我們可以清楚的看到三種objects的生命范圍。其中用到的constructors(構(gòu)造函數(shù))和destructors(析構(gòu)函數(shù))。這個(gè)例子出現(xiàn)剛剛所提的三種不同生命週期的 objects。從程式的執(zhí)行結(jié)果,
我們可以清楚看到三種 objects 的生命範(fàn)圍。其中用到的 constructors(建構(gòu)式)和 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"; }
執(zhí)行結(jié)果如下(注意,上例有new的動(dòng)作,卻沒有delete,是個(gè)錯(cuò)誤示范):
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
?文章來源:http://www.zghlxwxcb.cn/news/detail-860222.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-860222.html
到了這里,關(guān)于C++多態(tài)與虛擬:Objects 實(shí)例化(Objects Instantiation)探究的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!