[ fromfile: classes.xml id: memberaccess ]
Thus far you have worked with class definition code
kept in header files that contain class definitions and other declarations, and with class implementation code kept in the header's
corresponding .cpp files that contain definitions missing from the header file.
There is a third category of code as it relates to a given class.
Client code is code that is outside the scope of the
class, but which uses objects or members of that
class.
Generally,
client code #includes
the header file that contains the class definition.
In Example 2.5, you can see that fraction.h
contains class definition code of Fraction
, and is itself a client of QString.
Example 2.5. src/classes/fraction/fraction.h
The access specifiers, public, protected
, and private
, are used in a class definition to specify where in a program the
affected members can be accessed.
The following list provides an informal first approximation of the definitions of these three terms.
Refinements are contained in footnotes.
A public
member can be accessed (using an object of the
class)[23]
anywhere in a program that #includes
the class
definition file.
A protected
member can be accessed inside the definition of a
member function of its own class, or a member function of a derived class.[24]
A private
member is only accessible by member functions of its own
class.[25]
Class members are private
by default.
If there is no access specifier preceding a member declaration in a class definition, the member is private.
Example 2.6 uses some Fraction
client code to demonstrate accessibiliby and visibility errors in a
variety of ways.
This example also focuses on block scope.
A variable (not a class member) declared inside a block is visible and accessible only between its
declaration and the closing brace.
In the case of a function, the block that contains the function definition also includes the function's
parameter list.
Example 2.6. src/classes/fraction/fraction-client.cpp
#include <QTextStream> #include "fraction.h" int main() { const int DASHES = 30; QTextStream cout(stdout); { int i; for (i = 0; i < DASHES; ++i) cout << "="; cout << endl; } cout << "i = " << i << endl; Fraction f1, f2; f1.set(3, 4); f2.set(11,12); f2.m_Numerator = 12; cout << "The first fraction is: " << f1.toString() << endl; cout << "\nThe second fraction, expressed as a double is: " << f2.toDouble() << endl; return 0; }
The relationship between struct
and class
in C++
can now be clearly described.
Stroustrup defines a struct
to be a class
whose
members are by default public
, so that
struct T { ...
is equivalent to:
class T {public: ...
In particular, a struct
in C++ can have member functions and data.
C++ programmers tend to prefer using class
instead of struct
for most purposes, perhaps because of its bias in favor of private
access. struct
seems to be used mostly for
applications in which data items need to be grouped together but member functions are not needed.
[23] public static
members can be accessed without an object. We discuss this
in Section 2.9.
[25] Private members are
also accessible by friends
of the class, which we discuss in Section 2.6.
Generated: 2012-03-02 | © 2012 Alan Ezust and Paul Ezust. |