- 论坛徽章:
- 0
|
这些问题你是从哪里看到的.我觉得你的理解有偏差.
为什么不能直接像c++里面定义对象那样定义呢?
它开发时,用的是c语言,c语言里又没有class这个东西,而只有struct.
为什么要规定由这三个部分组成呢?
一个类
- class Cat
- {
- public:
- Cat();
- Cat(int age, char sex, int noOfLegs);
- ~Cat();
-
- void Mum();
- void Roll();
- private:
- int age_;
- char sex_;
- int noOfLegs;
- };
复制代码
一个对象
Cat cat;
class Cat描述了对创建的一个实例的在内存中的布局信息(不考虑虚函数和静态成员)
class Cat
被解释为
- struct Cat
- {
- int age_;
- char sex_;
- int noOfLegs;
- }; //就象在c语言里一样,只有定义了结构类型,并定义了一个结构类型的变量后,变量将会在程序执行到变量定义部分时产生.
- 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)
- {
- }
复制代码
先说一下对象是如何产生的.
就象定义普通变量一样,编译器产生调整堆栈的栈顶指针的代码,当分配单位为sizeof(struct Cat)并且空间分配完毕,然后在根据调用的构造函数的形式,来决定使用的是Cat(struct Cat* aCat)或是Cat(struct Cat* aCat, int age, char sex, int noOfLegs);
- Cat aCat(3, 'm', 4);
- aCat.Roll();
复制代码
被编译器转换成了
- struct Cat aCat;
- Cat(&aCat, 3, 'm', 4);
- Roll(&aCat);
复制代码
的调用序列.
所以,你在源代码里面定义了一个结构类型, 就是告诉编译器假如我定义了一个这个结构类型的变量,你编译器应当如何对从这个变量的地址开始的空间内的某几个字节做如何的解释,把这几个字节当作是一个整型的还是一个浮点型的数据.
考虑一下它体现了什么信息,当编译完成时,每个函数都被放入了可执行模块了,每个函数都有一个确定入口地址,以及函数参数传递的方式,还有一个决定了你对某些内存空间如何进行解释的结构类型,这些信息都在程序执行前就确定了.
这些信息,可以视为是类的元信息.-------对结构的解释,以及函数的描述信息
类是一个编译期的概念,而实例是一个执行期的概念,就像只有正在运行的可执行程序才能称之为进程一样.
class Cat 定义了多少个实例,内存中就存在多少份
struct Cat
{
int age_;
char sex_;
int noOfLegs;
};
而它们是共用上面定义的那些方法的.
如果我在类结构中也公用数据,实例中也有公用数据,那这两个公用数据会有什么区别呢?
类中定义公用数据,只是告诉编译器检查可存取性.
实例中有公用数据-----------这句话很别扭,因为每个实例都有一份自己的数据.
思维有点混乱,不知道说的是否清楚.
1. 对象的ID标识(唯一,无符号长整型,所有此类对象共同的标识);
在一个库中,要表示出一个类之间的的关系,假定是继承关系,当你的语言里面并没有表示结构之间的关系的特性时,最简单的方法,就是给父类分配一个固定的唯一的ID,并在子类中有自身的ID和父类的ID,这样来表示类之间的层次关系.
举个例子
描述一种结构之间的继承关系
[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; //自身的.
这样可以简单的表示一种类之间层次结构的方法.在一般的框架里面,实现的方法一般都是单根树.
2. 对象的类结构(唯一,结构型,由对象的所有实例共同拥有);
就是前面所提到的类的元信息,对一个类实例所代表的内存空间如何解释以及如何调用类方法,这些信息是类的所有实例所共享的,编译期内就确定了
3.对象的实例.
每个对象都具有自身的数据成员,每实例化一份对象,就会产生类的所有数据成员的一份拷贝.只有到执行期才可确定.
gtk就是一个用c语言写的框架库. |
|