如题 : 您回答其中任意几个概念都可以!本人 初学者,还请您赐教!

解决方案 »

  1.   

    构造器
     构造器是用于创建和初始化实例对象的特殊方法。构造器声明和过程声明相似,不同的是构造器的声明是以保留字constructor开始。例如:constructor Create;constructor Create(AOwner: TComponent);构造器必需使用缺省的register调用约定。尽管构造器的声明没有指定返回值,但构造器总返回其创建或调用中的对象实例的引用。一个类可以有多于一个构造器,但大多数类只有一个构造器。习惯上调用构造器Create。要创建一个对象,应调用类中的构造器方法。例如,MyObject := TMyClass.Create;这里,在堆中为新的对象分配了存储空间,置所有的序数域为零,赋给所有指针和类类型的域以nil值,并且置所有串类型的域为空。接下来执行构造器中指定的其他行为;典型地是,对象基于作为构造器参数传递的值被初始化。最后,构造器返回一个引用,该引用指向新的分配区域和初始化了的对象。返回值的类型域构造器调用中指定的类类型相同。调用类引用的构造器时,如果在构造器的执行中引发异常,那么析构器Destroy会被自动调用,以销毁未完成的对象。当用对象引用(胜于类引用)调用其构造器时,不会创建新的对象实例。这时,构造器作用于指定的对象,仅仅执行构造器实现中的语句,然后返回对象引用。作用于对象引用典型的构造器调用是与保留字inherited联合,执行继承的构造器。下面是一个类类型及其构造器的例子。type  TShape = class(TGraphicControl)  private    FPen: TPen;    FBrush: TBrush;    procedure PenChanged(Sender: TObject);    procedure BrushChanged(Sender: TObject);  public    constructor Create(Owner: TComponent); override;    destructor Destroy; override;    ...  end;constructor TShape.Create(Owner: TComponent);begin  inherited Create(Owner);  //初始化继承得到的部分  Width := 65;  // 改变继承得到的的属性  Height := 65;  FPen := TPen.Create;  // 初始化新的域  FPen.OnChange := PenChanged;  FBrush := TBrush.Create;  FBrush.OnChange := BrushChanged;end;构造器的第一个动作通常是调用继承得到的构造器以初始化继承得到的域。然后初始化在后裔类中引入的域。因为构造器总是清除为新的对象分配的存储空间,因此所有的域将以零值(序数类型)、nil(指针和类类型)、空值(串类型)或Unassigned(变体)等开始。因此,除了非零或非空的值之外,没有必要在构造器的实现中对域进行初始化。当通过一个类类型标识符调用时,作为虚拟方法(virtual)声明的构造器等价于一个静态的构造器。不过,与类引用类型组合时,虚拟的构造器允许多态对象构造,即对象构造的类型在编译时是未知的(见类引用)。析构器
     析构器是一个特殊的方法,它用于销毁调用它的对象并释放内存。析构器的声明与过程声明相似,不同的是,析构器的声明以保留字destructor开始。例如:destructor Destroy;destructor Destroy; override;析构器必需使用缺省的register调用约定。尽管一个类可以有多于一个析构器,但还是推荐每个类都覆盖(override)继承的析构器并且不再声明其他的析构器。要调用析构器,必需引用实例对象。例如,MyObject.Destroy;当一个析构器被调用时,析构器实现中指定的动作将被首先执行。典型的操作有,销毁所有由析构器所属对象内含的对象并释放其占用的资源,然后释放分配给析构器所属对象的存储空间。下面是析构器实现的例子。destructor TShape.Destroy;begin  FBrush.Free;  FPen.Free;  inherited Destroy;end;析构器实现中最后一个动作通常是调用继承得到的析构器以销毁对象中继承得到的域。在创建对象对象的过程中,当异常发生时,析构器Destroy会被自动调用以释放未完成的对象。这意味着析构器Destroy必需为释放部分构造的对象做好准备。构造器在执行其他动作之前会对新对象的域置零或空值,而在部分构造的对象中,类类型和指针类型的域总是nil。因此析构器需要在对类类型或指针类型操作之前进行空指针nil的检查。调用Free(在TObject对象中定义)方法优于调用Destroy,因为Free方法提供了在销毁对象之前对nil值的检查。
      

  2.   

    重载过程和函数
     可以在相同的作用域中以相同的名字声明多于一个例程,这叫做重载(overloading)。重载的例程必需以指示字overload声明并且参数列表必需有所区别。例如,考虑如下声明function Divide(X, Y: Real): Real; overload;begin  Result := X/Y;end;function Divide(X, Y: Integer): Integer; overload;begin  Result := X div Y;end;上述声明创建了两个函数,都叫做Divide,接受不同类型的参数。调用Divide时,编译器根据实际传递给调用的参数来决定调用哪一个例程。例如,Divide(6.0, 3.0)调用第一个Divide函数,因为它的参数是实数值。在所有的例程声明中,可以向重载的例程传递类型不等同的参数,但对参数赋值兼容且多于一个声明的重载例程除外。这通常出现在不同整数类型或不同实数类型的重载例程中。例如,procedure Store(X: Longint); overload;procedure Store(X: Shortint); overload;在这些情况下,没有多义性的重载是可能的,编译器将调用参数类型与实际参数适应并且参数类型范围最小的例程。(实数值的常量表达式总是Extended类型。)重载的例程必需在其接受的参数个数或参数类型上有所区别。因此,下面这一对声明会导致编译错误:function Cap(S: string): string; overload; ...procedure Cap(var Str: string); overload; ...而下面的声明是合法的。function Func(X: Real; Y: Integer): Real; overload; ...function Func(X: Integer; Y: Real): Real; overload; ... 当一个重载的例程被声明为forward(向前声明)或接口声明时,其定义声明必需重申例程的参数列表。 编译器能够区分重载例程之间相同参数位置包含的AnsiString/PChar和WideString/WideChar参数。传递到此类重载情形的串常量或串文本被转换到本地的串或字符类型,即AnsiString/PChar。例如,  procedure test(const S: string);  overload;  procedure test(const W: WideString); overload;  var      a: string;      b: Widestring;  begin     a := 'a';     b := 'b';     test(a);    //调用String版本     test(b);    //调用WideString版本     test('abc');    //调用String版本     test(WideString('abc'));   //调用WideString版本  end; 变体也可以作为参数用于重载例程的声明。变体被认为比任何简单类型都通用。编译器总是优先选择精确匹配,而最后考虑变体匹配。如果一个变体传递到这样的重载情形,并且存在一个相应参数位置接受变体参数的重载例程,那么编译器将认为这是变体类型的精确匹配。这可能对浮点类型导致一些细微的影响。浮点类型以尺寸匹配。对于传递到重载例程中的浮点变量,如果没有精确匹配,但存在可用的变体参数,那么传递的参数将被作为变体接受,而越过任何较小的浮点类型。例如:  procedure foo(i: integer); overload;  procedure foo(d: double);  overload;  procedure foo(v: variant); overload;  var    v: variant;  begin    foo(1);       //integer版本    foo(v);       //variant版本    foo(1.2);     //variant版本(浮点数,作为extended类型解释)  end;在上面的例子中,调用了例程foo的variant版本而没有调用double版本,是因为常量1.2暗指extended类型,该类型对于double不是精确匹配的。Extended类型与变体也不是精确匹配,但变体被认为是更通用的类型(尽管double是一个比extended更小的类型)。foo(Double(1.2));上面的类型转换不会工作。需要用类型常量代替:const  d: double = 1.2;  begin     foo(d);  end;上面的代码是正确的,并且调用了double版本。  const  s: single = 1.2;  begin     foo(s);  end;上面的代码也调用double版本,因为Single比变体更适合double。声明一套重载的例程时,避免浮点参数作为变体接受的最佳途径是,与变体版本一起,为每个浮点类型(Single、Double、Extended)声明一个重载例程的版本。如果在重载例程中使用缺省参数,那么需要注意不明确的参数标记。更多信息见缺省参数和重载例程。调用一个例程时,可以通过限定例程名来限制潜在影响。例如,Unit1.MyProcedure(X, Y) 仅可以调用在单元Unit1中声明的例程;如果单元Unit1中没有例程名和参数列表都相匹配的例程,那么将导致错误。
      

  3.   

    构造;一个类的CREATE方法,也就是分配内存;
    析构:一个类的FREE,释放内存;
    重载:函数的充载只是不同参数个数或类型,OVERLOAD
    虚函数:基类里不需要实现的方法,子类实现;
    消息:MESSAGE
    句柄:一个窗口在WINDOWS中的表示;
      

  4.   


    outer2000(天外流星) 的回答能让人理解,就是太简单了 还有么?
      

  5.   

    多着呢。找本书不就OK了。或者到网上下一个电子书《Object Pascal》就行了。
      

  6.   

    我刚刚在如下版面(★★★★★Delphi编程经验总结★★★★★)发布了一的面向对象的编程实例(高速公路THighWay),你可以去看一看,也许对你理解问题有所帮助。
      

  7.   

    建议你去买本书,叫做《DELPHI高手突破》,清大出版社的,作者申旻