@hooman,
About const, I mean adding it to input variables on a function, I'm probably describing it a little off but here is what I mean:
void UseButNoChange(const SomeClass &someClass)
To my knowledge in C# there is no easy way to let someone reference a class by passing it through a method and tell them not to edit it, so it is nice to have this feature in C++.
@Leeor,
I have heard of PIMPL but haven't looked at it closely enough to use yet. I will keep it in mind for if I start designing more robust classes.
@Dave,
I'm just hoping it will be fun to play. Otherwise it doesn't matter much besides being a learning exercise for me.
----
Made some edits to make what I wrote mean what I was thinking.
I don't think friend is necessarily wrong, but it's use should be minimal. I also feel friend should be restricted to some kind of package boundary, possibly even to classes/functions in the same file, depending on how granular the file organization is. Remember that friend is exposing private implementation details. If the private implementation is changed, the friend classes/functions will likely also need to be updated. The code structure should reflect this, grouping these details closely together.
A typical use for friend is with operator overloading. You can have overloaded member operators, but then your class must always be the first type. To overload an operator to take a different first type, and your class as a second type, it must be a non-member overload, and so friend can be useful to grant such a function access to internal fields, without having to make them generally public.
// Addition should commute
obj + 5; // Can be implemented with an overloaded member operator+
5 + obj; // Can be implemented with an overloaded friend non-member operator+
// Stream insertion takes a stream object as the first parameter
stream << obj; // Can be implemented with an overloaded friend non-member operator<<