On Sep 30, 6:49 pm, Summercool [EMAIL PROTECTED] wrote:
On Sep 30, 4:18 am, 7stud -- [EMAIL PROTECTED] wrote:
SpringFlowers AutumnMoon wrote:
we have no way
of knowing what we pass in could get changed.
Sure you do. You look at the function's signature. In order to use
someone else's library, you have to know the function's signature. And
the signature explicitly tells you whether the value you pass in could
be changed.
That's not really correct. It's more a case that if you don't
know what a function does, you don't use it. Regardless of the
language, calling a function without knowing what it does is a
sure recepe for disaster.
do you mean in C++? I tried to find signature in two C++ books and it
is not there. Google has a few results but it looks something like
prototype. Is signature the same as the function prototype in the .h
file? If so, don't we usually just include ___.h and forget about
the rest. Documentation is fine although in some situation, the
descriptions is 2 lines, and notes and warnings are 4, 5 times that,
and the users' discussing it, holding different opinion is again 2, 3
times of that length. I think in Pascal and C, we can never have an
argument modified unless we explicitly allow it, by passing in the
pointer (address) of the argument.
In C, that's partially true; no part of the expressions involved
in the function invocation will be modified through the function
argument unless the address is specifically taken (or the
argument has array type). The situation in Pascal, C++, Ada and
most other languages is different; Pascal and C++ have reference
parameters (called VAR in Pascal), as well as value paramters,
Ada has in, inout and out parameters.
The situation in Java is somewhat more complicated; formally,
Java only has pass by value, and there's no way a function can
modify any of the arguments. In practice, however, if the
expression has an object type, the value is a pointer (called
reference in Java) to the object; if the object is a well
defined value type (e.g. java.lang.String), it will be
immutable, but entity objects don't follow this rule, and not
all value objects (e.g. java.awt.Dimension) are well designed.
also i think for string, it is a bit different because by default,
string is a pointer to char or the address of the first char in C and C
++.
Strings in C++ are class types, with full value semantics.
So it is like passing in the address already. it is when the
argument n is something like 1 that makes me wonder.
C++ requires an lvalue unless the reference is to a const, so
you cannot pass 1 to a C++ function and expect/worry about it
being changed. The same holds for most modern languages, I
think, although the mechanisms involved may differ. (I'd be
very surprised, for example, if Ada allowed anything but what in
C++ would be an lvalue to be passed to an inout or an out
parameter.) In most modern languages, however, you can
circumvent the controls with enough indirections.
--
James Kanze (GABI Software) email:[EMAIL PROTECTED]
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
http://mail.python.org/mailman/listinfo/python-list