On Sat, 31 Jan 2009 15:28:14 -0800, thmpsn.m.k wrote: > On Jan 31, 2:27 pm, Christian Heimes <li...@cheimes.de> wrote: >> Do you honestly believe that C++'s private members are really private? >> Privateness is only enforced during parsing time. Nobody can stop you >> from messing around with header files or memory. You can still access >> and modify private members but it's all messy and ugly. Even C# and >> .NET don't stop you from doing nasty things from unmananged assemblies. > > I don't know how you would do it in C# (or Java for that matter).
In Java you can use reflection to get your fingers on private fields. > In C++ you can play with pointers to "get at" some memory location > somewhere in the object. > [Snipped pointer fiddling explanation] > So: Sometimes it may work, usually it will be unsafe and/or non- > portable, and in most cases the procedure will look complicated. Or ``#define private public`` before including the header files. Which doesn't look complicated to me. > It certainly isn't something I'd try in a real application. However, it > WOULD be tempting to access the member if the language allows me to just > write: > > print "obj.b =", obj.b > > and be done with it. And that's perfectly okay, because the author would have prepended an underscore to `b` if you should not mess with it. > Personally, in Python, I use double underscores for "private" members, > so the above would look like: > > print "obj.b =", obj._NonPOD__b > > but it's still easier than the C++ example. The name mangling is there to prevent name clashes, not to make attributes inaccessible. It's useful for mixin classes for example. >> Seriously, 'private' and 'protected' are merely tools to stop bad >> programmers from doing bad stuff. And the serve as documentation, too. > > It's not just documentation. For example, suppose you're reading a class > definition and see the declaration of a veryInterestingMember and forget > that you're not supposed to access it. If you try to access it, the > compiler will give you a diagnostic message at compile time. I can't forget that because if I'm not supposed to access it, its name would be `_very_interesting_member`. I don't have to wait till compile time to see that, it is really obvious at the time I write the code to access it, or decide not to because it is not part of the API. Ciao, Marc 'BlackJack' Rintsch -- http://mail.python.org/mailman/listinfo/python-list