Earlier we noted that functions can be part of tt(struct)s (see
section ref(FunctionInStruct)).  Such functions are called
    hi(member function)em(member functions).
This section briefly discusses how to define such functions.

The code fragment below shows a tt(struct) having data fields for a person's
name and address. A function tt(print) is included in the
tt(struct)'s definition:
        verb(    struct Person
    {
        char name[80];
        char address[80];

        void print();
    };)

When defining the member function tt(print) the structure's name
(tt(Person)) and the scope resolution operator (tt(::)) are used:
        verb(    void Person::print()
    {
        cout << "Name:      " << name << "\n"
                "Address:   " << address << '\n';
    })

The implementation of tt(Person::print) shows how the fields of the
tt(struct) can be accessed without using the structure's type name. Here the
function tt(Person::print) prints a variable tt(name). Since tt(Person::print)
is itself a part of tt(struct) tt(person), the variable tt(name) implicitly
refers to the same type.

This tt(struct Person) could be used as follows:
        verb(    Person person;

    strcpy(person.name, "Karel");
    strcpy(person.address, "Marskramerstraat 33");
    person.print();)

The advantage of member functions is that the called function
automatically accesses the data fields of the structure for which it was
invoked. In the statement tt(person.print()) the object tt(person) is the
`substrate': the variables tt(name) and tt(address) that are used in the code
of tt(print) refer to the data stored in the tt(person) object.
