發現Delphi中關於函數參數部分的內容還是比較多的,暫時說到這篇隨筆為止吧,以後再繼續討論一下函數的參數部分的內容。
一 工程文件
program DefaultParameter;
{$APPTYPE CONSOLE}
uses
SysUtils,
Unit1 in 'unit1.pas';
var
nVar:integer;
strVar:string;
i:integer;
nVarArray:array of integer;
begin
{
1、 調用具有默認參數的方法
}
//不提供參數
unit1.defaultParameter(10);
//提供參數
unit1.defaultParameter(10,'volcanol');
//調用無類型參數的函數
{
1、constant object cannot be passed as var paramter
}
//WriteLn(noTypeParameter('100')); //這樣無法調用
nVar := 100;
WriteLn(noTypeParameter(nVar));
//轉換時出現了異常,因此不建議使用無類型參數
strVar:= '100';
WriteLn(noTypeParameter(strVar));
//調用短字符串類型參數的函數
for i := 0 to sizeof(ShortString) do
begin
strVar[i]:='a';
end;
shortSringParameter(strVar);
//如果將 string類型的變量傳遞給 shortString 類型變量會自動截斷
for i := 0 to sizeof(ShortString) + 128 do
begin
strVar[i]:= 'a';
end;
shortSringParameter(strVar);
//動態數組參數
try
SetLength(nVarArray,10);
WriteLn(Low(nVarArray));
WriteLn(High(nVarArray));
for i := Low(nVarArray) to High(nVarArray) do
begin
nVarArray[i] := i;
end;
WriteLn(High(nVarArray));
arrayParameter(nVarArray);
except
on E:Exception do
ReadLn;
end;
ReadLn;
ReadLn;
end.
二、單元文件
{ 參數
1、默認參數
2、無類型參數
3、短字符串參數
4、數組參數
}
{
1、 和其他的OOP編程語言一樣,Delphi的Object Pascal語言也支持方法和函數的
默認參數機制
2、 默認參數在某些場合非常適用,當一些方法、函數的參數在不同的場合調用時
均具有同樣的設置時,就可以設置為默認參數
3、 如何函數參數設置過默認參數,那麼在調用的時候就可以不提供實際參數
}
unit Unit1;
interface
{
單元文件的結構需要注意
}
uses
SysUtils;
{
單元文件中, type類型定義必須在 uses 子句後面
}
type
PInt=^integer;
{ 默認參數
1、默認參數的定義的規則與C++裡面默認參數的規則類似
2、默認參數定義的形式參數必須從最後一個參數開始,及從右往左定義
3、如果一個參數定義了默認參數,則其後面的參數均需要定義默認參數
4、如果在一個類型中定義了多個形式參數,則這些形式參數均不能定義默認參數
5、
}
procedure defaultParameter(nVar:integer;varStr:string='Delphi');
{ 無類型參數
1、無類型參數就是例程聲明時形式參數不指定形式參數的類型
2、無類型參數定義時必須用關鍵字var、const、out之中的一個
3、無類型參數不能使默認的傳值方式
4、在使用無類型參數時,必須將參數進行類型轉換後才能使用
5、調用時需要注意存在一些限制
A) 整型字面值不能傳遞給無類型參數
B) 無類型的整型值不能傳遞給無類型參數
6、由於無類型參數在轉換的時候存在太多的限制,建議一般不要使用這種類型的定義
方法
}
function noTypeParameter(var noTypeVar):string;
{ 短字符串參數
1、 短字符串類型 ShortString 是255字節長度的字符串類型
2、 可以通過 string[length] 的方法定義指定長度小於255字節的字符串類型
varStr:string[255]; 就是定義一個長度最大為255字節的字符串變量
3、 形式參數不能用 string[length] 的方式定義 ,如果需要的話就必須定義新的
數據類型
3、 2010以後 string默認為WideString, 需要打開開關才能使 AnsiString類型
}
procedure shortSringParameter(strVar:ShortString);
{ 數組參數
1、數組分為靜態數組、動態數組,還有一種數組類型 開發數組
2、靜態數組定義為
nVarArray:array[1..10] of integer; //在定義的時候自定數組維度
3、動態數組定義為
定義動態數組類型
nVarArray:array of integer; //定義時不指定數組的維度,
使用前用 SetLength(數組名,第一維的長度,第二維的長度,) 函數申請
數組空間。
3、數組參數在定義時不能指定數組的維度和大小,要使用指定類型的參數,則必須定義
新的數據類型
4、還可以使用開放數組形式定義數組參數
}
procedure arrayParameter(nVarArray:array of integer);
implementation
procedure defaultParameter(nVar:integer;varStr:string='Delphi');
var
str:string;
begin
str := 'Hello ' + varStr;
WriteLn(str);
end;
function noTypeParameter(var noTypeVar):string;
var
str:string;
begin
//將 noTypeVar 無類型參數轉換為整型數
str:= IntToStr(integer(noTypeVar));
//隱含的變量 result 返回函數值
result := str;
end;
procedure shortSringParameter(strVar:ShortString);
begin
WriteLn(strVar);
end;
{
1、下面的函數執行的過程中還存在一定的問題,需要繼續研究一下
2、動態數組的上、下界最好通過Low()、High()函數來求取,所以與 C/C++ 有一點區別
}
procedure arrayParameter(nVarArray:array of integer);
var
i:integer;
begin
WriteLn(Low(nVarArray));
WriteLn(High(nVarArray));
for i := Low(nVarArray) to High(nVarArray) do
begin
//WriteLn(IntToStr(nVarArray[i])); //這樣編譯就會出錯,原因??
WriteLn(nVarArray[i]) ;
end;
end;
end.
歡迎轉載本系列文章,轉載請注明來源。