Delphi的代码如下:
---------------------------------------------------
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TTest = class
public
Value: Integer;
end; TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure Test1(x: Integer);
procedure Test2(var x: Integer);
procedure Test3(T: TTest);
procedure Test4(var T: TTest);
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Test1(x: Integer);
begin
x := 5;
ShowMessage('In Test1:'+IntToStr(x));
end;procedure TForm1.Test2(var x: Integer);
begin
x := 5;
ShowMessage('In Test2:'+IntToStr(x));
end;procedure TForm1.Test3(T: TTest);
begin
T.Value := 5;
ShowMessage('In Test3:'+IntToStr(T.Value));
end;procedure TForm1.Test4(var T: TTest);
begin
T.Value := 5;
ShowMessage('In Test4:'+IntToStr(T.Value));
end;procedure TForm1.Button1Click(Sender: TObject);
var
x: Integer;
tt: TTest;
begin
tt := TTest.Create; x := 10;
ShowMessage('Before Test1:'+IntToStr(x));
Test1(x);
ShowMessage('After Test1:'+IntToStr(x)); //语句1 x := 10;
ShowMessage('Befor Test2:'+IntToStr(x));
Test2(x);
ShowMessage('After Test2:'+IntToStr(x)); //语句2 tt.Value := 10;
ShowMessage('Before Test3:'+IntToStr(tt.Value));
Test3(tt);
ShowMessage('After Test3:'+IntToStr(tt.Value)); //语句3
tt.Value := 10;
ShowMessage('Before Test4:'+IntToStr(tt.Value));
Test4(tt);
ShowMessage('After Test4:'+IntToStr(tt.Value)); //语句4
end;end.
-------------------------------------------------
语句3和语句4显示的结果为什么与语句1和语句2显示的结果不一致?
Test(var T: TTest)和Test(T: TTest)有什么区别?
Test(var T: TTest)和Test(T: TTest)哪一个对系统的开销小?
为什么基本数据类型和类的思想不一致?
-------------------------------------------------
与之对应的C++的代码如下
-------------------------------------------------
#include <iostream.h>class Test
{
public:
int Value;
};void Test1(Test t)
{
t.Value = 5;
cout << "In Test1:"<<t.Value<<endl;
}void Test2(Test &t)
{
t.Value = 5;
cout << "In Test2:" << t.Value << endl;
}void Test3(Test *t)
{
t->Value = 5;
cout << "In Test3:" << t->Value << endl;
}int main()
{
Test T; T.Value = 10;
cout << "Before Test1:" << T.Value << endl;
Test1(T);
cout << "After Test1:" << T.Value << endl << endl; T.Value = 10;
cout << "Before Test2:" << T.Value << endl;
Test2(T);
cout << "After Test2:" << T.Value << endl << endl; T.Value = 10;
cout << "Before Test3:" << T.Value << endl;
Test3(&T);
cout << "After Test3:" << T.Value << endl << endl; return 0;
}
----------------------------------------------------
C++中,基本数据类型和类的思想是一致的。
delphi对基本数据类型和类采取不一样的思想,是否造成了更多的混乱?
由于我初学Delphi,还希望高手指点一下。
我并不想讨论C++和Delphi谁更加强大,他们只不过是工具而已。
请勿吵架!!!非常感谢!
---------------------------------------------------
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TTest = class
public
Value: Integer;
end; TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure Test1(x: Integer);
procedure Test2(var x: Integer);
procedure Test3(T: TTest);
procedure Test4(var T: TTest);
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Test1(x: Integer);
begin
x := 5;
ShowMessage('In Test1:'+IntToStr(x));
end;procedure TForm1.Test2(var x: Integer);
begin
x := 5;
ShowMessage('In Test2:'+IntToStr(x));
end;procedure TForm1.Test3(T: TTest);
begin
T.Value := 5;
ShowMessage('In Test3:'+IntToStr(T.Value));
end;procedure TForm1.Test4(var T: TTest);
begin
T.Value := 5;
ShowMessage('In Test4:'+IntToStr(T.Value));
end;procedure TForm1.Button1Click(Sender: TObject);
var
x: Integer;
tt: TTest;
begin
tt := TTest.Create; x := 10;
ShowMessage('Before Test1:'+IntToStr(x));
Test1(x);
ShowMessage('After Test1:'+IntToStr(x)); //语句1 x := 10;
ShowMessage('Befor Test2:'+IntToStr(x));
Test2(x);
ShowMessage('After Test2:'+IntToStr(x)); //语句2 tt.Value := 10;
ShowMessage('Before Test3:'+IntToStr(tt.Value));
Test3(tt);
ShowMessage('After Test3:'+IntToStr(tt.Value)); //语句3
tt.Value := 10;
ShowMessage('Before Test4:'+IntToStr(tt.Value));
Test4(tt);
ShowMessage('After Test4:'+IntToStr(tt.Value)); //语句4
end;end.
-------------------------------------------------
语句3和语句4显示的结果为什么与语句1和语句2显示的结果不一致?
Test(var T: TTest)和Test(T: TTest)有什么区别?
Test(var T: TTest)和Test(T: TTest)哪一个对系统的开销小?
为什么基本数据类型和类的思想不一致?
-------------------------------------------------
与之对应的C++的代码如下
-------------------------------------------------
#include <iostream.h>class Test
{
public:
int Value;
};void Test1(Test t)
{
t.Value = 5;
cout << "In Test1:"<<t.Value<<endl;
}void Test2(Test &t)
{
t.Value = 5;
cout << "In Test2:" << t.Value << endl;
}void Test3(Test *t)
{
t->Value = 5;
cout << "In Test3:" << t->Value << endl;
}int main()
{
Test T; T.Value = 10;
cout << "Before Test1:" << T.Value << endl;
Test1(T);
cout << "After Test1:" << T.Value << endl << endl; T.Value = 10;
cout << "Before Test2:" << T.Value << endl;
Test2(T);
cout << "After Test2:" << T.Value << endl << endl; T.Value = 10;
cout << "Before Test3:" << T.Value << endl;
Test3(&T);
cout << "After Test3:" << T.Value << endl << endl; return 0;
}
----------------------------------------------------
C++中,基本数据类型和类的思想是一致的。
delphi对基本数据类型和类采取不一样的思想,是否造成了更多的混乱?
由于我初学Delphi,还希望高手指点一下。
我并不想讨论C++和Delphi谁更加强大,他们只不过是工具而已。
请勿吵架!!!非常感谢!
解决方案 »
- 请问ADO怎样和oracle数据库表关联并插入记录?谢谢
- 提前祭奠一下我的49998分...
- [图片可以显示了]散分!!!好多年没来了,最近刚买了个相机,拍了几张片子,发给大家鉴赏一下。看看能招回几个以前的水友
- 请教大家一个问题.如何在dbgrid的最后一行做一个数据统计.
- 求补丁的制作方法
- 请问编辑控件属性ImeMode值的含义?
- 高分求救~~~sql
- 处理图形数据库
- 一个ADO的问题,高手指教!!!!多谢多谢!
- 请教关于WIN32 API 中的:CreateFileMapping函数
- jedi负责转换windows api到delphi声明的内容在那里?
- 一个应聘考试的题目,要求明天将代码带去,并说明思路
1中是按值进行传递的,形参与实参就相当于两个变量。2中是按引用传递的,形参与实参就相当于一个变量,两个指针,一个指针是另一个指针的副本,但是它们所指向的内存地址都是相同的。 1 function Fa(value:integer):Integer;
begin
value:=value+1;
result:=value;
end;
2 function Fb(var value:Integer):integer;
begin
value:=value+1;
result:=value;
end;
var
Fa,a,Fb,b:Integer;
begin
a:=3;
Fa:=fa(a); //这时 fa等于4,a等于3
b:=3;
fb:=fb(b); //这时 fb等于4,b等于4
end;
TTest = record
Value: Integer;
end;并去除 tt := TTest.Create; 这个语句,然后再运行试试。
从上面的贴子中可以看出,大家都知道(x: Integer)是按值传递,(var x: Integer)是按地址传递,为什么Delphi在对待类时不能按照上面的规则呢?既然Delphi选择了这种方式,就有它的道理。它的道理又是什么呢?
(Object: TClass)和(var Object: TClass)哪一个占用系统资源少?哪一个运行速度快?
(var Object: TClass)则是直接传递的对象引用本身。
===========================对于这个问题,关键是要明白其内部的机制就可以了,以免造成混乱
而且,如果是用var限定的,不能用类的属性做参数,即使类型兼容。
我对下面的话不太理解:
“如果用var可以重新赋值,并且还会影响到调用此方法的代码之后的代码;如果没有限定符,该参数可以重新赋值,但不会返回。而且,如果是用var限定的,不能用类的属性做参数,即使类型兼容。”能否举一个例子。
非常感谢!!!
而C++裡面是有一個專門的語法來表示的class A;
A a;void func(const A& a)
void func(A& a)delphi這樣做的好處就是避免了C++中對copy constructor的處理,C++中拷貝構造函數是一個比較大的話題,
另外我上面对于对象参数的说法也有点不对。对象参数的可写属性是一定可以修改的。对于对象参数本身的限制跟其他类型的参数是一样的。
有var 传地址 相当于引用 但是delphi中所有的对象都是指针,
传值传的还是地址,故传对象时不用
var也可修改对象
(var Object: TClass)则是直接传递的对象引用本身。
这个解释得比较清楚。使用(var Object: TClass)这种形式,我们能将一个对象指针指向另一个对象实例,而(Object: TClass)则做不到这一点。
procedure varproc(var vari:integer);
var
i:integer;
begin
for i:=1 to 10 do
vari:=vari+1;
end;procedure proc(vari:integer);
var
i:integer;
begin
for i:=1 to 10 do
vari:=vari+1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
i:=1;
varproc(i);
showmessage(inttostr(i));
end;procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
i:=1;
proc(i);
showmessage(inttostr(i));
end;
有var時,函數或過程對參數的修改會導致實參的修改,而沒有var的修改了
參數,但是不會修改實參的值。
begin
inc(Value);
end;procedure EditMeAndSave(var Value:Integer);
begin
inc(Value);
end;
---------------------------------------
var
A:Integer;
B:Integer;
begin
A:=10;
B:=10;
EditMeAndSave(A);
EditMeAndNoSave(B);
ShowMessage(IntToStr(A)); //'11'
ShowMessage(IntToStr(B)); //'10'
end;