Performance Enhancement of TFRC in Wireless Networks

Performance Enhancement of TFRC in Wireless Networks

Classes: A Deeper Look Systems Programming Deeper into C++ Classes const objects and const member functions Composition Friendship this pointer Dynamic memory management new and delete operators static class members and member functions Abstract data types Systems Programming: Deeper into C++ 2 21.2 const (Constant) Objects and const Member Functions Principle of least privilege allowing access to data only when it is absolutely needed. Is one of the most fundamental principles of good software engineering. Applies to objects, too.

const objects Keyword const Specifies that an object is not modifiable. Attempts to modify the object will result in compilation errors. Example Const Time noon (12, 0, 0); Systems Programming: Deeper into C++ 3 const (Constant) Objects and const Member Functions const member functions Only const member function can be called for const objects. Member functions declared const are not allowed to modify the object. A function is specified as const both in its prototype and in its definition. const declarations are not allowed for constructors and destructors. Systems Programming: Deeper into C++ 4 Software Engineering Observation 21.2 A const member function can be overloaded with a non-const version. The compiler chooses which overloaded member function to use based on the object on which the function is invoked. If the object is const, const the compiler uses the const

version. If the object is not const, const the compiler uses the non-const version. Systems Programming: Deeper into C++ 5 const Example 1 // Fig. 21.1: Time.h 2 // Definition of class Time. 3 // Member functions defined in Time.cpp. 4 #ifndef TIME_H 5 #define TIME_H 6 7 class Time 8 { 9 public:

10 Time( int = 0, int = 0, int = 0 ); // default constructor 11 12 // set functions 13 void setTime( int, int, int ); // set time 14 void setHour( int ); // set hour 15 void setMinute( int ); // set minute 16 void setSecond( int ); // set second 17 18 // get functions (normally declared const) 19 int getHour() const; // return hour 20 int getMinute() const; // return minute 21 int getSecond() const; // return second Systems Programming: Deeper into C++

6 const Example 22 23 // print functions (normally declared const) 24 void printUniversal() const; // print universal time 25 void printStandard(); // print standard time (should be const) 26 private: 27 int hour; // 0 - 23 (24-hour clock format) 28 int minute; // 0 - 59 29 int second; // 0 - 59 30 }; // end class Time 31 32 #endif Systems Programming: Deeper into C++ 7 const Example 1 // Fig. 21.2: Time.cpp

2 // Member-function definitions for class Time. 3 #include 4 using std::cout; 5 6 #include 7 using std::setfill; 8 using std::setw; 9 10 #include "Time.h" // include definition of class Time 11 12 // constructor function to initialize private data; 13 // calls member function setTime to set variables; 14 // default values are 0 (see class definition) 15 Time::Time( int hour, int minute, int second ) 16 { 17 setTime( hour, minute, second ); 18 } // end Time constructor 19 20 // set hour, minute and second values 21 void Time::setTime( int hour, int minute, int second ) 22 { 23

setHour( hour ); 24 setMinute( minute ); 25 setSecond( second ); 26 } // end function setTime Systems Programming: Deeper into C++ 8 const Example 27 28 // set hour value 29 void Time::setHour( int h ) 30 { 31 hour = ( h >= 0 && h < 24 ) ? h : 0; // validate hour 32 } // end function setHour 33 34 // set minute value 35 void Time::setMinute( int m ) 36 { 37 minute = ( m >= 0 && m < 60 ) ? m : 0; // validate minute 38 } // end function setMinute 39 40 // set second value 41 void Time::setSecond( int s ) 42 { 43 second = ( s >= 0 && s < 60 ) ? s : 0; // validate second

44 } // end function setSecond 45 46 // return hour value const keyword in function definition, as well as in function prototype 47 int Time::getHour() const // get functions should be const 48 { 49 return hour; 50 } // end function getHour Systems Programming: Deeper into C++ 9 const Example 51 52 // return minute value 53 int Time::getMinute() const 54 { 55 return minute; 56 } // end function getMinute 57 58 // return second value 59 int Time::getSecond() const 60 { 61 return second; 62 } // end function getSecond 63 64 // print Time in universal-time format (HH:MM:SS) 65 void Time::printUniversal() const 66 {

67 68 cout << setfill( '0' ) << setw( 2 ) << hour << ":" << setw( 2 ) << minute << ":" << setw( 2 ) << second; 69 } // end function printUniversal 70 71 // print Time in standard-time format (HH:MM:SS AM or PM) 72 void Time::printStandard() // note lack of const declaration 73 { 74 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 ) 75 << ":" << setfill( '0' ) << setw( 2 ) << minute 76 << ":" << setw( 2 ) << second << ( hour < 12 ? " AM" : " PM" ); 77 } // end function printStandard Systems Programming: Deeper into C++ 10 const Example 1 // Fig. 21.3: fig21_03.cpp 2 // Attempting to access a const object with non-const member functions. 3 #include "Time.h" // include Time class definition 4

5 int main() 6 { 7 Time wakeUp( 6, 45, 0 ); // non-constant object 8 const Time noon( 12, 0, 0 ); // constant object 9 // OBJECT MEMBER FUNCTION wakeUp.setHour( 18 ); // non-const non-const noon.setHour( 12 ); // const non-const wakeUp.getHour(); // non-const const 17 noon.getMinute();

// const const 18 noon.printUniversal(); // const const 20 noon.printStandard(); non-const 21 return 0; 10 11 Cannot invoke non-const member functions on a const object 12 13 14 15 16 19 // const 22 } // end main Systems Programming: Deeper into C++ 11 const Example Borland C++ command-line compiler error messages:

Warning W8037 called for Warning W8037 called for fig21_03.cpp const object fig21_03.cpp const object 13: Non-const function Time::setHour(int) in function main() 20: Non-const function Time::printStandard() in function main() Microsoft Visual C++.NET compiler error messages: C:\examples\ch21\Fig21_01_03\fig21_03.cpp(13) : error C2662: 'Time::setHour' : cannot convert 'this' pointer from 'const Time' to 'Time &' Conversion loses qualifiers C:\examples\ch21\Fig21_01_03\fig21_03.cpp(20) : error C2662: 'Time::printStandard' : cannot convert 'this' pointer from 'const Time' to 'Time &' Conversion loses qualifiers GNU C++ compiler error messages: Fig21_03.cpp:13: error: passing `const Time' as `this' argument of `void Time::setHour(int)' discards qualifiers Fig21_03.cpp:20: error: passing `const Time' as `this' argument of `void Time::printStandard()' discards qualifiers Systems Programming: Deeper into C++ 12 Member Initializer Required for initializing: const data members Data members that are references.

Can be used for any data member. Member initializer list Appears between a constructors parameter list and the left brace that begins the constructors body. Separated from the parameter list with a colon ( :). Each member initializer consists of the data member name followed by parentheses containing the members initial value. Multiple member initializers are separated by commas. Executes before the body of the constructor executes. Systems Programming: Deeper into C++ 13 Member Initializer 1 // Fig. 21.4: Increment.h 2 // Definition of class Increment. 3 #ifndef INCREMENT_H 4 #define INCREMENT_H 5 6 class Increment 7 { 8

public: 9 Increment( int c = 0, int i = 1 ); // default constructor 10 11 // function addIncrement definition 12 void addIncrement() 13 { count += increment; 14 15 } // end function addIncrement 16 17 void print() const; // prints count and increment 18 private: 19 int count; 20 const int increment; // const data member const data member that must be initialized using a member initializer

21 }; // end class Increment 22 23 #endif Systems Programming: Deeper into C++ 14 Member Initializer 1 // Fig. 21.5: Increment.cpp 2 // Member-function definitions for class Increment demonstrate using a 3 // member initializer to initialize a constant of a built-in data type. 4 #include 5 using std::cout; 6 using std::endl; 7 8 #include "Increment.h" // include definition of class Increment 9 Colon (:) marks the start of a member initializer list

10 // constructor 11 Increment::Increment( int c, int i ) 12 13 Member initializer for non-const member count : count( c ), // initializer for non-const member increment( i ) // required initializer for const member 14 { 15 // empty body 16 } // end constructor Increment Required member initializer for const member increment 17 18 // print count and increment values 19 void Increment::print() const 20 { 21 cout << "count = " << count << ", increment = " << increment << endl; 22 } // end function print Systems Programming: Deeper into C++ 15 Member Initializer 1 // Fig. 21.6: fig21_06.cpp 2 // Program to test class Increment.

3 #include 4 using std::cout; 5 6 #include "Increment.h" // include definition of class Increment 7 8 int main() 9 { 10 Increment value( 10, 5 ); 11 12 cout << "Before incrementing: "; 13 value.print(); 14 15 for ( int j = 1; j <= 3; j++ ) 16 {

17 value.addIncrement(); 18 cout << "After increment " << j << ": "; 19 value.print(); 20 } // end for 21 22 return 0; 23 } // end main Before incrementing: count After increment 1: count = After increment 2: count = After increment 3: count = = 10, increment 15, increment = 20, increment = 25, increment = = 5 5 5 5 Systems Programming: Deeper into C++ 16 Software Engineering Observation

21.3 A const object cannot be modified by assignment, so it must be initialized. When a data member of a class is declared const, const a member initializer must be used to provide the constructor with the initial value of the data member for an object of the class. The same is true for references. Systems Programming: Deeper into C++ 17 Common Programming Error 21.5 Not providing a member initializer for a const data member is a compilation error. Systems Programming: Deeper into C++ 18 Software Engineering Observation 21.4 Constant data members (const objects and const variables) and data members declared as references must be initialized with member initializer syntax; assignments for these types of data in the constructor

body are not allowed. Systems Programming: Deeper into C++ 19 21.3 Composition: Objects as Members of Classes Composition Sometimes referred to as a has-a relationship. A class can have objects of other classes as members. Example AlarmClock object with a Time object as a member. Systems Programming: Deeper into C++ 20 Composition: Objects as Members of Classes Initializing member objects Member initializers pass arguments from the objects constructor to member-object constructors. Member objects are constructed in the order in which they are declared in the class definition. Not in the order they are listed in the constructors member initializer list. Before the enclosing class object (host object) is constructed. If a member initializer is not provided The member objects default constructor will be called implicitly. Systems Programming: Deeper into C++ 21

Software Engineering Observation 21.5 A common form of software reusability is composition, composition in which a class has objects of other classes as members. Systems Programming: Deeper into C++ 22 Composition Example 1 // Fig. 21.10: Date.h 2 // Date class definition; Member functions defined in Date.cpp 3 #ifndef DATE_H 4 #define DATE_H 5 6 class Date 7 { 8

public: 9 Date( int = 1, int = 1, int = 1900 ); // default constructor 10 void print() const; // print date in month/day/year format 11 ~Date(); // provided to confirm destruction order 12 private: 13 int month; // 1-12 (January-December) 14 int day; // 1-31 based on month 15 int year; // any year 16 17 // utility function to check if day is proper for month and year 18 int checkDay( int ) const; 19 }; // end class Date 20 21 #endif Systems Programming: Deeper into C++ 23

Composition Example 1 // Fig. 21.11: Date.cpp 2 // Member-function definitions for class Date. 3 #include 4 using std::cout; 5 6 using std::endl; 7 #include "Date.h" // include Date class definition 8 9 // constructor confirms proper value for month; calls 10 // utility function checkDay to confirm proper value for day 11 Date::Date( int mn, int dy, int yr ) 12 { 13 if ( mn > 0 && mn <= 12 ) // validate the month month = mn; 14 15

else 16 { 17 18 19 month = 1; // invalid month set to 1 cout << "Invalid month (" << mn << ") set to 1.\n"; } // end else 20 21 22 year = yr; // could validate yr day = checkDay( dy ); // validate the day 23 24 // output Date object to show when its constructor is called 25 cout << "Date object constructor for date "; 26 print(); 27 cout << endl; 28 } // end Date constructor Systems Programming: Deeper into C++ 24 Composition Example

29 30 // print Date object in form month/day/year 31 void Date::print() const 32 { 33 cout << month << '/' << day << '/' << year; 34 } // end function print 35 36 // output Date object to show when its destructor is called 37 Date::~Date() 38 { 39 cout << "Date object destructor for date "; 40 print(); 41 cout << endl; 42 } // end ~Date destructor Systems Programming: Deeper into C++ 25 Composition Example 43 44 // utility function to confirm proper day value based on 45 // month and year; handles leap years, too 46 int Date::checkDay( int testDay ) const 47 { 48 49 static const int daysPerMonth[ 13 ] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

50 51 // determine whether testDay is valid for specified month 52 if ( testDay > 0 && testDay <= daysPerMonth[ month ] ) 53 return testDay; 54 55 // February 29 check for leap year 56 if ( month == 2 && testDay == 29 && ( year % 400 == 0 || 57 ( year % 4 == 0 && year % 100 != 0 ) ) ) 58 return testDay; 59 60 cout << "Invalid day (" << testDay << ") set to 1.\n"; 61 return 1; // leave object in consistent state if bad value 62 } // end function checkDay Systems Programming: Deeper into C++

26 Composition Example 1 // Fig. 21.12: Employee.h 2 // Employee class definition. 3 // Member functions defined in Employee.cpp. 4 #ifndef EMPLOYEE_H 5 #define EMPLOYEE_H 6 7 #include "Date.h" // include Date class definition 8 9 class Employee Parameters to be passed via member initializers to the constructor for class Date 10 { 11 public: 12 Employee( const char * const, const char * const, const Date &, const Date & );

13 14 void print() const; 15 ~Employee(); // provided to confirm destruction order const objects of class Date as members 16 private: 17 char firstName[ 25 ]; 18 char lastName[ 25 ]; 19 const Date birthDate; // composition: member object 20 const Date hireDate; // composition: member object 21 }; // end class Employee 22 23 #endif Systems Programming: Deeper into C++ 27 Composition Example 1 // Fig. 21.13: Employee.cpp 2

// Member-function definitions for class Employee. 3 #include 4 using std::cout; 5 using std::endl; 6 7 #include // strlen and strncpy prototypes 8 using std::strlen; 9 using std::strncpy; 10 11 #include "Employee.h" // Employee class definition 12 #include "Date.h" // Date class definition 13 14 // constructor uses member initializer list to pass initializer 15 // values to constructors of member objects birthDate and hireDate 16 // [Note: This invokes the so-called "default copy constructor" which the 17 // C++ compiler provides implicitly.] 18 Employee::Employee( const char * const first, const char * const last, 19 const Date &dateOfBirth, const Date &dateOfHire ) 20 : birthDate( dateOfBirth ), // initialize birthDate

21 hireDate( dateOfHire ) // initialize hireDate 22 { 23 // copy first into firstName and be sure that it fits 24 int length = strlen( first ); 25 length = ( length < 25 ? length : 24 ); 26 strncpy( firstName, first, length ); 27 firstName[ length ] = '\0'; Member initializers that pass arguments to Dates implicit default copy constructor Systems Programming: Deeper into C++ 28 Composition Example 28 29 30 31 32 33 34 35 36

37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 // copy last into lastName and be sure that it fits length = strlen( last ); length = ( length < 25 ? length : 24 ); strncpy( lastName, last, length ); lastName[ length ] = '\0'; // output Employee object to show when constructor is called cout << "Employee object constructor: " << firstName << ' ' << lastName << endl; } // end Employee constructor // print Employee object void Employee::print() const { cout << lastName << ", " << firstName << " hireDate.print(); cout << " Birthday: "; birthDate.print(); cout << endl; } // end function print Hired: "; // output Employee object to show when its destructor is called Employee::~Employee()

{ cout << "Employee object destructor: " << lastName << ", " << firstName << endl; } // end ~Employee destructor Systems Programming: Deeper into C++ 29 Composition Example 1 // Fig. 21.14: fig21_14.cpp 2 // Demonstrating composition--an object with member objects. 3 #include 4 using std::cout; 5 using std::endl; 6 7 #include "Employee.h" // Employee class definition 8 9 int main() 10 { 11

Date birth( 7, 24, 1949 ); 12 Date hire( 3, 12, 1988 ); 13 Employee manager( "Bob", "Blue", birth, hire ); 14 15 cout << endl; 16 manager.print(); Passing objects to a host object constructor 17 18 cout << "\nTest Date constructor with invalid values:\n"; 19 Date lastDayOff( 14, 35, 1994 ); // invalid month and day 20 cout << endl; 21 return 0; 22 } // end main Systems Programming: Deeper into C++ 30

Composition Example Date object constructor for date 7/24/1949 Date object constructor for date 3/12/1988 Employee object constructor: Bob Blue Blue, Bob Hired: 3/12/1988 Birthday: 7/24/1949 Test Date constructor with invalid values: Invalid month (14) set to 1. Invalid day (35) set to 1. Date object constructor for date 1/1/1994 Date object destructor for date 1/1/1994 Employee object destructor: Blue, Bob Date object destructor for date 3/12/1988 Date object destructor for date 7/24/1949 Date object destructor for date 3/12/1988 Date object destructor for date 7/24/1949 Systems Programming: Deeper into C++ 31 Common Programming Error 21.6 A compilation error occurs if a member object is not initialized with a member initializer and the member objects class does not provide a default constructor (i.e., the member objects class defines one or more constructors, but none is a default constructor). Systems Programming: Deeper into C++ 32

21.4 friend Functions and friend Classes friend function of a class Defined outside that classs scope. Not a member function of that class. has the right to access the non-public and public members of that class. Standalone functions or entire classes may be declared to be friends of a class. Can enhance performance. Often appropriate when a member function cannot be used for certain operations. Systems Programming: Deeper into C++ 33 friend Functions and friend Classes To declare a function as a friend of a class: Provide the function prototype in the class definition preceded by keyword friend. To declare a class as a friend of another class: Place a declaration of the form friend class ClassTwo; in the definition of class ClassOne All member functions of class ClassTwo are friends of class ClassOne. Systems Programming: Deeper into C++

34 friend Functions and friend Classes Friendship is granted, not taken. For class B to be a friend of class A, class A must explicitly declare that class B is its friend. friend Friendship relation is neither symmetric nor transitive If class A is a friend of class B, and class B is a friend of class C, you cannot infer that class B is a friend of class A, that class C is a friend of class B, or that class A is a friend of class C. Systems Programming: Deeper into C++ 35 friend Functions and friend Classes It is possible to specify overloaded functions as friends friend of a class. Each overloaded function intended to be a friend must be explicitly declared as a friend of the class. Systems Programming: Deeper into C++ 36 friend Function Example 1

// Fig. 21.15: fig21_15.cpp 2 // Friends can access private members of a class. 3 #include 4 using std::cout; 5 using std::endl; 6 7 // Count class definition 8 class Count 9 { 10 friend function declaration (can appear anywhere in the class) friend void setX( Count &, int ); // friend declaration 11 public: 12 // constructor

13 Count() : x( 0 ) // initialize x to 0 14 15 { // empty body 16 17 } // end constructor Count 18 19 // output x 20 void print() const 21 { 22 23 cout << x << endl; } // end function print 24 private: 25 int x; // data member 26 }; // end class Count

Systems Programming: Deeper into C++ 37 friend Function Example 27 28 // function setX can modify private data of Count 29 // because setX is declared as a friend of Count (line 10) 30 void setX( Count &c, int val ) 31 { 32 c.x = val; // allowed because setX is a friend of Count 33 } // end function setX 34 friend function can modify Counts private data 35 int main() 36 { 37 Count counter; // create Count object 38 39 cout << "counter.x after instantiation: "; 40 counter.print(); Calling a friend function; note that we pass the Count object to the function 41 42 setX( counter, 8 ); // set x using a friend function 43

cout << "counter.x after call to setX friend function: "; 44 counter.print(); 45 return 0; 46 } // end main counter.x after instantiation: 0 counter.x after call to setX friend function: 8 Systems Programming: Deeper into C++ 38 friend Function Example 1 // Fig. 10.16: fig10_16.cpp 2 // Non-friend/non-member functions cannot access private data of a class. 3 #include 4 using std::cout; 5 using std::endl; 6 7

// Count class definition (note that there is no friendship declaration) 8 class Count 9 { 10 public: 11 // constructor 12 Count() : x( 0 ) // initialize x to 0 13 14 { // empty body 15 16 } // end constructor Count 17 18 // output x 19 void print() const 20 {

21 22 cout << x << endl; } // end function print 23 private: 24 int x; // data member 25 }; // end class Count Systems Programming: Deeper into C++ 39 friend Function Example 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 // function cannotSetX tries to modify private data of Count, // but cannot because the function is not a friend of Count void cannotSetX( Count &c, int val ) { c.x = val; // ERROR: cannot access private member in Count } // end function cannotSetX Non-friend function cannot access

the classs private data int main() { Count counter; // create Count object cannotSetX( counter, 3 ); // cannotSetX is not a friend return 0; } // end main Systems Programming: Deeper into C++ 40 friend Function Example Borland C++ command-line compiler error message: Error E2247 Fig21_16/fig21_16.cpp 31: 'Count::x' is not accessible in function cannotSetX(Count &,int) Microsoft Visual C++.NET compiler error messages: C:\examples\ch21\Fig21_16\fig21_16.cpp(31) : error C2248: 'Count::x' : cannot access private member declared in class 'Count' C:\examples\ch21\Fig21_16\fig21_16.cpp(24) : see declaration of 'Count::x' C:\examples\ch21\Fig21_16\fig21_16.cpp(9) : see declaration of 'Count' GNU C++ compiler error messages: Fig21_16.cpp:24: error: 'int Count::x' is private Fig21_16.cpp:31: error: within this context Systems Programming: Deeper into C++ 41 21.5 Using the this Pointer Member functions know which objects data members to manipulate. Every object has access to its own address through a pointer called this (a C++ keyword). An objects this pointer is not part of the object itself.

The this pointer is passed (by the compiler) as an implicit argument to each of the objects non-static member functions. Systems Programming: Deeper into C++ 42 21.5 Using the this Pointer Objects use the this pointer implicitly or explicitly. this is used implicitly when accessing members directly. It is used explicitly when using keyword this. The type of the this pointer depends on the type of the object and whether the executing member function is declared const. Systems Programming: Deeper into C++ 43 this Example 1 // Fig. 21.17: fig21_17.cpp 2 // Using the this pointer to refer to object members. 3 #include 4 using std::cout; 5

using std::endl; 6 7 class Test 8 { 9 public: 10 Test( int = 0 ); // default constructor 11 void print() const; 12 private: 13 int x; 14 }; // end class Test 15 16 // constructor 17 Test::Test( int value ) 18 : x( value ) // initialize x to value 19 { 20 // empty body 21 } // end constructor Test

Systems Programming: Deeper into C++ 44 this Example 22 23 // print x using implicit and explicit this pointers; 24 // the parentheses around *this are required 25 void Test::print() const 26 { 27 // implicitly use the this pointer to access the member x 28 cout << " x = " << x; Implicitly using the this pointer to access member x 29 30 // explicitly use the this pointer and the arrow operator 31 // to access the member x 32 cout << "\n this->x = " << this->x; 33 34 // explicitly use the dereferenced this pointer and

35 // the dot operator to access the member x 36 cout << "\n(*this).x = " << ( *this ).x << endl; Explicitly using the this pointer to access member x 37 } // end function print Using the dereferenced this pointer and the dot operator 38 39 int main() 40 { 41 Test testObject( 12 ); // instantiate and initialize testObject 42 43 testObject.print(); 44 return 0; 45 } // end main x = 12 this->x = 12 (*this).x = 12 Systems Programming: Deeper into C++ 45 Common Programming Error 21.7

Attempting to use the member selection operator (.) with a pointer to an object is a compilation errorthe dot member selection operator may be used only with an lvalue such as an objects name, name a reference to an object or a dereferenced pointer to an object. Systems Programming: Deeper into C++ 46 Using the this Pointer Cascaded member-function calls Multiple functions are invoked in the same statement. Enabled by member functions returning the dereferenced this pointer. Example t.setMinute( 30 ).setSecond( 22 ); Calls t.setMinute( 30 ); Then calls t.setSecond( 22 ); Systems Programming: Deeper into C++ 47 Cascading Function Calls using the this Pointer 1 // Fig. 21.18: Time.h 2 // Cascading member function calls. 3 4

// Time class definition. 5 // Member functions defined in Time.cpp. 6 #ifndef TIME_H 7 #define TIME_H 8 9 class Time 10 { 11 public: 12 Time( int = 0, int = 0, int = 0 ); // default constructor 13 14 // set functions (the Time & return types enable cascading) 15 Time &setTime( int, int, int ); // set hour, minute, second 16 Time &setHour( int ); // set hour 17 Time &setMinute( int ); // set minute

18 Time &setSecond( int ); // set second set functions return Time & to enable cascading Systems Programming: Deeper into C++ 48 Cascading Function Calls using the this Pointer 19 20 // get functions (normally declared const) 21 int getHour() const; // return hour 22 int getMinute() const; // return minute 23 int getSecond() const; // return second 24 25 // print functions (normally declared const) 26 void printUniversal() const; // print universal time 27 void printStandard() const; // print standard time 28 private:

29 int hour; // 0 - 23 (24-hour clock format) 30 int minute; // 0 - 59 31 int second; // 0 - 59 32 }; // end class Time 33 34 #endif Systems Programming: Deeper into C++ 49 Cascading Function Calls using the this Pointer 1 // Fig. 21.19: Time.cpp 2 // Member-function definitions for Time class. 3 #include 4 using std::cout; 5 6 #include

7 using std::setfill; 8 using std::setw; 9 10 #include "Time.h" // Time class definition 11 12 // constructor function to initialize private data; 13 // calls member function setTime to set variables; 14 // default values are 0 (see class definition) 15 Time::Time( int hr, int min, int sec ) 16 { 17 setTime( hr, min, sec ); 18 } // end Time constructor 19 20 // set values of hour, minute, and second 21 Time &Time::setTime( int h, int m, int s ) // note Time & return 22 { 23 setHour( h ); 24 setMinute( m ); 25 setSecond( s ); 26 return *this; // enables cascading Returning dereferenced this pointer enables cascading

27 } // end function setTime Systems Programming: Deeper into C++ 50 28 Cascading Function Calls using the this Pointer 29 // set hour value 30 Time &Time::setHour( int h ) // note Time & return 31 { 32 hour = ( h >= 0 && h < 24 ) ? h : 0; // validate hour 33 return *this; // enables cascading 34 } // end function setHour 35 36 // set minute value 37 Time &Time::setMinute( int m ) // note Time & return 38 { 39 minute = ( m >= 0 && m < 60 ) ? m : 0; // validate minute 40 return *this; // enables cascading 41 } // end function setMinute 42 43 // set second value 44 Time &Time::setSecond( int s ) // note Time & return 45 { 46

second = ( s >= 0 && s < 60 ) ? s : 0; // validate second 47 return *this; // enables cascading 48 } // end function setSecond 49 50 // get hour value 51 int Time::getHour() const 52 { 53 return hour; 54 } // end function getHour Systems Programming: Deeper into C++ 51 55 Cascading Function Calls using the this Pointer 56 // get minute value 57 int Time::getMinute() const 58 { 59 return minute; 60 } // end function getMinute 61 62 // get second value 63 int Time::getSecond() const 64 { 65 return second; 66 } // end function getSecond

67 68 // print Time in universal-time format (HH:MM:SS) 69 void Time::printUniversal() const 70 { 71 72 cout << setfill( '0' ) << setw( 2 ) << hour << ":" << setw( 2 ) << minute << ":" << setw( 2 ) << second; 73 } // end function printUniversal 74 75 // print Time in standard-time format (HH:MM:SS AM or PM) 76 void Time::printStandard() const 77 { 78 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 ) 79 << ":" << setfill( '0' ) << setw( 2 ) << minute 80 << ":" << setw( 2 ) << second << ( hour < 12 ? " AM" : " PM" ); 81 } // end function printStandard Systems Programming: Deeper into C++ 52 Cascading Function Calls using the this Pointer 1 // Fig. 21.20: fig21_20.cpp 2 3

// Cascading member function calls with the this pointer. #include 4 using std::cout; 5 6 using std::endl; 7 #include "Time.h" // Time class definition 8 9 int main() 10 { 11 12 Time t; // create Time object 13 // cascaded function calls 14 15 t.setHour( 18 ).setMinute( 30 ).setSecond( 22 ); 16 // output time in universal and standard formats 17 cout << "Universal time: "; 18 19

t.printUniversal(); 20 cout << "\nStandard time: "; 21 22 t.printStandard(); 23 cout << "\n\nNew standard time: "; Cascaded function calls using the reference returned by one function call to invoke the next Note that these calls must appear in the order shown, because printStandard does not return a reference to t 24 25 26 // cascaded function calls t.setTime( 20, 20, 20 ).printStandard(); 27 cout << endl; 28 return 0; 29 } // end main Systems Programming: Deeper into C++ 53

Cascading Function Calls using the this Pointer Universal time: 18:30:22 Standard time: 6:30:22 PM New standard time: 8:20:20 PM Systems Programming: Deeper into C++ 54 21.6 Dynamic Memory Management: Operators new and delete Dynamic memory management Enables programmers to allocate and deallocate memory for any built-in or user-defined type. Performed by operators new and delete. For example, dynamically allocating memory for an array instead of using a fixed-size array. Systems Programming: Deeper into C++ 55 Operators new and delete Operator new Allocates (i.e., reserves) storage of the proper size for an object at execution time Calls a constructor to initialize the object. Returns a pointer of the type specified to the right of new.

new Can be used to dynamically allocate any fundamental type (such as int or double) double or any class type. The Free store (referred to as the heap) Region of memory assigned to each program for storing objects created at execution time. Example: Time *timePtr timePtr = new Time; Systems Programming: Deeper into C++ 56 Operators new and delete Operator delete Destroys a dynamically allocated object. Calls the destructor for the object. Deallocates (i.e., releases) memory from the free store. The memory can then be reused by the system to allocate other objects. Example: delete timePtr; Systems Programming: Deeper into C++ 57 Operators new and delete Initializing an object allocated by new Initializer for a newly created fundamental-type variable. Example double *ptr = new double( 3.14159 );

Specify a comma-separated list of arguments to the constructor of an object. Example Time *timePtr = new Time( 12, 45, 0 ); Systems Programming: Deeper into C++ 58 Operators new and delete new operator can be used to allocate arrays dynamically. Dynamically allocate a 10-element integer array: int *gradesArray = new int[ 10 ]; Size of a dynamically allocated array Specified using any integral expression that can be evaluated at execution time. Stores * storeptr = new Stores[first_floor]; Systems Programming: Deeper into C++ 59 Operators new and delete Delete a dynamically allocated array: delete [] gradesArray; This deallocates the array to which gradesArray points. If the pointer points to an array of objects, It first calls the destructor for every object in the array. Then it deallocates the memory. If the statement did not include the square brackets ([]) [] and gradesArray pointed to an array of objects Only the first object in the array would have a destructor call.

Systems Programming: Deeper into C++ 60 21.7 static Class Members static data member Only one copy of a variable shared by all objects of a class. The member is Class-wide information. A property of the class shared by all instances, not a property of a specific object of the class. Declaration begins with keyword static Systems Programming: Deeper into C++ 61 static Class Members Example Video game with Martians and other space creatures Each Martian needs to know the martianCount. martianCount should be static class-wide data. Every Martian can access martianCount as if it were a data member of that Martian Only one copy of martianCount exists. May seem like global variables but static has class scope. Can be declared public, public private or protected. protected Systems Programming: Deeper into C++ 62

static Class Members Fundamental-type static data members Initialized by default to 0. If you want a different initial value, a static data member can be initialized once (and only once). const static data member of int or enum type Can be initialized in its declaration in the class definition. All other static data members Must be defined at file scope (i.e., outside the body of the class definition) Can be initialized only in those definitions. static data members of class types (i.e., static member objects) that have default constructors Need not be initialized because their default constructors will be called. Systems Programming: Deeper into C++ 63 static Class Members Exists even when no objects of the class exist. To access a public static class member when no objects of the class exist. Prefix the class name and the binary scope resolution operator (::) :: to the name of the data member. Example Martian::martianCount Also accessible through any object of that class

Use the objects name, the dot operator and the name of the member. Example myMartian.martianCount Systems Programming: Deeper into C++ 64 static Class Members static member function Is a service of the class, class not of a specific object of the class. static is applied to an item at file scope. That item becomes known only in that file. The static members of the class need to be available from any client code that accesses the file. So we cannot declare them static in the .cpp filewe declare them static only in the .h file. Systems Programming: Deeper into C++ 65 static class member Example 1 // Fig. 21.21: Employee.h 2 // Employee class definition. 3

#ifndef EMPLOYEE_H 4 #define EMPLOYEE_H 5 6 class Employee 7 { 8 public: 9 Employee( const char * const, const char * const ); // constructor 10 ~Employee(); // destructor 11 const char *getFirstName() const; // return first name 12 const char *getLastName() const; // return last name 13 14 // static member function 15 static int getCount(); // return number of objects instantiated

16 private: 17 char *firstName; 18 char *lastName; Function prototype for static member function 19 20 // static data 21 static int count; // number of objects instantiated 22 }; // end class Employee static data member keeps track of number of Employee objects that currently exist 23 24 #endif Systems Programming: Deeper into C++ 66 static class member Example 1 // Fig. 21.22: Employee.cpp 2 // Member-function definitions for class Employee.

3 #include 4 using std::cout; 5 using std::endl; 6 7 #include // strlen and strcpy prototypes 8 using std::strlen; 9 using std::strcpy; 10 11 #include "Employee.h" // Employee class definition 12 13 // define and initialize static data member at file scope 14 int Employee::count = 0; 15 static data member is defined and initialized at file scope in the .cpp file 16 // define static member function that returns number of 17 // Employee objects instantiated (declared static in Employee.h) 18 int Employee::getCount() 19 { 20 return count;

21 } // end static function getCount static member function can access only static data, because the function might be called when no objects exist Systems Programming: Deeper into C++ 67 22 static class member Example 23 // constructor dynamically allocates space for first and last name and 24 // uses strcpy to copy first and last names into the object 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

Employee::Employee( const char * const first, const char * const last ) { firstName = new char[ strlen( first ) + 1 ]; strcpy( firstName, first ); Dynamically allocating char arrays lastName = new char[ strlen( last ) + 1 ]; strcpy( lastName, last ); count++; // increment static count of employees cout << "Employee constructor for " << firstName << ' ' << lastName << " called." << endl; } // end Employee constructor Non-static member function (i.e., constructor) can modify the classs static data members // destructor deallocates dynamically allocated memory Employee::~Employee() { cout << "~Employee() called for " << firstName << ' ' << lastName << endl; delete [] firstName; // release memory delete [] lastName; // release memory Deallocating memory reserved for arrays count--; // decrement static count of employees } // end ~Employee destructor Systems Programming: Deeper into C++ 68 static class member Example 50 51 // return first name of employee 52 const char *Employee::getFirstName() const 53 { 54

// const before return type prevents client from modifying 55 // private data; client should copy returned string before 56 // destructor deletes storage to prevent undefined pointer 57 return firstName; 58 } // end function getFirstName 59 60 // return last name of employee 61 const char *Employee::getLastName() const 62 { 63 // const before return type prevents client from modifying 64 // private data; client should copy returned string before 65 // destructor deletes storage to prevent undefined pointer 66 return lastName; 67 } // end function getLastName Systems Programming: Deeper into C++ 69 1 2

3 4 5 6 7 8 static class member Example // Fig. 21.23: fig21_23.cpp // Driver to test class Employee. #include using std::cout; using std::endl; #include "Employee.h" // Employee class definition 9 int main() 10 { 11 // use class name and binary scope resolution operator to 12 // access sta tic number function getCount 13 cout << "Number of employees before instantiation of any objects is " 14 << Employee::getCount() << endl; // use class name Calling static member function using class name 15 and binary scope resolution operator 16 // use new to dynamically create two new Employees 17 // operator new also calls the object's constructor 18 Employee *e1Ptr = new Employee( "Susan", "Baker" ); 19 Employee *e2Ptr = new Employee( "Robert", "Jones" ); Dynamically creating Employees with new 20 21

// call getCount on first Employee object 22 cout << "Number of employees after objects are instantiated is " 23 << e1Ptr->getCount(); Calling a static member function through 24 a pointer to an object of the class 25 cout << "\n\nEmployee 1: " 26 << e1Ptr->getFirstName() << " " << e1Ptr->getLastName() 27 28 << "\nEmployee 2: " << e2Ptr->getFirstName() << " " << e2Ptr->getLastName() << "\n\n"; Systems Programming: Deeper into C++ 70 29 static class member Example 30 delete e1Ptr; // deallocate memory 31 e1Ptr = 0; // disconnect pointer from free-store space 32 delete e2Ptr; // deallocate memory 33 e2Ptr = 0; // disconnect pointer from free-store space

34 Releasing memory to which a pointer points 35 Disconnecting a pointer from any // no objects exist, so call static member function getCount againspace 36 // using the class name and the binary scope resolution operator 37 cout << "Number of employees after objects are deleted is " 38 39 in memory << Employee::getCount() << endl; return 0; 40 } // end main Number of employees before instantiation of any objects is 0 Employee constructor for Susan Baker called. Employee constructor for Robert Jones called. Number of employees after objects are instantiated is 2 Employee 1: Susan Baker Employee 2: Robert Jones ~Employee() called for Susan Baker ~Employee() called for Robert Jones Number of employees after objects are deleted is 0 Systems Programming: Deeper into C++

71 static Class Members Declare a member function static If it does not access non-static data members or non-static member functions of the class. A static member function does not have a this pointer. static data members and static member functions exist independently of any objects of a class. When a static member function is called, there might not be any objects of its class in memory. Systems Programming: Deeper into C++ 72 Abstract data types (ADTs) Essentially ways of representing real-world notions to some satisfactory level of precision within a computer system. Types like int, double, char and others are all ADTs. e.g., int is an abstract representation of an integer. Captures two notions: Data representation Operations that can be performed on the data. C++ classes implement ADTs and their services. Systems Programming: Deeper into C++

73 Array Abstract Data Type Many array operations not built into C++ e.g., subscript range checking Programmers can develop an array ADT as a class that is preferable to raw arrays Can provide many helpful new capabilities C++ Standard Library class template vector. Systems Programming: Deeper into C++ 74 Summary const objects and const member functions Member Composition Example friend function Example this pointer Example Dynamic memory management new and delete operators

static class members Abstract Data Types Systems Programming: Deeper into C++ 75

Recently Viewed Presentations

  • PowerPoint Presentation

    PowerPoint Presentation

    Route of excretion. UF rate. Type of dialyser. Blood flow rate. Sieving co-efficient (close to 1) Some exceptions e.g. digoxin . Small molecules by diffusion. Large molecules by convection. High Vd means most of drug is tissue bound and not...
  • Mike Paterson Uri Zwick

    Mike Paterson Uri Zwick

    Completely Unimodular Functions (CUF) Wiedemann (1985)Hammer, Simone, Liebling, De Werra (1988)Williamson Hoke (1988) Abstract setting. Abstract Objective functions (AOF) Kalai (1992) Gärtner (1995) Completely Local-Global (CLG) Björklund, Sandberg, Vorobyov (2004)
  • Peripheral Neuropathy, Chemotherapy &amp; You

    Peripheral Neuropathy, Chemotherapy & You

    Any patient with self-identified peripheral neuropathy, not in active treatment. Treatments. PBM vs placebo 3x/week for 6 weeks. No new treatment (but could continue any you were on) Measures/Outcomes. Modified Total Neuropathy Score (mTNS) Primary outcome - ∆mTNS at 8...
  • Domestic and Industrial Machines - Mr Hoover&#x27;s Homepage

    Domestic and Industrial Machines - Mr Hoover's Homepage

    A second class lever and a third class lever. The cutting blades themselves are also simple machines as they are inclined planes. Other common examples found around the house are can openers, faucets, window shades, coffee grinders, pianos, bathroom scales...
  • Présentation PowerPoint

    Présentation PowerPoint

    Injecting Social Diversity . in Multi-Objective Genetic Programing: the Case of Well-formedness Rule Learning. Edouard . Batot, Houari. Sahraoui. DIRO, Université de Montréal
  • Nitrogen budgets in Sierran Forests: Relative roles of ...

    Nitrogen budgets in Sierran Forests: Relative roles of ...

    Read the entire paper in depth, make extensive notes, put in definites pile. Put in probables pile. No. I am doing a review on the effects of atmospheric N deposition on soil exchangeable calcium and acidification.
  • General Intervention Strategies Related to the Sensory ...

    General Intervention Strategies Related to the Sensory ...

    Goals to be addressed:To provide an environment that increases or decreases sensory input or that matches the level of stimuli needed by the student.To assist students in regulating their level of stimulation to a workable level.To teach students appropriate ways...
  • Ethics &amp; Values - MCCC

    Ethics & Values - MCCC

    Arial Arial Black Calibri Times NRS 101 Ethics and Valus 1_NRS 101 Ethics and Valus Ethics & Values About Ethics Values Values Professional Values Clarifying Client Values Slide 7 Principles of Ethical Decision Making Nursing Codes of Ethics Models of...