理解delphi的类—方法

类中包含字段,方法,属性(属性包含事件);字段是靠方法组织 与操作的;属性也只是方便和规范了字段与方法的使用。

  先从非类中的方法谈起;离开类的怀抱,我们更喜欢把方法叫做过程或函数。

//要点1: 过程用procedure定义,函数用function定义;过程没返回值,函数有返回值

procedure MyProc;
begin
  ShowMessage('ok');
end;

function MyFun: string;
begin
  Result := 'ok';
end;
//过程和函数都可以有一个或多个参数;参数用;号分开

procedure MyProc(i: Integer);
begin
  ShowMessage(IntToStr(i));
end;

function MyFun(x: Integer; y: Integer): Integer;
begin
  Result := x + y;
end;

//要点3: 在调用时, 参数使用 , 分割的
function MyFun(x: Integer; y: Integer): Integer;
begin
  Result := x + y;
end;

{调用}
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  i := MyFun(1,2);
end;

要点4: 多个相同类型的参数可以简化写法
function MyFun(str: string; x,y,z: Integer): string;
begin
  Result := str + IntToStr(x + y + z);
end;

//要点10: 过程和函数都可以有一个或多个默认参数; 但必须在非默认参数后面
function MyFun(s1: string; s2: string='好人'): string;
begin
  Result := s1 + s2;
end;

{调用}
procedure TForm1.Button1Click(Sender: TObject);
var
  str1,str2: string;
begin
  str1 := '万一';
  str2 := '坏蛋';

  ShowMessage(MyFun(str1));      {万一好人}

  ShowMessage(MyFun(str1,str2)); {万一坏蛋}
end;

//要点11: 参数可以分为: 默认参数(传值)、var(传址)(比如C++中的指针变量或引用)、out(输出)、const(常数)四类

{默认参数是传值, 不会被改变}
function MyF1(x: Integer): Integer;
begin
  Inc(x);
  Result := x;
end;

{var参数是传址, 会被改变}
function MyF2(var x: Integer): Integer;
begin
  Inc(x);
  Result := x;
end;

{out参数是为支持Com的, 和 var 的结果是一样的, 一般我们用不着它}
function MyF3(out x: Integer): Integer;
begin
  Inc(x);
  Result := x;
end;

{const参数是绝对不可以赋值的, 这是被编译器优化的方式, 尽量多用}
function MyF4(const x: Integer): Integer;
begin
  //Inc(x); {这句会出错, 因为带 const 前缀的参数是不可以更改的}
  Result := x;
end;


//调用测试
procedure TForm1.Button1Click(Sender: TObject);
var
  a: Integer;
begin
  a := 6; MyF1(a);
  ShowMessage(IntToStr(a));  //6

  a := 6; MyF2(a);
  ShowMessage(IntToStr(a));  //7

  a := 6; MyF3(a);
  ShowMessage(IntToStr(a));  //7

  a := 6; MyF4(a);
  ShowMessage(IntToStr(a));  //6
end;
 
//静态数组做参数, 不能这样使用:
function MyFun(arr: array[0..9] of Integer): Integer;
var
  i: Integer;
begin
  Result := 0;
  for i in arr do Result := Result + i;
end;
 
//应该先把数组定义成一个类型
Type
  IntArray = array[0..9] of Integer; {先把需要的数组定义成一个类型}

 
//给一个静态数组求和的函数

function MyFun(arr: IntArray): Integer;
var
  i: Integer;
begin
  Result := 0;
  for i in arr do Result := Result + i;
end;


{测试}
procedure TForm1.Button1Click(Sender: TObject);
const
  intArr: IntArray = (1,2,3,4,5,6,7,8,9,10);
var
  x: Integer;
begin
  x := MyFun(intArr);       {调用函数}
  ShowMessage(IntToStr(x)); {55}
end;
 
{现在这个函数并没有 var 前缀, 也就是说参数应该不会被修改的}  
function MyFun(p: PInteger): Integer; {PInteger 是 Integer 的指针类型}
begin
  p^ := p^ * 2;
  Result := p^;
end;


{测试}
procedure TForm1.Button1Click(Sender: TObject);
var
  i,x: Integer;
begin
  i := 8;

  x := MyFun(@i);           {调用函数}
  ShowMessage(IntToStr(x)); {16}

  {现在 i 的值应该不会被修改, 但...}
  ShowMessage(IntToStr(i)); {16}

{
  没有 var 或 out 前缀的参数, 应该是传值的;
  有 var 或 out 的参数是传地址的;
  
  指针就是一个地址, 尽管没有指定传地址, 但事实上就是给了一个地址, 
  所以参数值也会改变!
}
end;

{给这个函数可以赋常数变量}
function Fun1(x,y: Integer): Integer;
begin
  Result := x + y;
end;

{这个函数不能赋予常数变量}
function Fun2(var x,y: Integer): Integer;
begin
  Result := x + y;
end;

{测试}
procedure TForm1.Button1Click(Sender: TObject); var
  i,a,b: Integer;
const
  j = 6;
  k = 8;
begin
  i := Fun1(1,2);
  ShowMessage(IntToStr(i)); {3}

//i := Fun2(1,2); {这样是 Fun2 是错误的, 它的参数是传地址的, 必须用变量}
//i := Fun2(j,k); {这样也不行}

  {应该:}
  a := 2;
  b := 4;
  i := Fun2(a,b);
  ShowMessage(IntToStr(i)); {6}
end;

原文链接: https://www.cnblogs.com/hxy00/archive/2011/07/18/seven.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    理解delphi的类---方法

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/28917

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午6:20
下一篇 2023年2月8日 上午6:21

相关推荐