On Mon, 17 May 2010, Graeme Geldenhuys wrote:

Michael Van Canneyt het geskryf:

You only need var/out when you want to change the instance pointer, i.e.
switch to another instance. And I count FreeAndNil() among this. (.Free
on the other hand is still possible, but not recommended).

If  you just want to set properties or call methods on an existing instance,
there is no need to use out or var.


Thank you Michael, I understand it much better now. Could you please add
this information into the FPC Language Reference document? I re-read
Chapter 11 in ref.pdf and there is no mention of what you said, and the
documentation doesn't cover what happens if a Class is passed as a
parameter. It only mentions simple types and arrays as parameters. Maybe
adding a extra section in that chapter explaining when to use what?

I will do that.


This brings me to another question. What is supposed to happen if you pass
a Class instance as a const parameter? Does that even make sense? If not,
why does the compiler allow that? Again, the documentation doesn't cover
this scenario. Same question applies to passing a record structure.

eg:
----------------------------
procedure ProcessPerson(const APerson: TPerson);
begin
 ...  // Am I allowed to change APerson.Name property?
 ...  // Am I allowed to assign a new instance to APerson?
end;

...
 lPerson := TPerson.Create;
 lPerson.Name := 'Graeme Geldenhuys';
 ProcessPerson(lPerson);

----------------------------


* I see I can't assign a new instance to APerson - this makes sense.
* I can assign new values to APerson.Name - am I supposed to be
 allowed to do that?

Yes. In the same way as when you have a const pointer to a array of char,
you can change the array's contents, but not the pointer.

const means: you cannot change the value of the passed parameter.

Const doesn't make a lot of sense for pointers, since, with some
imagination, passing a pointer is equivalent to a var parameter.
(see C and other such languages)

Michael.
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to