So if you're passing an object as a parameter you're passing a copy of the pointer, even if you don't use the added var keyword in the parameter list. If you're passing something like a string or integer, the var keyword --> passing a copy of a pointer, so there's ultimately two pointers pointing to the same memory address. Not including the var keyword when passing a string or integer --> a copy of the string or integer data and a new pointer pointing to the copied data's memory address.
It's starting to make sense. Thank you! >From: Cosmin Prund <[EMAIL PROTECTED]> >Reply-To: Borland's Delphi Discussion List <[email protected]> >To: Borland's Delphi Discussion List <[email protected]> >Subject: Re: Learning OOP (part 3) -- follow-up >Date: Mon, 29 May 2006 12:24:13 +0300 > >What you've got in your "sl" variable is not the data associated with >"sl" but a pointer to that data. When you pass "sl" as a parameter to >your test function you're passing a copy of the pointer, so the called >procedure would be working on the same area of memory. That's why you >get all three messages. > >This is very important and you need to understand this: Objects are >Pointers! When you're passing an object around you're only passing it's >pointer, the 4 byte value that tells you where the object's actual data >is. If you think about it in depth, it really makes sense. There's no >way to reliably copy an object's data to obtain a perfect replica of the >given object because objects may contain things like handles to system >resources or pointers to other objects. Even if you were able to >perfectly copy an object, copying it around every time you called a >procedure tacking an object as a parameter would be highly inefficient. >Using an "pointer to an object" would again be a nonsense since objects >are already pointers and that would simply introduce an unwelcome extra >layer of indirection that would make our lives way more difficult and >would make code less efficient. > >P.S: >Other languages (ex: C++) also have non-pointer objects because they can >"host" objects on the stack or in the data section of memory >(non-dynamic memory). In those languages there's no equal sign between >objects and pointers and in C++ your code MIGHT have worked as expected. >If the TStringList had something called an "copy constructor" and sl >would have been an stack-based object, it's data would have been copied >as part of the call to the test procedure (using the copy-constructor) >and then the used memory would have been destroyed upon return of the >"test" procedure (calling the destructor). Also my limited experience >with C++ tells me you don't use stack-based objects that often and you >end up doing manual dereferencing of pointers all over the place. So I >think Delphi's way is much better! > >Alan Colburn wrote: > > Thanks to all three of you for your responses--very helpful. As I think > > about it, it seems almost intuitive (after a couple days :-) that >objects > > should be freed by the same class instance in which they were created, >if > > possible. I appreciated your responses about passing parameters, too, >and > > started experimenting a little, just to cement my understanding. > > > > I created a class called TSample with a single procedure, test > > (sl:TStringList). It's got two lines: sl.Add('TSample'); and > > ShowMessage(sl.Text). I experimented with calling the procedure, passing >the > > stringList in various ways. I understood, I'm happy to say ... except >for > > this: > > > > Form1's got this code: > > sl:=TStringList.Create; > > sl.Add('TForm1'); > > x:=TSample.Create; > > x.test(sl); > > sl.Add('TForm1 again'); > > ShowMessage(sl.Text); > > sl.Free; > > > > The last ShowMessage has all *three* lines ('TForm1','TSample', and >'TForm1 > > again'). It seems to me that if it's a *copy* of sl that's passed to the > > called procedure, then that last ShowMessage should just have *two* >lines > > ('TForm1' and 'TForm1 again'). In other words, it seems like the >procedure > > is acting the way I would now predict it would (and does) if I change >the > > signature to TSample.test (var sl:TStringList). > > > > What do you think? > > > > Thanks, as always -- Al > > > > p.s. I'll stop asking so many questions soon ... don't want to overstay >my > > welcome :-) > > > > _________________________________________________________________ > > Express yourself instantly with MSN Messenger! Download today - it's >FREE! > > http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/ > > > > _______________________________________________ > > Delphi mailing list -> [email protected] > > http://www.elists.org/mailman/listinfo/delphi > > > > > >_______________________________________________ >Delphi mailing list -> [email protected] >http://www.elists.org/mailman/listinfo/delphi _________________________________________________________________ On the road to retirement? Check out MSN Life Events for advice on how to get there! http://lifeevents.msn.com/category.aspx?cid=Retirement _______________________________________________ Delphi mailing list -> [email protected] http://www.elists.org/mailman/listinfo/delphi

