Ngôn ngữ lập trình C++ - Chương 6: Cấu trúc dữ liệu trừu tượng
6.1 Giới thiệu
6.2 Cấu trúc - struct
6.3 Truy nhập các thành viên của struct
6.4 Cài đặt kiểu dữliệu người dùng Time bằng struct
6.5 Cài đặt một kiểu dữliệu trừu tượng Time bằng một lớp - class
6.6 Phạm vi lớp và truy nhập các thành viên của lớp
6.7 Tách giao diện ra khỏi cài đặt
6.8 Quản lý quyền truy nhập thành viên
6.9 Các hàm truy nhập và các hàm tiện ích
6.10 Khởi tạo các đối tượng: Constructor
6.11 Sửdụng các đối sốmặc định cho Constructor
6.12 Destructor-hàm hủy
6.13 Khi nào Constructor và Destructor được gọi
6.14 Sửdụng các hàm Set và Get
6.15 Phép gán đối tượng mặc định
c in create) Object 3 destructor runs (local static in main) Object 1 destructor runs (global before main) các destructor cho các đối tượng tự động địa phương trong hàm main được gọi theo thứ tự ngược với các constructor. đối tượng static địa phương tồn tại cho đến khi chương trình kết thúc đối tượng toàn cục được tạo trước khi main bắt đầu và bị hủy cuối cùng. các đối tượng tự động địa phương bị hủy sau khi hàm kết thúc theo thứ tự ngược với thứ tự tạo. đối tượng static địa phương được tạo tại lời gọi hàm đầu tiên và hủy sau khi hàm main kết thúc. fig06_17.cpp output (1 of 1) © 2004 Trần Minh Châu. FOTECH. VNU 69 Chương 6. 6.14 Sử dụng các hàm truy nhập • Set functions – các hàm ghi – kiểm tra tính hợp lệ trước khi sửa đổi dữ liệu private – thông báo nếu các giá trị là không hợp lệ – thông báo qua các giá trị trả về • Get functions – các hàm đọc – các hàm truy vấn – “Query” functions – quản lý định dạng của dữ liệu trả về ©2004 Trần Minh Châu. FOTECH. VNU. 70 time3.h (1 of 2) 1 // Fig. 6.18: time3.h 2 // Declaration of class Time. 3 // Member functions defined in time3.cpp 4 5 // prevent multiple inclusions of header file 6 #ifndef TIME3_H 7 #define TIME3_H 8 9 class Time { 10 11 public: 12 Time( int = 0, int = 0, int = 0 ); // default constructor 13 14 // set functions 15 void setTime( int, int, int ); // set hour, minute, second 16 void setHour( int ); // set hour 17 void setMinute( int ); // set minute 18 void setSecond( int ); // set second 19 20 // get functions 21 int getHour(); // return hour 22 int getMinute(); // return minute 23 int getSecond(); // return second 24 Các hàm ghi các hàm đọc ©2004 Trần Minh Châu. FOTECH. VNU. 71 time3.h (2 of 2) 25 void printUniversal(); // output universal-time format 26 void printStandard(); // output standard-time format 27 28 private: 29 int hour; // 0 - 23 (24-hour clock format) 30 int minute; // 0 - 59 31 int second; // 0 - 59 32 33 }; // end clas Time 34 35 #endif ©2004 Trần Minh Châu. FOTECH. VNU. 72 time3.cpp (1 of 4) 1 // Fig. 6.19: time3.cpp 2 // Member-function definitions for Time class. 3 #include 4 5 using std::cout; 6 7 #include 8 9 using std::setfill; 10 using std::setw; 11 12 // include definition of class Time from time3.h 13 #include "time3.h" 14 15 // constructor function to initialize private data; 16 // calls member function setTime to set variables; 17 // default values are 0 (see class definition) 18 Time::Time( int hr, int min, int sec ) 19 { 20 setTime( hr, min, sec ); 21 22 } // end Time constructor 23 ©2004 Trần Minh Châu. FOTECH. VNU. 73 time3.cpp (2 of 4) 24 // set hour, minute and second values 25 void Time::setTime( int h, int m, int s ) 26 { 27 setHour( h ); 28 setMinute( m ); 29 setSecond( s ); 30 31 } // end function setTime 32 33 // set hour value 34 void Time::setHour( int h ) 35 { 36 hour = ( h >= 0 && h < 24 ) ? h : 0; 37 38 } // end function setHour 39 40 // set minute value 41 void Time::setMinute( int m ) 42 { 43 minute = ( m >= 0 && m < 60 ) ? m : 0; 44 45 } // end function setMinute 46 Gọi các hàm set dể kiểm tra tính hợp lệ. Các hàm set kiểm tra tính hợp lệ trước khi sửa đổi dữ liệu. ©2004 Trần Minh Châu. FOTECH. VNU. 74 time3.cpp (3 of 4) 47 // set second value 48 void Time::setSecond( int s ) 49 { 50 second = ( s >= 0 && s < 60 ) ? s : 0; 51 52 } // end function setSecond 53 54 // return hour value 55 int Time::getHour() 56 { 57 return hour; 58 59 } // end function getHour 60 61 // return minute value 62 int Time::getMinute() 63 { 64 return minute; 65 66 } // end function getMinute 67 Các hàm set kiểm tra tính hợp lệ trước khi sửa đổi dữ liệu. Các hàm get cho client đọc dữ liệu ©2004 Trần Minh Châu. FOTECH. VNU. 75 time3.cpp (4 of 4) 68 // return second value 69 int Time::getSecond() 70 { 71 return second; 72 73 } // end function getSecond 74 75 // print Time in universal format 76 void Time::printUniversal() 77 { 78 cout << setfill( '0' ) << setw( 2 ) << hour << ":" 79 << setw( 2 ) << minute << ":" 80 << setw( 2 ) << second; 81 82 } // end function printUniversal 83 84 // print Time in standard format 85 void Time::printStandard() 86 { 87 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 ) 88 << ":" << setfill( '0' ) << setw( 2 ) << minute 89 << ":" << setw( 2 ) << second 90 << ( hour < 12 ? " AM" : " PM" ); 91 92 } // end function printStandard Hàm get cho client đọc dữ liệu ©2004 Trần Minh Châu. FOTECH. VNU. 76 fig06_20.cpp (1 of 3) 1 // Fig. 6.20: fig06_20.cpp 2 // Demonstrating the Time class set and get functions 3 #include 4 5 using std::cout; 6 using std::endl; 7 8 // include definition of class Time from time3.h 9 #include "time3.h" 10 11 void incrementMinutes( Time &, const int ); // prototype 12 13 int main() 14 { 15 Time t; // create Time object 16 17 // set time using individual set functions 18 t.setHour( 17 ); // set hour to valid value 19 t.setMinute( 34 ); // set minute to valid value 20 t.setSecond( 25 ); // set second to valid value 21 Gọi các hàm set để gán các giá trị hợp lệ. ©2004 Trần Minh Châu. FOTECH. VNU. 77 fig06_20.cpp (2 of 3) 22 // use get functions to obtain hour, minute and second 23 cout << "Result of setting all valid values:\n" 24 << " Hour: " << t.getHour() 25 << " Minute: " << t.getMinute() 26 << " Second: " << t.getSecond(); 27 28 // set time using individual set functions 29 t.setHour( 234 ); // invalid hour set to 0 30 t.setMinute( 43 ); // set minute to valid value 31 t.setSecond( 6373 ); // invalid second set to 0 32 33 // display hour, minute and second after setting 34 // invalid hour and second values 35 cout << "\n\nResult of attempting to set invalid hour and" 36 << " second:\n Hour: " << t.getHour() 37 << " Minute: " << t.getMinute() 38 << " Second: " << t.getSecond() << "\n\n"; 39 40 t.setTime( 11, 58, 0 ); // set time 41 incrementMinutes( t, 3 ); // increment t's minute by 3 42 43 return 0; 44 45 } // end main 46 Cố dùng các hàm set để gán các giá trị không hợp lệ. các giá trị không hợp lệ làm các data member bị gán về 0. Sửa đổi data member bằng hàm setTime. ©2004 Trần Minh Châu. FOTECH. VNU. 78 fig06_20.cpp (3 of 3) 47 // add specified number of minutes to a Time object 48 void incrementMinutes( Time &tt, const int count ) 49 { 50 cout << "Incrementing minute " << count 51 << " times:\nStart time: "; 52 tt.printStandard(); 53 54 for ( int i = 0; i < count; i++ ) { 55 tt.setMinute( ( tt.getMinute() + 1 ) % 60 ); 56 57 if ( tt.getMinute() == 0 ) 58 tt.setHour( ( tt.getHour() + 1 ) % 24); 59 60 cout << "\nminute + 1: "; 61 tt.printStandard(); 62 63 } // end for 64 65 cout << endl; 66 67 } // end function incrementMinutes Dùng các hàm get để đọc và các hàm set để sửa dữ liệu. Result of setting all valid values: Hour: 17 Minute: 34 Second: 25 Result of attempting to set invalid hour and second: Hour: 0 Minute: 43 Second: 0 Incrementing minute 3 times: Start time: 11:58:00 AM minute + 1: 11:59:00 AM minute + 1: 12:00:00 PM minute + 1: 12:01:00 PM Cố gắng gán các giá trị không hợp lệ cho các thành viên dữ liệu, kết quả là thông báo lỗi và các thành viên bị gán về 0. © 2004 Trần Minh Châu. FOTECH. VNU 79 Chương 6. 6.15 Phép gán mặc định • Gán đối tượng cho đối tượng – Phép gán (=) • có thể gán một đối tượng cho một đối tượng khác thuộc cùng kiểu • Mặc định: gán theo từng thành viên (memberwise assignment) – Mỗi thành viên của đối tượng vế phải được gán cho thành viên tương ứng tại vế trái • được ngầm thực hiện khi – truyền tham số là đối tượng – trả về đối tượng • Đối tượng có thể được truyền làm tham số cho hàm – Đối tượng có thể được hàm trả về – Mặc định: pass-by-value • Bản sao của đối tượng được truyền, trả về – sử dụng 'copy constructor' • sao chép các giá trị gốc vào đối tượng mới ©2004 Trần Minh Châu. FOTECH. VNU. 80 fig06_24.cpp (1 of 3) 1 // Fig. 6.24: fig06_24.cpp 2 // Demonstrating that class objects can be assigned 3 // to each other using default memberwise assignment. 4 #include 5 6 using std::cout; 7 using std::endl; 8 9 // class Date definition 10 class Date { 11 12 public: 13 Date( int = 1, int = 1, int = 1990 ); // default constructor 14 void print(); 15 16 private: 17 int month; 18 int day; 19 int year; 20 21 }; // end class Date 22 ©2004 Trần Minh Châu. FOTECH. VNU. 81 fig06_24.cpp (2 of 3) 23 // Date constructor with no range checking 24 Date::Date( int m, int d, int y ) 25 { 26 month = m; 27 day = d; 28 year = y; 29 30 } // end Date constructor 31 32 // print Date in the format mm-dd-yyyy 33 void Date::print() 34 { 35 cout << month << '-' << day << '-' << year; 36 37 } // end function print 38 39 int main() 40 { 41 Date date1( 7, 4, 2002 ); 42 Date date2; // date2 defaults to 1/1/1990 43 ©2004 Trần Minh Châu. FOTECH. VNU. 82 fig06_24.cpp (3 of 3) fig06_24.cpp output (1 of 1) 44 cout << "date1 = "; 45 date1.print(); 46 cout << "\ndate2 = "; 47 date2.print(); 48 49 date2 = date1; // default memberwise assignment 50 51 cout << "\n\nAfter default memberwise assignment, date2 = "; 52 date2.print(); 53 cout << endl; 54 55 return 0; 56 57 } // end main date1 = 7-4-2002 date2 = 1-1-1990 After default memberwise assignment, date2 = 7-4-2002 phép gán mặc định gán từng thành viên của date1 cho thành viên tương ứng của date2.
File đính kèm:
- Ngôn ngữ lập trình C++ - Chương 6 Cấu trúc dữ liệu trừu tượng.pdf