类中包含字段,方法,属性(属性包含事件);字段是靠方法组织 与操作的;属性也只是方便和规范了字段与方法的使用。
先从非类中的方法谈起;离开类的怀抱,我们更喜欢把方法叫做过程或函数。
//要点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】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/28917
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!