!!!!!!!!!!!!!!类!!!!!!!!!!!! (300分)

  • 主题发起人 ReallyFail
  • 开始时间
R

ReallyFail

Unregistered / Unconfirmed
GUEST, unregistred user!
问题一:类方法与普通的方法的区别!(包括为什么类方法不用构造就可以使用,
而普通的方法一定要构造才能使用)(150分)
问题二:对象(类的实例)的指针(内存)有保存着方法吗?如果保存的话不是
只要得到实例的指针就能计算出方法??不保存的话能不能得到类所在的内存的位置?(100分)
问题三:DELPHI的类中有没有“类属性”(静态数据域)(50分)
各位高人给指点一下!!谢谢!!
 
T

troyliu

Unregistered / Unconfirmed
GUEST, unregistred user!
1类方法与普通的方法的区别!
类的方法封装在类里,可以规定方法的可见性。这样对方法来说可以起到保护作用。
而普通的方法没有这些特性。
<(包括为什么类方法不用构造就可以使用,而普通的方法一定要构造才能使用)
没有听说过。不过类的对象构建,而他的方法也构建了。
2.对象(类的实例)的指针(内存)有保存着方法吗?
不知道
3.当然有了
TPersong = clss(TObject)
FName: String;
FAge: integer;
 
X

xzh2000

Unregistered / Unconfirmed
GUEST, unregistred user!
答了不好,请原谅
问题一:类方法与普通的方法的区别!(包括为什么类方法不用构造就可以使用,
而普通的方法一定要构造才能使用)
类方法与C++的STATIC函数一样,都是类被装载时初始化。
问题二:对象(类的实例)的指针(内存)有保存着方法吗?
不保存,对象的方法指针指向类的方法
问题三:DELPHI的类中有没有“类属性”(静态数据域)
没见过。

 
Z

ZRWeng

Unregistered / Unconfirmed
GUEST, unregistred user!
1.类方法(静态方法)是作用于类,无须生成对象(实例)就存在,
普通方法是非静态方法,只有在生成/构造对象(实例)才可以使用
这与写类的时候声明方法有关吧
如;构造函数Create应该是属于类方法吧,TForm.Create(Application)
又如Java:String.out.println("xxx");
println也是属于类方法
 
R

ReallyFail

Unregistered / Unconfirmed
GUEST, unregistred user!
to troyliu
1.没怎么看明白!我现在的认为是类的构造函数就是个类方法!比如
var myclass;
myclass:=tmyclass.create;
而不是 myclass.create
我说的类方法是可仪这样调用的方法 Tmyclass.classfun
2.每个类的实例(内存中)应该没有方法吧??他是不是在运行期调用存处在类中的过程
3。我指的类属性大概是这样的:
TPersong = clss(TObject)
class FName: String;//通不过
FAge: integer;
end;


 
X

xeen

Unregistered / Unconfirmed
GUEST, unregistred user!
1.普通成员方法需要传如一个隐含的参数:Self指针,即所有的普通的成员方法
都需要一个隐含的实例指针参数.而类方法则不需要这个参数,所以它能脱离实例运行.
比如:
var MyEdit:TEdit;
..
MyEdit := TEdit.Create(nil);
[red]MyEdit.SelectAll;[/red]
编译器会把上一句翻译成大概这个意思:
[blue]TEdit.SelectAll(TEdit(MyEdit));[/blue]
2.Delphi中所有对象实例的前32个字节都会指向这个对象所属类的一个VMT结构.
比如:
var MyEdit1,MyEdit2:TEdit;
...
MyEdit1 := TEdit.Create(self);
MyEdit2 := TEdit.Create(self);
Showmessage(inttostr(Integer((Pointer(MyEdit1))^)));
Showmessage(inttostr(Integer((Pointer(MyEdit2))^)));
你会发现这两个数值相同,它们都指向VMT.(调用一个实例的ClassType类方法也会返回一
个指向VMT的指针)

这个结构中包含着指向方法表的指针,VMT也就可以看作是类本身.VMT的结构在Class单元有定义.
{ Virtual method table entries }

vmtSelfPtr = -76;
vmtIntfTable = -72;
vmtAutoTable = -68;
vmtInitTable = -64;
vmtTypeInfo = -60;
vmtFieldTable = -56;
vmtMethodTable = -52;
vmtDynamicTable = -48;
vmtClassName = -44;
vmtInstanceSize = -40;
vmtParent = -36;
vmtSafeCallException = -32;
vmtAfterConstruction = -28;
vmtBeforeDestruction = -24;
vmtDispatch = -20;
vmtDefaultHandler = -16;
vmtNewInstance = -12;
vmtFreeInstance = -8;
vmtDestroy = -4;

vmtQueryInterface = 0;
vmtAddRef = 4;
vmtRelease = 8;
vmtCreateObject = 12;

3.没有,可以用全局变量代替。
 
R

Richard3000

Unregistered / Unconfirmed
GUEST, unregistred user!
同意xzh2000

3.我认为没有。不过可以在interface部分定义如const PI=3.1415926;
 
R

ReallyFail

Unregistered / Unconfirmed
GUEST, unregistred user!
如果我想在类方法中访问一个数据域有没什么办法??(本想有类属性或他的替代品的)!
 
C

cjc861

Unregistered / Unconfirmed
GUEST, unregistred user!
问题一:类方法与普通的方法的区别!(包括为什么类方法不用构造就可以使用,
而普通的方法一定要构造才能使用)
类方法应该是构造后才能用,但create除外!
普通方法不需要构造就可以用的!
type
FForm=class(TForm)
prive
...
public
procedure AddControls(..);就要在创建完FForm的对象后才能用!
..
end;
procedure QueryFrm(..);//一般方法,不用创建对象就能用!
...
...
procedure QueryFrm(..);
begin
with FForm.Create(application) do
..
..
end;
还有一种情况不需要类的实例 用Class 声明的!
TObject = class
...
class function ClassName: ShortString;
class function ClassNameIs(const Name: string): Boolean;
问题二:有的!
问题三:没见过!
 
Z

zhukewen

Unregistered / Unconfirmed
GUEST, unregistred user!
>>问题一:类方法与普通的方法的区别!(包括为什么类方法不用构造就可以使用,
>> 而普通的方法一定要构造才能使用)
类一般都包括属性(数据)和方法,普通方法一般都要访问数据,而数据与类的
实例有关,所以要构造后才能使用。如果你的方法保证和实例的数据无关,就
可以声明为类方法。
>>问题二:对象(类的实例)的指针(内存)有保存着方法吗?如果保存的话不是
>>只要得到实例的指针就能计算出方法??不保存的话能不能得到类所在的内存的位置?
对象的指针不保存方法,而只保存方法的指针(VMT)
>>问题三:DELPHI的类中有没有“类属性”(静态数据域)
为什么要静态数据域?用全局变量不是很好吗?
 
R

ReallyFail

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢楼上的各位大虾们的讲解!!
 
顶部