函数里的const怎么理解?

agui 2003-11-17 02:47:59
比如函数原型
function MidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString; overload;

const表意常量??
---------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
var
x,y: string;
begin
x := 'asdf';
y := ' aaa ';
showmessage(midstr(x,1,2));
showmessage(trim(y));
end;
-----------------------------------------------------
测试如上通过,用的是变量。记得以前有用一些函数,要求参数必须为字符串常量,应该没有记错,还要是用类型转换函数。

请达人解释一下。
另外字符串变量转换为字符串常量用什么函数?(或者我的问法不太正确?)

...全文
24 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
agui 2003-11-18
  • 打赏
  • 举报
回复
看看我的示例代码,调试通过了,没有用常量。
zhaolee 2003-11-18
  • 打赏
  • 举报
回复
帖一段別人的。

var s: string; 表示这个参数在函数/过程中可以修改,并且修改会影响原始字符串。
const s: string; 表示这个参数在函数/过程中是只读的。不能修改。
s: string; 表示这个参数在函数/过程中可以修改, 但修改不会影响源串。

在delphi中, 这三种定义传递参数时都是将源串的地址传入函数/过程的。
但怎么实现三种不同的功能呢? 这全是编译器的功劳。

对var s: string; 编译器不做什么判断。
对const s: string; 编译器分析您写的代码。发觉如果有试图修改s字符串的代码时,编译时将弹出一个错误而使编译失败。
对s: string; 这种编译器分析您的代码, 发觉如果有修改,或者有修改可能时, 它会生成代码在修改前自动先复制一份,然后让您修改这个备份字符串。
所以如果你的参数定义成s: string并且你在代码中试图获取它的地址时, 编译器便认为你有可能修改这个字符串而先复制了一份。 显然对我们的程序来说这个复制是多余的。 为了防止编译器自动复制, 我们必须在参数定义时加上const或var关键字。

cll007 2003-11-18
  • 打赏
  • 举报
回复
function MidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString; overload;
------
showmessage(midstr(x,1,2));
尽管你传进去一个变量,但是这个值可能只是一个拷贝,在MidStr函数内部,是作为常量使用,不能被改变,如果不信,可以自己写一个函数检测
function TForm1.text(const AText: string): string;
begin
AText:='hello';//编译不通过
Result:=AText;
end;
在函数体中,不能对AText进行赋值操作
tiger19760407 2003-11-17
  • 打赏
  • 举报
回复
就是常量!
ezlz 2003-11-17
  • 打赏
  • 举报
回复
就相当于函数里的常量,不能被改变的。
sailer_shi 2003-11-17
  • 打赏
  • 举报
回复
const我的理解是这个参数不可以变化的,不知道对不对

828

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧