?? 函數的字符參數加不加const關鍵字有何區別 (2000年.txt
字號:
函數的字符參數加不加const關鍵字有何區別 (2000年11月29日)
本站更新 分類: 作者:Delphi大富翁 推薦: 閱讀次數:525
(http://www.codesky.net)
--------------------------------------------------------------------------------
函數的字符參數加不加const關鍵字有何區別(100分)
問題的分類是:Object Pascal , 分壇主: menxin, 分壇主: cAkk
來自:yinglw 時間:00-5-14 23:30:41 ID:244936
function sendmessage(msg:string);
與
function sendmessage(const msg:string);
有何區別?
--------------------------------------------------------------------------------
來自:沈前衛 時間:00-5-14 23:59:04 ID:244963
你為何不侃侃Delphi的幫助呢?
Using const allows the compiler to optimize code for structured- and
string-type parameters. It also provides a safeguard against
unintentionally passing a parameter by reference to another routine.
Here, for example, is the header for the CompareStr function in the
SysUtils unit:
function CompareStr(const S1, S2: string): Integer;
Because S1 and S2 are not modified in the body of CompareStr, they
can be declared as constant parameters.
--------------------------------------------------------------------------------
來自:zensst 時間:00-5-15 01:09:56 ID:245039
好象是這樣的:
在Delphi中,String 已經是一個指針了。通過ViewCPU可以發現,如果加了
Const ,僅僅傳遞指向 String 的指針;而不加 Const,卻傳遞的是指向 String
結構的指針,通過 LStrAddRef等方法取的 String 做為參數,機器碼多了很多。
--------------------------------------------------------------------------------
來自:老屯 時間:00-5-15 01:15:12 ID:245045
對于字符串,沒有什么區別
對于數值有點區別
比如說你用了一個整數常熟在一個過程里,可以使用該常數定義數組下標
procedure Test(const n: integer);
var
narray: array [0..n] of something;
begin
end;
另外說明為常數在子程序中只能作為常數使用,不能作為局部變量改變它的值
procedure test(const n: integer);
begin
n := n + 3; //這是不允許的
end;
procedure test(n: integer);
begin
n := n + 3; //這是允許的,n相當于過程里面的局部變量
end;
--------------------------------------------------------------------------------
來自:yinglw 時間:00-5-20 10:14:23 ID:248907
當我這樣寫的時候
function sendmessage(const msg:string);
調用此函數時可以用字符數組
var
arr: array[0..10] of char;
begin
StrCopy(arr,'test');
sendmessage(arr);
end;
不知這種用法是否比較安全可靠,符合規范
--------------------------------------------------------------------------------
來自:zensst 時間:00-5-20 14:18:41 ID:249074
不明白
--------------------------------------------------------------------------------
來自:zensst 時間:00-5-20 14:25:01 ID:249083
是對的。
--------------------------------------------------------------------------------
來自:color 時間:00-5-20 15:42:31 ID:249150
對數值型意義不大,因為DELPHI總優先使用寄存器傳值。
對字符串型,CONST只傳遞該字符串的指針,以后程序不可修改此字符串,
無CONST,DELPHI要先將該STRING傳到內部堆中,以利于修改,并不影響
原先的STRING。
當不想發展該STRING進行修改時,應優先使用(CONST s:STRING)
--------------------------------------------------------------------------------
來自:WuWZY 時間:00-5-21 15:35:00 ID:250038
const可以保護變量在子程序中不改變
而且它是傳址的,對于大的紀錄,速度快!
--------------------------------------------------------------------------------
來自:buptwqs 時間:00-5-21 16:21:39 ID:250061
加了const的在傳參數時是傳一個常量值,而不是一個變量;
不加const的是傳一個變量值,但變量的值在過程中不改變。
--------------------------------------------------------------------------------
來自:cch_b 時間:00-5-21 16:55:44 ID:250084
說得過于復雜了,簡單說,加了那個的話在函數中就無法修改msg了,
--------------------------------------------------------------------------------
來自:敏哥 時間:00-6-4 13:49:53 ID:259752
以上各位說法有不少錯誤,糾正如下:
Const參數的傳遞方式與參數類型相關,有數值傳送和地址傳送兩種。對于結
構類型、串類型(包括短串)、Variant、動態數組,Const參數傳遞的是地址,
比無Const參數傳遞效率高。
長串實際上是個隱含的指針,長串參數的傳遞方式比較特殊,無論有無Const
都只傳遞長串的指針值,它指向動態分配內存區(堆)。有Const的長串參數在
函數內是只讀的,無Const的長串參數在函數內部可修改,雖然它與實參指向同
一快內存,但由于長串具有“copy-on-write”特性,在對長串形參進行修改前
將復制出新的長串,故不影響實參。
短串參數也只傳遞32bit的指針,無Const時,函數將在堆棧中預留的256Byte
空間內復制出新的短串,作為形式參數使用。
總之,Var參數一律只傳地址;有Const的參數是只讀的;無Const的參數復制
于堆棧中,象局部變量一樣可讀可寫,不影響實參。
--------------------------------------------------------------------------------
來自:千中元 時間:00-6-4 14:06:36 ID:259764
yinglw請在最后給我一分
--------------------------------------------------------------------------------
來自:敏哥 時間:00-6-4 21:41:57 ID:259976
調用函數/過程時,要求形參和實參賦值兼容。
字符數組可以直接賦給長串、短串,但長串、短串及PChar都不能直接賦給字
符數組;當{$X+}擴充語法打開時,索引下界為零的字符數組可以直接賦給
PChar,也可以接受字符串常量的賦值。字符串和字符數組之間的轉換由編譯器
自動調用System單元的一些匯編函數實現,如:_ArrayToPasStr、_LStrFromArray。
所以調用sendmessage函數時可以用字符數組,是符合Object Pascal語法的。
function sendmessage(const msg:string);
var
arr: array[0..10] of char;
begin
StrCopy(arr,'test');
sendmessage(arr);
end;
--------------------------------------------------------------------------------
來自:Kang 時間:00-6-4 21:49:35 ID:259980
對字符串用const有個最大的好處,能優化
--------------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -