⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 函数的字符参数加不加const关键字有何区别 (2000年.txt

📁 自己对DELPHI学习的一点体会
💻 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 + -