Delphi 학습 4일차

5701 단어 귀속함수.Delphi
오늘부터 예전에 넘지 못했던 고비에 부딪히기 시작했다.어쩌면 내 마음속의 두려움일지도 모른다.
기본 문법에서 실제 응용으로의 과도는 매우 힘들다고 느낀다.
오후에는 효율이 매우 낮아서 줄곧 이 노드에서 갈등하고 있다.
돌파를 하려면 이 고비를 반드시 넘어야 한다.마음을 가라앉히고 천천히 생각하라.다 잘 될 거야.
우선, 돌아가는 문제 하나가 나로 하여금 오랫동안 고민하게 하였는데, 저녁에 마침내 그것을 해결하였다.
1. 귀속 함수의 사용
먼저 코드를 첨부합니다.
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  Alpha:Integer;
  procedure Test2(var A:Integer);forward
  //Test2        
procedure Test1(var A:Integer);
begin
  A:=A-1;
  if A>0 then
    Test2(A);      //     ,        Test2
  writeln(A);
end;
procedure Test2(var A:Integer);   //      Test2     
begin
  A:=A div 2;
  if A>0 then
    Test1(A);            // Test2         Test1
end;

begin
  { TODO -oUser -cConsole Main : Insert code here }
  Alpha:=15;              // Alpha   
  Test1(Alpha);           //     Test1,    
end.

출력 결과는 다음과 같습니다.
0
0
0
0
당시 이 결과에 대해 줄곧 이해하지 못했는데, 결과는 왜 0이 아니었을까 생각했다.
나중에 많은 자료를 찾아보고 마침내 깨달았으며 귀속에 대한 이해도 깊어졌다.
먼저 유용한 자료 출처를 동봉합니다: 귀속 상해
함수Test1(15)에서 판단문장을 통해Test1(7),Test1(3),Test(1)가 생성됩니다. 이때Test1(15)의 귀속 호출이 끝나고 출력 결과가 0입니다.이때는 끝나지 않았다.그러면 제어권이 Test1(7)로 돌아갑니다.
같은 위의 과정 출력 결과 0.이런 식으로 유추하면 4개의 0을 얻을 수 있다.
보충 귀속의 기본 원리:
1 함수 호출마다 한 번씩 되돌아옵니다. 프로그램이 특정한 등급의 귀환의 끝에 실행될 때, 이전 등급의 귀환으로 옮겨져 계속 실행됩니다.
2 귀속 함수 중 귀속 호출 전에 있는 문장과 각급 피조 함수는 같은 순서를 가진다.
3 각 단계의 함수 호출은 모두 자신의 사유 변수를 가지고 있다.
4 귀속 함수 중 귀속 호출 문장 뒤에 있는 문장의 집행 순서는 각 호출 함수의 순서와 상반된다.
5 각 단계마다 자신의 변수가 돌아가지만 함수 코드는 복제되지 않는다.
6 귀속 함수에는 귀속 호출을 중지할 수 있는 문장이 포함되어야 한다. 2. 클래스의 정의와 사용 방법
클래스의 사용 절차: (1) 클래스를 설명하는 변수 - - - 클래스를 데이터 형식으로 볼 수 있습니다.(클래스의 변수를 성명한 후에 실제적으로 클래스를 만드는 대상이 아니라 종이 상자와 클래스의 대상을 정의하는 지침을 클래스의 인용이라고 한다) (2) 클래스의 특수한 함수인 구조 함수를 호출하여 초기화 작업을 한다. 예를 들어 클래스의 구조에 따라 메모리 자원을 분배하고 대상의 생성을 완성한다.(3) 클래스의 실례 - 대상을 조작하고 사용한다.대상의 속성을 수정하거나 대상을 호출할 수 있는 방법입니다.(4) 사용이 완료되면 클래스의 또 다른 특수 함수인 분석 함수를 호출하여 창설된 대상을 삭제하고 해당하는 메모리 자원을 방출한다.또한 Free 프로세스를 호출하여 객체가 차지하는 리소스를 방출할 수도 있습니다.
클래스의 정의 형식:
type ClassName=Class(AncestorClass)
                Memberlist
end;
클래스의 상속 형식:
type
         TForm1=Class(TForm)
end;
program UseClass;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TPerson=class
public
  Name:string;
  function GetAge:Integer;
  procedure SetAge(A:Integer);
private
  Age:Integer;
end;
  TEmployee=class(TPerson)
public
  Salary:integer;
  DeptName:string;
  procedure Infor;
  procedure SetSalary(A:Integer);
end;
  TCustomer=class(TPerson)
public
  AddressName:string;
  procedure Infor;
  constructor Create(Str:string);
  destructor Destroy;override;//     
end;
function TPerson.GetAge:Integer;
begin
  Result:=Age;
end;
procedure TPerson.SetAge(A:Integer);
begin
  Age:=A;
end;
procedure TEmployee.SetSalary(A:Integer);
begin
  Salary:=A;
end;
procedure TEmployee.Infor;
begin
  writeln('  : ',Name,'  : ',GetAge,'   : ',DeptName,'  : ',Salary);
end;
procedure TCustomer.Infor;
begin
  writeln('  : ',Name,'  : ',GetAge,'   : ',AddressName);
end;
constructor TCustomer.Create(Str:string);
begin
  inherited Create;
  writeln('          。');
  AddressName:=Str;
end;
destructor TCustomer.Destroy;
begin
    writeln('   : ',Name,'         。');
    inherited Destroy;
end;
var
  E1:TEmployee;
  C1:TCustomer;
begin
  { TODO -oUser -cConsole Main : Insert code here }
  E1:=TEmployee.Create;  //             
  E1.Name:='    ';
  E1.SetAge(23);   //  SetAge,  GetAge?
  E1.SetSalary(2000);  //    SetSalary?
  E1.DeptName:='    ';
  E1.Infor;    //      
  E1.Destroy;    //         
  C1:=TCustomer.Create('   ');  //          (      )
  C1.Name:='   ';
  C1.Age:=45;
  //        
  C1.Infor;    //      
  C1.Destroy;    //          (       )
  readln;
end.


결과 출력:
성명: 이병 연령:23부서: 대출부 월급:2000 고객류의 구조 함수 호출.이름:장력연령:45주소:북일로 이름:장력고객류 대상 삭제.위의 절차에 대한 몇 가지 설명:
4
  • Tperson 클래스는 기본적으로 TObject 클래스에서 파생된 다음에 두 개의 하위 클래스가 파생되었다. 그것이 바로 TEmployee,TCustomer이다.TEmployee, TCustomer 두 클래스는 TPerson 클래스의 Age, Name 속성, GetAge 함수와 Setage 프로세스를 계승합니다

  • 4
  • TEmployee는 TPerson 기능을 확장하고 Salary, DeptName 속성, Info, SetSalary 프로세스를 추가했습니다

  • 4
  • TCustomer 클래스는 TPerson 클래스를 확장하고 Address 속성, Info 프로세스를 추가했다.또한 구조 함수와 분석 함수를 사용자 정의했다

  • 4
  • 구조 함수를 호출하는 방법은 분석 함수를 호출하는 방법과 달리 전자는'류의 구조 함수'를 사용하고 후자는'대상의 분석 함수'를 사용한다

  • 3. 정적 방법의 사용
    program Project1; 
    {$APPTYPE CONSOLE} 
    type 
      TPerson = class    //  
      procedure Infor;    //    
    end; 
    TEmployee = class(TPerson)  //   
    procedure Infor;    //      
    end; 
    procedure TPerson.Infor;  //      TPerson  Infor 
    begin 
      Writeln ('TPerson.Infor'); 
    end; 
    procedure TEmployee.Infor;  //      TEmployee  Infor 
    begin 
      Writeln('TEmployee.Infor'); 
    end; 
    var 
      P1: TPerson;    //         
      E1: TEmployee;    //          
    begin 
      P1:=TPerson.Create;
      P1.Infor;    //    TPerson  Infor 
      P1.Destroy; 
      P1:=TEmployee.Create; 
      P1.Infor;    //    TPerson  Infor 
      TEmployee(P1).Infor;  //    TEmployee Infor 
      P1.Destroy; 
      E1:=TEmployee.Create; 
      E1.Infor;    //    TEmployee  Infor 
      E1.Destroy; 
    end. 

    실행 결과는 다음과 같습니다.
    TPerson.Infor
    TPerson.Infor
    TEmployee.Infor
    TEmployee.Infor
    --------------------------------------------------------------------------------
    바보같이 분간할 수 없다.
    함수와 프로세스의 차이: 프로세스는 되돌아오는 값이 없고 함수는 되돌아오는 값이 있다.
    매개변수 전달 순서: Pascal 언어는 왼쪽에서 오른쪽으로 순차적으로 표시됩니다.
    구조 함수와 분석 함수, 내가 먼저 생각한 것은create,destroy인데 구체적인 차이에 대해서는 써봐야 알 수 있다.
    안녕히 주무세요.
    기분 전환, 내일 GO ON.

    좋은 웹페이지 즐겨찾기