// 5. Приятелски функции и класове. Указател this. // // Fig. 7.11: fig07_11.cpp // Friends can access private members of a class. #include using std::cout; using std::endl; // Count class definition // (note that there is no friendship declaration) class Count { friend void setX( Count &, int ); // friend declaration public: // constructor Count() : x( 0 ) // initialize x to 0 { // empty body } // end constructor Count // output x void print() const { cout << x << endl; } // end function print private: int x; // data member }; // end class Count // function setX can modify private data of Count // because setX is declared as a friend of Count void setX( Count &c, int val ) { c.x = val; // legal: setX is a friend of Count } // end function setX int main() { Count counter; // create Count object cout << "counter.x after instantiation: "; counter.print(); setX( counter, 8 ); // set x with a friend cout << "counter.x after call to setX friend function: "; counter.print(); return 0; } // end main /******************************************************/ // Fig. 7.13: fig07_13.cpp // Using the this pointer to refer to object members. #include using std::cout; using std::endl; class Test { public: Test( int = 0 ); // default constructor void print() const; private: int x; }; // end class Test // constructor Test::Test( int value ) : x( value ) // initialize x to value { // empty body } // end constructor Test // print x using implicit and explicit this pointers; // parentheses around *this required void Test::print() const { // implicitly use this pointer to access member x cout << " x = " << x; // explicitly use this pointer to access member x cout << "\n this->x = " << this->x; // explicitly use dereferenced this pointer and // the dot operator to access member x cout << "\n(*this).x = " << ( *this ).x << endl; } // end function print int main() { Test testObject( 12 ); testObject.print(); return 0; } // end main /*****************************/ // Fig. 7.14: time6.h // Cascading member function calls. // Time class definition. // Member functions defined in time6.cpp. #ifndef TIME6_H #define TIME6_H class Time { public: Time( int = 0, int = 0, int = 0 ); // default constructor // set functions Time &setTime( int, int, int ); // set hour, minute, second Time &setHour( int ); // set hour Time &setMinute( int ); // set minute Time &setSecond( int ); // set second // get functions (normally declared const) int getHour() const; // return hour int getMinute() const; // return minute int getSecond() const; // return second // print functions (normally declared const) void printUniversal() const; // print universal time void printStandard() const; // print standard time private: int hour; // 0 - 23 (24-hour clock format) int minute; // 0 - 59 int second; // 0 - 59 }; // end class Time #endif /****/ // Fig. 7.15: time6.cpp // Member-function definitions for Time class. #include using std::cout; #include using std::setfill; using std::setw; #include "time6.h" // Time class definition // constructor function to initialize private data; // calls member function setTime to set variables; // default values are 0 (see class definition) Time::Time( int hr, int min, int sec ) { setTime( hr, min, sec ); } // end Time constructor // set values of hour, minute, and second Time &Time::setTime( int h, int m, int s ) { setHour( h ); setMinute( m ); setSecond( s ); return *this; // enables cascading } // end function setTime // set hour value Time &Time::setHour( int h ) { hour = ( h >= 0 && h < 24 ) ? h : 0; return *this; // enables cascading } // end function setHour // set minute value Time &Time::setMinute( int m ) { minute = ( m >= 0 && m < 60 ) ? m : 0; return *this; // enables cascading } // end function setMinute // set second value Time &Time::setSecond( int s ) { second = ( s >= 0 && s < 60 ) ? s : 0; return *this; // enables cascading } // end function setSecond // get hour value int Time::getHour() const { return hour; } // end function getHour // get minute value int Time::getMinute() const { return minute; } // end function getMinute // get second value int Time::getSecond() const { return second; } // end function getSecond // print Time in universal format void Time::printUniversal() const { cout << setfill( '0' ) << setw( 2 ) << hour << ":" << setw( 2 ) << minute << ":" << setw( 2 ) << second; } // end function printUniversal // print Time in standard format void Time::printStandard() const { cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 ) << ":" << setfill( '0' ) << setw( 2 ) << minute << ":" << setw( 2 ) << second << ( hour < 12 ? " AM" : " PM" ); } // end function printStandard /****/ // Fig. 7.16: fig07_16.cpp // Cascading member function calls with the this pointer. #include using std::cout; using std::endl; #include "time6.h" // Time class definition int main() { Time t; // cascaded function calls t.setHour( 18 ).setMinute( 30 ).setSecond( 22 ); // output time in universal and standard formats cout << "Universal time: "; t.printUniversal(); cout << "\nStandard time: "; t.printStandard(); cout << "\n\nNew standard time: "; // cascaded function calls t.setTime( 20, 20, 20 ).printStandard(); cout << endl; return 0; } // end main