- 論壇徽章:
- 0
|
這些問題你是從哪里看到的.我覺得你的理解有偏差.
為什么不能直接像c++里面定義對象那樣定義呢?
它開發(fā)時,用的是c語言,c語言里又沒有class這個東西,而只有struct.
為什么要規(guī)定由這三個部分組成呢?
一個類
- class Cat
- {
- public:
- Cat();
- Cat(int age, char sex, int noOfLegs);
- ~Cat();
-
- void Mum();
- void Roll();
- private:
- int age_;
- char sex_;
- int noOfLegs;
- };
復(fù)制代碼
一個對象
Cat cat;
class Cat描述了對創(chuàng)建的一個實例的在內(nèi)存中的布局信息(不考慮虛函數(shù)和靜態(tài)成員)
class Cat
被解釋為
- struct Cat
- {
- int age_;
- char sex_;
- int noOfLegs;
- }; //就象在c語言里一樣,只有定義了結(jié)構(gòu)類型,并定義了一個結(jié)構(gòu)類型的變量后,變量將會在程序執(zhí)行到變量定義部分時產(chǎn)生.
- Cat(struct Cat* aCat)
- {
- }
- Cat(struct Cat* aCat, int age, char sex, int noOfLegs)
- {
- }
- ~Cat(struct Cat* aCat)
- {
- }
-
- void Mum(struct Cat* aCat)
- {
- }
- void Roll(struct Cat* aCat)
- {
- }
復(fù)制代碼
先說一下對象是如何產(chǎn)生的.
就象定義普通變量一樣,編譯器產(chǎn)生調(diào)整堆棧的棧頂指針的代碼,當分配單位為sizeof(struct Cat)并且空間分配完畢,然后在根據(jù)調(diào)用的構(gòu)造函數(shù)的形式,來決定使用的是Cat(struct Cat* aCat)或是Cat(struct Cat* aCat, int age, char sex, int noOfLegs);
- Cat aCat(3, 'm', 4);
- aCat.Roll();
復(fù)制代碼
被編譯器轉(zhuǎn)換成了
- struct Cat aCat;
- Cat(&aCat, 3, 'm', 4);
- Roll(&aCat);
復(fù)制代碼
的調(diào)用序列.
所以,你在源代碼里面定義了一個結(jié)構(gòu)類型, 就是告訴編譯器假如我定義了一個這個結(jié)構(gòu)類型的變量,你編譯器應(yīng)當如何對從這個變量的地址開始的空間內(nèi)的某幾個字節(jié)做如何的解釋,把這幾個字節(jié)當作是一個整型的還是一個浮點型的數(shù)據(jù).
考慮一下它體現(xiàn)了什么信息,當編譯完成時,每個函數(shù)都被放入了可執(zhí)行模塊了,每個函數(shù)都有一個確定入口地址,以及函數(shù)參數(shù)傳遞的方式,還有一個決定了你對某些內(nèi)存空間如何進行解釋的結(jié)構(gòu)類型,這些信息都在程序執(zhí)行前就確定了.
這些信息,可以視為是類的元信息.-------對結(jié)構(gòu)的解釋,以及函數(shù)的描述信息
類是一個編譯期的概念,而實例是一個執(zhí)行期的概念,就像只有正在運行的可執(zhí)行程序才能稱之為進程一樣.
class Cat 定義了多少個實例,內(nèi)存中就存在多少份
struct Cat
{
int age_;
char sex_;
int noOfLegs;
};
而它們是共用上面定義的那些方法的.
如果我在類結(jié)構(gòu)中也公用數(shù)據(jù),實例中也有公用數(shù)據(jù),那這兩個公用數(shù)據(jù)會有什么區(qū)別呢?
類中定義公用數(shù)據(jù),只是告訴編譯器檢查可存取性.
實例中有公用數(shù)據(jù)-----------這句話很別扭,因為每個實例都有一份自己的數(shù)據(jù).
思維有點混亂,不知道說的是否清楚.
1. 對象的ID標識(唯一,無符號長整型,所有此類對象共同的標識);
在一個庫中,要表示出一個類之間的的關(guān)系,假定是繼承關(guān)系,當你的語言里面并沒有表示結(jié)構(gòu)之間的關(guān)系的特性時,最簡單的方法,就是給父類分配一個固定的唯一的ID,并在子類中有自身的ID和父類的ID,這樣來表示類之間的層次關(guān)系.
舉個例子
描述一種結(jié)構(gòu)之間的繼承關(guān)系
[code]
struct Object
{
};
int ObjectParentID = -1; //無父類
int ObjectID = 0; //自身的類ID
struct Person
{
};
int PersonParentID = 0; //父類為Object
int PersonID = 1; //自身的
struct Employee;
{c
};
int EmployeeParentID = 1; //父類位Person
int EmployeeID = 2; //自身的.
這樣可以簡單的表示一種類之間層次結(jié)構(gòu)的方法.在一般的框架里面,實現(xiàn)的方法一般都是單根樹.
2. 對象的類結(jié)構(gòu)(唯一,結(jié)構(gòu)型,由對象的所有實例共同擁有);
就是前面所提到的類的元信息,對一個類實例所代表的內(nèi)存空間如何解釋以及如何調(diào)用類方法,這些信息是類的所有實例所共享的,編譯期內(nèi)就確定了
3.對象的實例.
每個對象都具有自身的數(shù)據(jù)成員,每實例化一份對象,就會產(chǎn)生類的所有數(shù)據(jù)成員的一份拷貝.只有到執(zhí)行期才可確定.
gtk就是一個用c語言寫的框架庫. |
|