C++ Class
C++ Class
Outline
const (Constant) Objects and const Member Functions Dynamic Memory Allocation with Operators new and delete static Class Members Data Abstraction and Information Hiding
Keyword const
Specify that an object is not modifiable Any attempt to modify the object is a syntax error For example:
const time noon( 12, 0, 0 );
const (Constant) Objects and const Member Functions const objects require const functions
Functions declared const cannot modify the object const specified in function prototype and definition
Prototype: ReturnType FunctionName(param1,param2) const; Definition: ReturnType FunctionName(param1,param2) const { };
Example: int A::getValue() const {return privateDataMember}; - Returns the value of a data member, and is appropriately declared const
1 // time5.h 2 // Declaration of the class Time. 3 // Member functions defined in time5.cpp 4 #ifndef TIME5_H 5 #define TIME5_H 6 7 class Time { 8 public: 9 Time( int = 0, int = 0, int = 0 ); // default constructor 10 11 // set functions 12 void setTime( int, int, int ); // set time 13 void setHour( int ); // set hour 14 void setMinute( int ); // set minute 15 void setSecond( int ); // set second 16 17 // get functions (normally declared const) 18 int getHour() const; // return hour 19 int getMinute() const; // return minute 20 int getSecond() const; // return second 21 22 // print functions (normally declared const) 23 void printMilitary() const; // print military time 24 void printStandard(); // print standard time 25 private: 26 int hour; // 0 - 23 27 int minute; // 0 - 59 28 int second; // 0 - 59 29 }; 30
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
// time5.cpp // Member function definitions for Time class. #include <iostream> using std::cout; #include "time5.h" // Constructor function to initialize private data. // Default values are 0 (see class definition). Time::Time( int hr, int min, int sec ) { setTime( hr, min, sec ); } // Set the values of hour, minute, and second. void Time::setTime( int h, int m, int s ) { setHour( h ); setMinute( m ); setSecond( s ); } // Set the hour value void Time::setHour( int h ) { hour = ( h >= 0 && h < 24 ) ? h : 0; } // Set the minute value void Time::setMinute( int m ) { minute = ( m >= 0 && m < 60 ) ? m : 0; } // Set the second value void Time::setSecond( int s ) { second = ( s >= 0 && s < 60 ) ? s : 0; }
64 65 // Get the hour value 66 int Time::getHour() const { return hour; } 67 68 // Get the minute value 69 int Time::getMinute() const { return minute; } 70 71 // Get the second value 72 int Time::getSecond() const { return second; } 73 74 // Display military format time: HH:MM 75 void Time::printMilitary() const 76 { 77 78 79 } 80 81 // Display standard format time: HH:MM:SS AM (or PM) 82 void Time::printStandard() 83 { 84 85 86 87 88 } cout << ( ( hour == 12 ) ? 12 : hour % 12 ) << ":" << ( minute < 10 ? "0" : "" ) << minute << ":" << ( second < 10 ? "0" : "" ) << second << ( hour < 12 ? " AM" : " PM" ); // should be const cout << ( hour < 10 ? "0" : "" ) << hour << ":" << ( minute < 10 ? "0" : "" ) << minute;
89 // 01.cpp 90 // Attempting to access a const object with 91 // non-const member functions. 92 #include "time5.h" 93 94 int main() 95 { 96 Time wakeUp( 6, 45, 0 ); // non-constant object 97 const Time noon( 12, 0, 0 ); // constant object 98 99 // MEMBER FUNCTION OBJECT 100 wakeUp.setHour( 18 ); // non-const non-const 101 102 noon.setHour( 12 ); // non-const const 103 104 wakeUp.getHour(); // const non-const 105 106 noon.getMinute(); // const const 107 noon.printMilitary(); // const const 108 noon.printStandard(); // non-const const 109 return 0; 110 } Compiling... 01.cpp d:\01.cpp(14) : error C2662: 'setHour' : cannot convert 'this' pointer from 'const class Time' to 'class Time &' Conversion loses qualifiers d:\01.cpp(20) : error C2662: 'printStandard' : cannot convert 'this' pointer from 'const class Time' to 'class Time &' Conversion loses qualifiers Time5.cpp Error executing cl.exe. test.exe - 2 error(s), 0 warning(s)
Data member increment in class Increment. Constructor for Increment is modified as follows:
Increment::Increment( int c, int i ) : increment( i ) { count = c; } ": increment( i )" initializes increment to the value of i.
Any data member can be initialized using member initializer syntax consts and references must be initialized this way
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
// 02.cpp // Using a member initializer to initialize a // constant of a built-in data type. #include <iostream> using std::cout; using std::endl; class Increment { public: Increment( int c = 0, int i = 1 ); void addIncrement() { count += increment; } void print() const; private: int count; const int increment; };
// Constructor for class Increment Increment::Increment( int c, int i ) : increment( i ) // initializer for const member { count = c; } // Print the data void Increment::print() const { cout << "count = " << count << ", increment = " << increment << endl; } int main() {
34 35 36 37 38 39 40 41 42 43 44 45 46 }
Increment value( 10, 5 ); cout << "Before incrementing: "; value.print(); for ( int j = 0; j < 3; j++ ) { value.addIncrement(); cout << "After increment " << j + 1 << ": "; value.print(); } return 0;
Before incrementing: count After increment 1: count = After increment 2: count = After increment 3: count =
= 5 5 5 5
Example:
TypeName *typeNamePtr; Creates pointer to a TypeName object typeNamePtr = new TypeName; new creates TypeName object, returns pointer (which typeNamePtr is set equal to)
delete typeNamePtr;
Initializing objects
to delete arrays
static member functions cannot access non-static data or functions No this pointer, function exists independent of objects
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
//employ1.h // An employee class #ifndef EMPLOY1_H #define EMPLOY1_H class Employee { public: Employee( const char*, const char* ~Employee(); const char *getFirstName() const; const char *getLastName() const;
// static member function static int getCount(); // return # objects instantiated private: char *firstName; char *lastName; // static data member static int count; // number of objects instantiated }; #endif
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 50 51 52 53 54 55 56
// employ1.cpp // Member function definitions for class Employee #include <iostream> using std::cout; using std::endl; #include <cstring> #include <cassert> #include "employ1.h" // Initialize the static data member int Employee::count = 0; // Define the static member function that // returns the number of employee objects instantiated. int Employee::getCount() { return count; } // Constructor dynamically allocates space for the // first and last name and uses strcpy to copy // the first and last names into the object Employee::Employee( const char *first, const char *last ) { firstName = new char[ strlen( first ) + 1 ]; assert( firstName != 0 ); // ensure memory allocated strcpy( firstName, first ); lastName = new char[ strlen( last ) + 1 ]; assert( lastName != 0 ); // ensure memory allocated strcpy( lastName, last ); ++count; // increment static count of employees
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
cout << "Employee constructor for " << firstName << ' ' << lastName << " called." << endl; } // Destructor deallocates dynamically allocated memory Employee::~Employee() { cout << "~Employee() called for " << firstName << ' ' << lastName << endl; delete [] firstName; // recapture memory delete [] lastName; // recapture memory --count; // decrement static count of employees } // Return first name of employee const char *Employee::getFirstName() const { // Const before return type prevents client from modifying // private data. Client should copy returned string before // destructor deletes storage to prevent undefined pointer. return firstName; } // Return last name of employee const char *Employee::getLastName() const { // Const before return type prevents client from modifying // private data. Client should copy returned string before // destructor deletes storage to prevent undefined pointer. return lastName; }
88 // 09.cpp 89 // Driver to test the employee class 90 #include <iostream> 91 92 using std::cout; 93 using std::endl; 94 95 #include "employ1.h" 96 97 int main() 98 { 99 cout << "Number of employees before instantiation is " 100 << Employee::getCount() << endl; // use class name 101 102 Employee *e1Ptr = new Employee( "Susan", "Baker" ); 103 Employee *e2Ptr = new Employee( "Robert", "Jones" ); 104 105 cout << "Number of employees after instantiation is " 106 << e1Ptr->getCount(); 107 108 cout << "\n\nEmployee 1: " 109 << e1Ptr->getFirstName() 110 << " " << e1Ptr->getLastName() 111 << "\nEmployee 2: " 112 << e2Ptr->getFirstName() 113 << " " << e2Ptr->getLastName() << "\n\n"; 114 115 delete e1Ptr; // recapture memory 116 e1Ptr = 0; 117 delete e2Ptr; // recapture memory 118 e2Ptr = 0;
119 120 121 122 123 124 } return 0; cout << "Number of employees after deletion is " << Employee::getCount() << endl;
Number of employees before instantiation is 0 Employee constructor for Susan Baker called. Employee constructor for Robert Jones called. Number of employees after instantiation is 2 Employee 1: Susan Baker Employee 2: Robert Jones ~Employee() called for Susan Baker ~Employee() called for Robert Jones Number of employees after deletion is 0