Delphi中返回类型为string的函数的一个陷阱(不是很懂)
2017-07-24 20:04
477 查看
如果类的一个成员函数的返回值是string类型,需要注意一个问题
其返回值可能是错误的
例如函数的实现如下
function GetString( s: string ): string;
begin
Result := Result + s;
end;
调用方式如下:
procedure test();
var
i: Integer;
s: string;
begin
s := '';
s := GetString( IntToStr( 1 ) );
s := GetString( IntToStr( 2 ) );
end;
那么s的值是什么呢?
答案是“12”,不是“2”
原因是:第一次调用GetString方法,把s和GetString的result指向了同一个地址,第二次调用GetString方法,result指向的仍然是之前的地址,其值仍然为'1',所以结果是'1' + '2' = '12'
当然其中一个问题就是这个函数的返回值没有初始化,当返回值的类型为string时,而delphi并不会进行警告或提示
所以我们一定要养成良好的习惯,如上述实现不应该在初始化result前使用它
==============================================
另一个例子
function GetNumberType( n: Integer ): string;
begin
if n mod 2 = 0 then
Result := '偶数';
end;
procedure TF_Main.btnTestClick(Sender: TObject);
var
i: Integer;
begin
//
for i := 1 to 4 do
AddMsg( '结果:' + GetNumberType( i ) );
end;
结果是:
结果:
结果:偶数
结果:偶数
结果:偶数
http://blog.csdn.net/youthon/article/details/4298524
其返回值可能是错误的
例如函数的实现如下
function GetString( s: string ): string;
begin
Result := Result + s;
end;
调用方式如下:
procedure test();
var
i: Integer;
s: string;
begin
s := '';
s := GetString( IntToStr( 1 ) );
s := GetString( IntToStr( 2 ) );
end;
那么s的值是什么呢?
答案是“12”,不是“2”
原因是:第一次调用GetString方法,把s和GetString的result指向了同一个地址,第二次调用GetString方法,result指向的仍然是之前的地址,其值仍然为'1',所以结果是'1' + '2' = '12'
当然其中一个问题就是这个函数的返回值没有初始化,当返回值的类型为string时,而delphi并不会进行警告或提示
所以我们一定要养成良好的习惯,如上述实现不应该在初始化result前使用它
==============================================
另一个例子
function GetNumberType( n: Integer ): string;
begin
if n mod 2 = 0 then
Result := '偶数';
end;
procedure TF_Main.btnTestClick(Sender: TObject);
var
i: Integer;
begin
//
for i := 1 to 4 do
AddMsg( '结果:' + GetNumberType( i ) );
end;
结果是:
结果:
结果:偶数
结果:偶数
结果:偶数
http://blog.csdn.net/youthon/article/details/4298524
相关文章推荐
- Delphi中返回类型为string的函数的一个陷阱
- 网络通信中,DELPHI的string类型数据转换为C++字符串发送的一个陷阱
- 有时我们需要调用一个函数时,返回多个不同类型的数据
- 一个DELPHI程序要调用DLL,而DLL中的函数名,参数个数,参数类型为不定
- 编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数
- 一个函数将int,float,double等类型转string
- C语言实现 编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。
- 关于返回一个引用类型的函数的用法和见解
- 习题8.3 编写一个函数,其唯一的形参和返回值都是istream&类型.该函数一直读取到到大文件结束符为止,,,,,,并返回该流
- C语言 编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。
- 【C语言】编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。(辗转相除法和常规求法)
- 实现一个函数clone,使JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制
- 当C++函数的返回类型为一个类时
- JavaScript中如何检测一个变量是一个String类型?请写出函数实现
- IDL中识别一个字符串是否是double类型的数字函数IsDoubleString
- 给定一个整数(字符串也适用)序列,重新排列,得到最大的结果,比如31,3,35,7,9根据排列后得到组合 9735331,返回的是string类型
- jni实现返回值为java类型的String[]和List<E>的函数
- 面试题---实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制。
- 转一个js类型判断函数,支持返回dom 元素的类型,像HTMLBody
- 《Delphi 算法与数据结构》学习与感悟[5]: 定位一个字符位置时, Pos 函数为什么不是最快的?