這裡簡單的描述Object的語法中的基本內容,數據類型。因為代碼是自描述的所以不廢話,直接貼代碼。
{ 用戶自定義類型
1、數組
2、動態數組
3、記錄
4、集合
}
program UserDefine;
{$APPTYPE CONSOLE}
uses
SysUtils;
{ 記錄
1、記錄相當於C語言中的結構體
2、記錄類型通過 type 和 record 關鍵字來定義
3、記錄類型要在使用前定義,通常放在 var 定義之前說
4、可以定義可變記錄類型,可變記錄類型就和C語言中的unio類型類似
}
//定義一個記錄類型
type
person = record
name:string;
id :integer;
end;
{ 定義可變記錄類型
1、注意定義可變記錄的關鍵字 record
2、case 注意定義的形式和語法, 其中,case後面沒有配對的關鍵字
}
TvariantRecord = record
nullStr:pchar;
intField:integer;
case integer of
0:(D:double);
1:(I:integer);
2:(C:char);
end;
{ 集合
1、集合就是和代數中的集合一樣理解, 有點類似於C/C++中的枚舉
2、集合可以進行求交集、並集等操作
3、集合的定義通過 set 來實現
4、集合最大只能容納 256 各元素
5、集合只能用在序數類型定義,字符串、實數等不能定義
}
TCharSet = set of ansichar;
TWeekSet = set of 0..7 ; //定義星期的集合
//TSingleset = set of single; 這個定義要注意
var
{ 數組
1、數組的下標可以不必從默認的 0 開始,可以從其他數值開始
2、通過 Low 和 High 函數可以求出不從0開始的數組下標的下界和上界
3、多維數組的定義通過逗號在數組定義的 [一維長度,二維長度,...]
}
//定義一個數組數組相當於C語言中的 int nArray[8]
//下表從 0 開始,到7 結束
nArray:array[0..7] of integer;
//定義一個數組 相當於C語言中的 char chArray[8]
//下表從 1 開始,到 8 結束
chArray:array[1..8] of ansichar;
//定義一個3元素的數組
fArray:array[10..12] of real;
//定義一個多維數組
nMatrix:array[1..2,1..2] of integer;
{ 動態數組
1、動態數組是在編譯期間不能確定維數的數組,需要在運行時確定維數的數組
2、動態數組在使用前必須先分配內存空間
3、注意在兩個不同行定義的動態數組的類型不一樣,如下所示
4、多維動態數組
}
nDynamicArray:array of integer;
//下面兩個動態數組類型一樣
nA1,nA2:array of integer;
{ 下面兩個動態數組類型不一樣
nA1:array of integer
nA2:array of inter
}
nA3,nA4:array of integer;
nA5:array of array of integer;
nA6:array of array of integer;
//定義一個record類型變量,注意這裡不需要關鍵字record
p1:person;
p2:person;
p3:person;
{ 可變記錄
1、可變記錄的聲明和定義與其他變量的定義一樣
}
variRecord:TvariantRecord;
{ 集合變量
1、集合的定義與其他數據類型一致
2、集合變量的賦值和初始化必須使用 [ ], 集合成員之間用逗號隔開
}
charSet:TCharSet = ['a','b'];
charSet_1 : TCharSet = ['b','c','d'];
weekSet:TWeekSet = [0];
begin
//引用
nArray[0]:= 10;
{ 引用chArray[0] 錯誤,因為下標從1開始
chArray[0] := 'a';
}
//通過函數 Low 和 High 返回下界和上界
nArray[1]:=Low(fArray);
//注意數組的上界
nArray[7]:=High(fArray);
//訪問二維數組中的元素,注意Delphi中多維數組訪問元素的與C語言中的差別
nMatrix[1,1] := 1;
nMatrix[1,2] := 2;
nMatrix[2,1] := 3;
nMatrix[2,2] := 4;
{ 訪問動態數組
1、首先必須申請內存
2、然後就可以和靜態數組一樣訪問,此時的數組下標從0開始,需要注意
3、動態數組是生存期管理類型,即超過生存期後,就由系統自動回收
4、可以通過將動態數組賦值為 nil 就可以提前回收內存。
5、動態數組時引用類型,有點類似於ansistring
}
SetLength(nDynamicArray,30);
nDynamicArray[0]:= 10;
writeln(Low(nDynamicArray));
Writeln(High(nDynamicArray));
//手動回收內存
nDynamicArray := nil;
//nDynamicArray[0]:= 10; //因為訪問錯誤的內存,因此會提前退出程序運行
SetLength(nA1,2);
nA2 := nA1;
nA1[0] := 10;
nA2[0] := 23;
//因為nA2是nA1的引用,所以 nA1[0] 也等於23
writeln(nA1[0]);
{
1、注意下面的一段代碼與前面代碼的區別,上面 nA1與nA2引用同一段內存
2、下面nA3和nA4指向不同的代碼。
}
SetLength(nA3,2);
nA3[0] := 14;
nA4 := copy(nA3);
nA4[0] := 15;
writeln(nA3[0]);
{ 多維動態數組
1、多維動態數組和一維動態數組一樣,使用之前被必須申請空間,賦值和copy也會
分配空間。
2、多維動態數組可以分多次給各維申請空間
}
//單次分配一維的空間
setlength(nA5,1);
//單次分配全部兩維的空間
setlength(nA6,1,1);
//訪問記錄變量
p1.name := 'volacanol';
p1.id := 512;
//記錄的直接賦值
p2 := p1;
//通過with語句賦值記錄的成員
with p3 do
begin
name := 'cnblogs';
id := 100;
end;
// 引用可變記錄
variRecord.nullStr := 'This is null string field.';
variRecord.intField := 10;
// 下面是可變記錄的可變域,是double類型
variRecord.D := 10.0 ;
writeln(variRecord.D);
// 下面是可變記錄的可變域,是integer類型
variRecord.I := 5;
writeln(variRecord.I);
// 下面是可變記錄的可變域,是char 類型
varirecord.C := 'a';
writeln(variRecord.c);
// 用 with 語句來初始化可變記錄的域,這個與
with variRecord do
begin
nullStr :='This is null string field.';
intField := 19;
d := 13.0 ;
i := 6 ;
c := 'b';
end;
writeln(variRecord.D); // 輸出為13.0 為巧合
writeln(variRecord.I); // 輸出為 98 是因為 b ascii 碼值 == 98
writeln(variRecord.c); // 最後輸出為 b 才是正確的
{ 集合的操作
1、判斷元素是否在集合裡面, 通過關鍵字 in 來實現
2、集合的並集
3、集合的交集
4、往集合中增加元素
5、從集合中刪除元素
}
//判斷元素是否在集合裡面
if 'a' in charSet then
begin
writeln('a is in charSet');
end;
// 集合的並集
if 'b' in (charSet + charSet_1 ) then
begin
writeln('b is in charSet + charSet_1');
end;
// 集合的交集
if 'd' in (charSet * charSet_1 ) then
begin
writeln('d is in charSet * charSet_1');
end;
//通過 Include 和 Exclude 函數或者 + - 運算符增刪結合中的元素
//注意集合元素必須用 [ ]
charSet := charSet + ['y'];
if 'y' in charSet then
begin
writeln('y is in charSet.');
end;
// 通過 Include 函數增加集合元素, 注意 include 函數中集合元素
// 不需要 [ ] 來表示。
Include(charSet,'x');
if 'x' in charSet then
begin
writeln('x is in charSet.');
end;
//通過Exclude刪除集合元素
Exclude(charSet,'x');
if not ('x' in charSet) then
begin
writeln('after exclude x is not in charSet');
end;
readln;
end.
歡迎轉載,轉載請注明來源。