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

