Tìm kiếm Đề thi, Kiểm tra
tài liệu C++(5)

- 0 / 0
(Tài liệu chưa được thẩm định)
Nguồn:
Người gửi: Lê Văn Thuận (trang riêng)
Ngày gửi: 00h:21' 09-04-2024
Dung lượng: 681.5 KB
Số lượt tải: 42
Nguồn:
Người gửi: Lê Văn Thuận (trang riêng)
Ngày gửi: 00h:21' 09-04-2024
Dung lượng: 681.5 KB
Số lượt tải: 42
Số lượt thích:
0 người
.c
om
ng
co
th
an
Ngôn ngữ lập trình C++
cu
u
du
o
ng
Chương 6 – Cấu trúc dữ liệu trừu tượng
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
Chương 6: Cấu trúc dữ liệu trừu tượng
u
du
o
ng
th
an
co
ng
Giới thiệu
Cấu trúc - struct
Truy nhập các thành viên của struct
Cài đặt kiểu dữ liệu người dùng Time bằng struct
Cài đặt một kiểu dữ liệu trừu tượng Time bằng một lớp - class
Phạm vi lớp và truy nhập các thành viên của lớp
Tách giao diện ra khỏi cài đặt
Quản lý quyền truy nhập thành viên
Các hàm truy nhập và các hàm tiện ích
Khởi tạo các đối tượng: Constructor
Sử dụng các đối số mặc định cho Constructor
Destructor - hàm hủy
Khi nào Constructor và Destructor được gọi
Sử dụng các hàm Set và Get
Phép gán đối tượng mặc định
cu
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
6.9
6.10
6.11
6.12
6.13
6.14
6.15
.c
om
Đề mục
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
Tài liệu đọc thêm
cu
u
du
o
ng
th
an
co
ng
.c
om
• Day 6. TY21 (lập trình cơ bản)
• Chap 4,5. Introduction to OOP Using C++ (IOOP)
(khái niệm hướng đối tượng)
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.1 Giới thiệu
.c
om
• các kiểu dữ liệu phức hợp cấu tạo từ các thành
phần thuộc các kiểu dữ liệu khác
co
ng
– tạo kiểu dữ liệu mới - kiểu dữ liệu người dùng tự định
nghĩa (user-defined data type)
an
• bản ghi
u
• ví dụ
du
o
ng
th
– gồm nhiều trường, mỗi trường lưu trữ một thành viên
dữ liệu thuộc một kiểu dữ liệu cài sẵn hoặc một kiểu dữ
liệu người dùng khác.
cu
– Thời gian(giờ, phút, giây)
– Họ tên (họ, đệm, tên)
CuuDuongThanCong.com
17:10:02, 04:23:12,...
(Nguyễn, Văn, An), (Lê, Thị, Bình),...
https://fb.com/tailieudientucntt
6.1 Giới thiệu
• C++:
cu
u
du
o
ng
th
an
co
ng
.c
om
– struct và class - kiểu bản ghi
– đối tượng (một thể hiện của một kiểu struct hay class
nào đó) - bản ghi
– thành viên dữ liệu - trường
– hàm thành viên/phương thức - thao tác trên các thành
viên dữ liệu
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.2 Cấu trúc - struct
• struct definition
struct Time {
int hour;
int minute;
int second;
};
Structure members
ng
.c
om
Structure tag
ng
th
an
co
• quy tắc đặt tên cho các thành viên của cấu trúc
– trong cùng struct: không thể trùng tên
– trong các struct khác nhau: có thể trùng tên
• định nghĩa struct phải kết thúc bằng dấu chấm phảy.
Time
Time
Time
Time
timeObject;
timeArray[ 10 ];
*timePtr;
&timeRef = timeObject;
cu
•
•
•
•
u
du
o
– Các biến kiểu cấu trúc được khai báo như các biến thuộc các
loại khác
– Ví dụ: khai báo biến đơn, mảng, con trỏ, tham chiếu...
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.2 Cấu trúc - struct
.c
om
• Self-referential structure - cấu trúc đệ quy
– thành viên của một cấu trúc không thể thuộc kiểu cấu trúc đó
th
an
co
ng
– thành viên của một cấu trúc có thể là con trỏ đến kiểu cấu trúc đó
(self-referential structure - cấu trúc đệ quy)
• sử dụng cho danh sách liên kết (linked list), hàng đợi (queue),
ngăn xếp (stack), và cây (tree)
cu
u
du
o
ng
struct Node {
int data;
Node* next;
};
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.3 Truy nhập các thành viên của struct
.c
om
• các toán tử truy nhập thành viên (member access
operator)
ng
th
an
co
ng
– Toán tử dấu chấm (.) truy nhập trực tiếp đến các thành viên
của cấu trúc/lớp
– Toán tử mũi tên (->) truy nhập các thành viên qua con trỏ
đến đối tượng
– Ví dụ: in thành viên hour của đối tượng timeObject:
cout << timeObject.hour;
cu
u
du
o
hoặc
timePtr = &timeObject;
cout << timePtr->hour;
– timePtr->hour tương đương ( *timePtr ).hour
• Cần có cặp ngoặc do * không được ưu tiên bằng .
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// Fig. 6.1: fig06_01.cpp
// Create a structure, set its members, and print it.
#include
fig06_01.cpp
(1 of 3)
.c
om
using std::cout;
using std::endl;
ng
#include
co
using std::setfill;
using std::setw;
an
Định nghĩa kiểu cấu trúc Time
với 3 thành viên là số nguyên.
du
o
ng
th
// structure definition
struct Time {
int hour;
// 0-23 (24-hour clock format)
int minute;
// 0-59
int second;
// 0-59
Truyền tham chiếu tới hằng Time
để tránh sao chép tham số.
u
}; // end struct Time
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void printUniversal( const Time & );
void printStandard( const Time & );
CuuDuongThanCong.com
// prototype
// prototype
https://fb.com/tailieudientucntt
int main()
{
Time dinnerTime;
dụng
ký hiệu
dấu chấm để
// variable ofSử
new
type
Time
khởi tạo các thành viên cấu trúc.fig06_01.cpp
th
an
co
cout << "Dinner will be held at ";
printUniversal( dinnerTime );
cout << " universal time,\nwhich is ";
printStandard( dinnerTime );
cout << " standard time.\n";
(2 of 3)
.c
om
// set hour member of dinnerTime
// set minute member of dinnerTime
// set second member of dinnerTime
ng
dinnerTime.hour = 18;
dinnerTime.minute = 30;
dinnerTime.second = 0;
ng
// set hour to invalid value
// set minute to invalid value
du
o
dinnerTime.hour = 29;
dinnerTime.minute = 73;
Quyền truy nhập trực tiếp tới dữ liệu
cho phép gán các giá trị không hợp lệ.
u
cout << "\nTime with invalid values: ";
printUniversal( dinnerTime );
cout << endl;
cu
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
return 0;
} // end main
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// print time in universal-time format
void printUniversal( const Time &t )
{
cout << setfill( '0' ) << setw( 2 ) << t.hour << ":"
<< setw( 2 ) << t.minute << ":"
<< setw( 2 ) << t.second;
.c
om
fig06_01.cpp
(3 of 3)
fig06_01.cpp
Sử dụng manipulator
setfill.
output (1
of 1)
ng
} // end function printUniversal
du
o
ng
th
an
co
// print time in standard-time format
Dùng dấu chấm để truy nhập
void printStandard( const Time &t )
các thành viên dữ liệu.
{
cout << ( ( t.hour == 0 || t.hour == 12 ) ?
12 : t.hour % 12 ) << ":" << setfill( '0' )
<< setw( 2 ) << t.minute << ":"
<< setw( 2 ) << t.second
<< ( t.hour < 12 ? " AM" : " PM" );
u
} // end function printStandard
cu
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Dinner will be held at 18:30:00 universal time,
which is 6:30:00 PM standard time.
Time with invalid values: 29:73:00
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.4 Cài đặt kiểu dữ liệu người dùng Time
bằng struct
.c
om
• Truyền tham số:
– Mặc định struct được truyền bằng giá trị
cu
u
du
o
ng
th
an
co
ng
– Nên truyền struct bằng tham chiếu để tránh được
việc phải sao chép cấu trúc
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.4 Cài đặt kiểu dữ liệu người dùng Time
bằng struct
.c
om
• struct kiểu C
– không có giao diện giữa bên trong và bên ngoài cấu trúc
ng
• Nếu cài đặt thay đổi, mọi chương trình sử dụng struct đó phải
được sửa đổi theo
co
– không thể in ra như là một biến đơn
an
• Phải in/định dạng cho từng thành viên
th
– không thể so sánh hai struct theo kiểu thông thường
ng
• Phải so sánh từng thành viên
du
o
• struct kiểu C++
cu
u
– C++ mở rộng: struct có chức năng như class
– thông lệ: struct chỉ được dùng cho các cấu trúc chỉ gồm dữ liệu;
class dùng cho các lớp có cả dữ liệu và hàm thành viên.
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
.c
om
• Các lớp - Classes
– mô hình các đối tượng
co
ng
• Thuộc tính - Attributes (data members)
• Hành vi - Behaviors (member functions)
an
– từ khoá class
th
– các hàm thành viên – member functions
cu
u
du
o
ng
• còn được gọi là các phương thức - method
• được gọi để trả lời các thông điệp
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
Class body bắt đầu bằng
ngoặc mở.
Function prototype
cho các public
member function.
ng
class Time {
co
an
th
ng
du
o
Nhãn quyền truy nhập
// 0 - 23 (24-hour clock format)
// 0 - 59
// 0 - 59
u
private:
int hour;
int minute;
int second;
}; // end class Time
Class body kết
thúc bằng ngoặc
đóng.
CuuDuongThanCong.com
Class Time
definition
(1 of 1)
Constructor: thành viên trùng tên
với tên class, Time, và không có
giá trị trả về.
public:
Time();
// constructor
void setTime( int, int, int ); // set hour, minute, second
void printUniversal();
// print universal-time format
void printStandard();
// print standard-time format
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.c
om
Class definition bắt đầu bằng
từ khoá class.
private data member chỉ
có thể được truy nhập từ các
member function.
Definition kết thúc bằng dấu
chấm phảy.
https://fb.com/tailieudientucntt
.c
om
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
• Nhãn quyền truy nhập – Member access specifiers
ng
– quy định quyền truy nhập các thành viên của lớp từ các đoạn
trình bên ngoài định nghĩa lớp
co
– public:
th
an
• thành viên có thể được truy nhập từ trong toàn bộ phạm vi của đối
tượng
ng
– private:
du
o
• thành viên chỉ có thể được truy nhập từ các hàm thành viên của
chính lớp đó
cu
u
– protected:
• dùng cho quan hệ thừa kế
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
.c
om
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
• Constructor – phương thức khởi tạo
co
• khởi tạo các thành viên dữ liệu
• trùng tên với tên lớp
ng
– hàm thành viên đặc biệt
th
an
– được gọi khi đối tượng được tạo, ví dụ khi biến được khai báo
– có thể có vài constructor
ng
• hoạt động theo nguyên tắc hàm gọi chồng
u
cu
class Time {
public:
Time();
du
o
– không có giá trị trả về và không có kiểu giá trị trả về
…
};
CuuDuongThanCong.com
…
Time::Time()
{
hour = minute = second = 0;
} // end Time constructor
https://fb.com/tailieudientucntt
.c
om
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
• Destructor – phương thức hủy
– trùng tên với tên lớp
ng
• bắt đầu bằng dấu (~)
…
};
du
o
u
cu
class Time {
public:
Time();
~Time();
ng
th
an
co
– không có tham số
– tối đa 1 destructor, không thể bị gọi chồng
– dành cho việc dọn dẹp, chẳng hạn bộ nhớ
CuuDuongThanCong.com
…
Time::~Time()
{
//empty
} // end Time destructor
https://fb.com/tailieudientucntt
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
.c
om
• các đối tượng của một lớp
– Kể từ sau class definition
th
an
co
ng
• tên lớp trở thành tên kiểu mới - type specifier
– C++ là ngôn ngữ mở rộng được
• có thể khai báo đối tượng, mảng đối tượng, con trỏ và tham chiếu
tới đối tượng
du
o
u
sunset;
arrayOfTimes[ 5 ];
*pointerToTime;
&dinnerTime = sunset;
cu
Time
Time
Time
Time
ng
– Ví dụ:
CuuDuongThanCong.com
Tên lớp trở thành tên kiểu dữ liệu mới.
//
//
//
//
object of type Time
array of Time objects
pointer to a Time object
reference to a Time object
https://fb.com/tailieudientucntt
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
.c
om
• Các hàm thành viên được định nghĩa bên ngoài
lớp
ng
– toán tử phạm vi (::)
th
an
co
• gắn tên thành viên với tên lớp
• xác định duy nhất các hàm của một lớp nào đó
• các lớp khác nhau có thể có các hàm thành viên trùng tên
du
o
ng
– Công thức định nghĩa hàm thành viên
cu
u
ReturnType ClassName::MemberFunctionName( )
{
…
}
– như nhau đối với hàm public hay private
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
.c
om
• Các hàm thành viên được định nghĩa bên trong lớp
co
ng
– Không cần toán tử phạm vi (::) và tên lớp
– Trình biên dịch sẽ chuyển thành hàm inline nếu
có thể
cu
u
du
o
ng
th
an
• Bên ngoài lớp, các hàm inline cần từ khoá inline
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// Fig. 6.3: fig06_03.cpp
// Time class.
#include
fig06_03.cpp
(1 of 5)
.c
om
using std::cout;
using std::endl;
ng
#include
an
co
using std::setfill;
using std::setw;
Định nghĩa lớp Time.
ng
th
// Time abstract data type (ADT) definition
class Time {
u
du
o
public:
Time();
// constructor
void setTime( int, int, int ); // set hour, minute, second
void printUniversal();
// print universal-time format
void printStandard();
// print standard-time format
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
private:
int hour;
int minute;
int second;
// 0 - 23 (24-hour clock format)
// 0 - 59
// 0 - 59
.c
om
}; // end class Time
fig06_03.cpp
(2 of 5)
th
an
co
ng
// Time constructor initializes each data member to zero and
// ensures all Time objects start in a consistent state
Time::Time()
Constructor khởi tạo các thành
{
viên dữ liệu private về 0.
hour = minute = second = 0;
ng
} // end Time constructor
u
du
o
// set new Time value using universal time, perform validity
// checks on the data values and set invalid values to zero
void Time::setTime( int h, int m, int s )
{
hour = ( h >= 0 && h < 24 ) ? h : 0;
minute = ( m >= 0 && m < 60 ) ? m : 0;
second = ( s >= 0 && s < 60 ) ? s : 0;
cu
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
} // end function setTime
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
Hàm thành viên
public kiểm tra tính
hợp lệ của giá trị các
đối số trước khi gán trị
cho các thành viên dữ
liệu private
// print Time in universal format
void Time::printUniversal()
{
cout << setfill( '0' ) << setw( 2 ) << hour << ":"
<< setw( 2 ) << minute << ":"
<< setw( 2 ) << second;
.c
om
fig06_03.cpp
(3 of 5)
Không có tham số (ngầm hiểu mục
đích là in các thành viên dữ liệu);
lời gọi hàm thành viên ngắn gọn hơn
lời gọi hàm thường.
ng
} // end function printUniversal
du
o
ng
th
an
co
// print Time in standard format
void Time::printStandard()
{
cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )
<< ":" << setfill( '0' ) << setw( 2 ) << minute
<< ":" << setw( 2 ) << second
<< ( hour < 12 ? " AM" : " PM" );
u
} // end function printStandard
int main()
{
Time t;
cu
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Khai báo biến t là đối tượng
thuộc lớp Time.
// instantiate object t of class Time
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// output Time object t's initial values
cout << "The initial universal time is ";
t.printUniversal();
// 00:00:00
// change time
Dùng hàm thành viên public để gán
trị cho các thành viên dữ liệu.
ng
t.setTime( 13, 27, 6 );
.c
om
fig06_03.cpp
(4 of 5) để in
cout << "\nThe initial standard time is "; Gọi các hàm thành viên public
thời gian.
t.printStandard();
// 12:00:00 AM
an
co
// output Time object t's new values
cout << "\n\nUniversal time after setTime is ";
Thử gán các giá trị không hợp lệ cho các thành viên
t.printUniversal();
// 13:27:06
th
dữ liệu bằng cách sử dụng hàm thành viên public
du
o
ng
cout << "\nStandard time after setTime is ";
t.printStandard();
// 1:27:06 PM
t.setTime( 99, 99, 99 );
// attempt invalid settings
u
// output t's values after specifying invalid values
cout << "\n\nAfter attempting invalid settings:"
<< "\nUniversal time: ";
t.printUniversal();
// 00:00:00
cu
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
cout << "\nStandard time: ";
t.printStandard();
// 12:00:00 AM
cout << endl;
fig06_03.cpp
(5 of 5)
.c
om
return 0;
an
The initial universal time is 00:00:00
The initial standard time is 12:00:00 AM
ng
} // end main
co
93
94
95
96
97
98
99
ng
th
Universal time after setTime is 13:27:06
Standard time after setTime is 1:27:06 PM
cu
u
du
o
After attempting invalid settings:
Universal time: 00:00:00
Standard time: 12:00:00 AM
Các thành viên dữ liệu được
gán về 0 sau khi thử các giá
trị không hợp lệ.
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
fig06_03.cpp
output (1 of 1)
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
.c
om
• lợi ích khi dùng lớp
ng
– đơn giản hóa việc lập trình
– các giao diện – Interfaces
co
• che dấu phần cài đặt – Hide implementation
an
– tái sử dụng phần mềm – Software reuse
cu
u
du
o
ng
th
• khả năng tích hợp – Composition (aggregation)
– các thành viên của một lớp có thể là đối tượng thuộc lớp
khác
• thừa kế - Inheritance
– các lớp mới được tạo từ lớp cũ
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.6 Phạm vi lớp và
truy nhập các thành viên của lớp
.c
om
• phạm vi lớp – Class scope
ng
– gồm thành viên dữ liệu và hàm thành viên của lớp
– bên trong phạm vi lớp
th
an
co
• Các thành viên của lớp
– có thể được truy nhập thẳng từ mọi hàm thành viên
– gọi bằng tên
ng
– bên ngoài phạm vi lớp
cu
u
du
o
• được gọi đến bằng tên đối tượng, tham chiếu/con trỏ tới đối
tượng
– objectTime.printStandard()
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.6 Phạm vi lớp và
truy nhập các thành viên của lớp
.c
om
• Phạm vi file - File scope
– áp dụng cho các hàm không phải thành viên
du
o
ng
th
an
co
Gồm các biến được khai báo trong hàm thành viên
chỉ được biết đến trong hàm đó
bị hủy khi hàm kết thúc
các biến trùng tên với biến thuộc phạm vi lớp
u
• biến thuộc phạm vi lớp (class-scope variable) bị che (“hidden”)
– truy nhập bằng toán tử phạm vi (::)
ClassName::classVariableName
cu
–
–
–
–
ng
• Phạm vi hàm – Function scope
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.6 Phạm vi lớp và
truy nhập các thành viên của lớp
.c
om
• Các toán tử để truy nhập các thành viên của đối
tượng
co
ng
– giống các toán tử dành cho struct
– toán tử (.) dùng cho
th
an
• đối tượng
• tham chiếu đến đối tượng
du
o
ng
– toán tử (->) dùng cho
cu
u
• các con trỏ tới đối tượng
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
.c
om
// Fig. 6.4: fig06_04.cpp
// Demonstrating the class member access operators . and ->
//
// CAUTION: IN FUTURE EXAMPLES WE AVOID PUBLIC DATA!
#include
ng
using std::cout;
using std::endl;
// class Count definition
class Count {
an
co
Thành viên dữ liệu public x
minh họa các toán tử truy nhập;
thông thường các thành viên dữ liệu
đều là private.
u
du
o
void print()
{
cout << x << endl;
}
ng
th
public:
int x;
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
}; // end class Count
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
fig06_04.cpp
(1 of 2)
// create counter object
Sử dụng
dấu pointer
chấm cho to
đối counter
tượng
//
create
counter.
//
create reference to counter
fig06_04.cpp
(2 of 2)
.c
om
int main()
{
Count counter;
Count *counterPtr = &counter;
Count &counterRef = counter;
fig06_04.cpp
cout << "Assign 1 to x and print using the object's name: ";
output (1 of 1)
counter.x = 1;
// assign 1 to data member x
Sử dụng dấu chấm cho counterRef là
counter.print();
// call member function print
co
ng
tham chiếu đến đối tượng.
th
an
cout << "Assign 2 to x and print using a reference: ";
counterRef.x = 2;
// assignSử2 dụng
to data
member
x
mũi tên
cho counterPtr
counterRef.print(); // call member
print
là con trỏfunction
tới đối tượng.
return 0;
} // end main
u
du
o
ng
cout << "Assign 3 to x and print using a pointer: ";
counterPtr->x = 3;
// assign 3 to data member x
counterPtr->print(); // call member function print
cu
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Assign 1 to x and print using the object's name: 1
Assign 2 to x and print using a reference: 2
Assign 3 to x and print using a pointer: 3
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
• Tách giao diện khỏi cài đặt
– ích lợi
co
ng
• dễ sửa đổi chương trình
.c
om
6.7 Tách giao diện ra khỏi cài đặt
an
– bất lợi
cu
u
du
o
ng
th
• phải tạo các file header gồm
– một phần của cài đặt
• Inline member functions – các hàm inline
– gợi ý về phần khác của cài đặt
• private members
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.7 Tách giao diện ra khỏi cài đặt
.c
om
• Các file header
ng
– chứa các định nghĩa lớp và các nguyên mẫu hàm
– được include trong mỗi file sử dụng lớp đó
co
• #include
an
– mở rộng của file .h
th
• Các file mã nguồn – Source-code files
u
du
o
ng
– chứa định nghĩa của các hàm thành viên
– trùng tên file với file header tương ứng (không kể phần mở
rộng)
cu
• đây chỉ là thông lệ, không bắt buộc
– được biên dịch và liên kết với file chương trình chính
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
Mã tiền xử lý để tránh việc file bị
// Fig. 6.5: time1.h
// Declaration of class Time. include nhiều lần.
// Member functions are defined in time1.cpp
“If not defined”
.c
om
// prevent multiple inclusions of header file
#ifndef TIME1_H
#define TIME1_H
time1.h (1 of 1)
ng
Mã giữa hai định hướng này không được
// Time abstract data type definition
include nến tên TIME1_H đã được định nghĩa.
class Time {
co
Định hướng tiền xử lý định nghĩa tên
TIME1_H.
// 0 - 23 (24-hour clock format)
// 0 - 59
// 0 - 59
u
private:
int hour;
int minute;
int second;
du
o
ng
th
an
public:
Time();
// constructor
void setTime( int, int, int ); // set hour, minute, second
void printUniversal();
// print universal-time format
void printStandard();
// print standard-time format
cu
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
}; // end class Time
Thông lệ đặt tên: tên header file với dấu gạch
dưới thay cho dấu chấm.
#endif
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// Fig. 6.6: time1.cpp
// Member-function definitions for class Time.
#include
time1.cpp (1 of 3)
.c
om
using std::cout;
#include
ng
using std::setfill;
using std::setw;
co
Include header file
time1.h.
th
an
// include definition of class Time from time1.h
#include "time1.h"
u
du
o
ng
// Time constructor initializes each data member to zero.
// Ensures all Time objects start in a consistent state.
Time::Time()
Tên của header file đặt trong ngoặc kép;
{
cặp ngoặc nhọn làm trình biên dịch cho
hour = minute = second = 0; rằng đó là một phần của thư viện chuẩn
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
C++ (C++ Standard Library).
} // end Time constructor
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
.c
om
// Set new Time value using universal time. Perform validity
// checks on the data values. Set invalid values to zero.
void Time::setTime( int h, int m, int s )
{
hour = ( h >= 0 && h < 24 ) ? h : 0;
minute = ( m >= 0 && m < 60 ) ? m : 0;
second = ( s >= 0 && s < 60 ) ? s : 0;
co
ng
} // end function setTime
du
o
ng
th
an
// print Time in universal format
void Time::printUniversal()
{
cout << setfill( '0' ) << setw( 2 ) << hour << ":"
<< setw( 2 ) << minute << ":"
<< setw( 2 ) << second;
u
} // end function printUniversal
cu
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
time1.cpp (2 of 3)
.c
om
// print Time in standard format
void Time::printStandard()
{
cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )
<< ":" << setfill( '0' ) << setw( 2 ) << minute
<< ":" << setw( 2 ) << second
<< ( hour < 12 ? " AM" : " PM" );
u
du
o
ng
th
an
co
ng
} // end function printStandard
cu
42
43
44
45
46
47
48
49
50
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
time1.cpp (3 of 3)
// Fig. 6.7: fig06_07.cpp
// Program to test class Time.
// NOTE: This file must be compiled with time1.cpp.
#include
.c
om
using std::cout;
using std::endl;
fig06_07.cpp
(1 of 2)
Include time1.h để đảm bảo tạo đúng và để
tính kích thước đối tượng thuộc lớp Time.
an
th
// instantiate object t of class Time
ng
int main()
{
Time t;
co
ng
// include definition of class Time from time1.h
#include "time1.h"
u
du
o
// output Time object t's initial values
cout << "The initial universal time is ";
t.printUniversal();
// 00:00:00
cout << "\nThe initial standard time is ";
t.printStandard();
// 12:00:00 AM
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
t.setTime( 13, 27, 6 );
CuuDuongThanCong.com
// change time
https://fb.com/tailieudientucntt
// output Time object t's new values
cout << "\n\nUniversal time after setTime is ";
t.printUniversal();
// 13:27:06
cout << "\nStandard time after setTime is ";
t.printStandard();
// 1:27:06 PM
fig06_07.cpp
(2 of 2)
.c
om
t.setTime( 99, 99, 99 );
// attempt invalid settings
fig06_07.cpp
output (1 of 1)
} // end main
u
return 0;
du
o
ng
th
an
co
ng
// output t's values after specifying invalid values
cout << "\n\nAfter attempting invalid settings:"
<< "\nUniversal time: ";
t.printUniversal();
// 00:00:00
cout << "\nStandard time: ";
t.printStandard();
// 12:00:00 AM
cout << endl;
cu
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
The initial universal time is 00:00:00
The initial standard time is 12:00:00 AM
Universal time after setTime is 13:27:06
Standard time after setTime is 1:27:06 PM
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
• các kiểu truy nhập – Access
– private
.c
om
6.8 Quản lý quyền truy nhập thành viên
an
co
ng
• kiểu mặc định - Default access mode
• chỉ có các hàm thành viên và các hàm friend là có thể truy
nhập các thành viên private
th
– public
du
o
– protected
ng
• truy nhập được từ mọi hàm trong chương trình.
cu
u
• dành cho quan hệ thừa kế, hiện tại chưa nói đến
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// Fig. 6.8: fig06_08.cpp
// Demonstrate errors resulting from attempts
// to access private class members.
#include
.c
om
using std::cout;
fig06_08.cpp
(1 of 1)
an
// create Time object
hour là thành viên private;
truy nhập các thành viên private sẽ gây lỗi.
// error: 'Time::hour' is not accessible
du
o
t.hour = 7;
ng
th
int main()
{
Time t;
co
ng
// include definition of class Time from time1.h
#include "time1.h"
minute cũng là private;
u
// error: 'Time::minute' is not accessible
cout << "minute = " << t.minute;
return 0;
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
} // end main
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.8 Quản lý quyền truy nhập thành viên
.c
om
• quyền truy nhập các thành viên của class
ng
– mặc định private
– phải đặt tường minh public, protected
co
• quyền truy nhập các thành viên của struct
ng
th
an
– mặc định public
– phải đặt tường minh private, protected
du
o
• truy nhập dữ liệu private của lớp
– các hàm truy nhập (accessor method)
cu
u
• Get function – hàm đọc dữ liệu
– đọc dữ liệu private
• Set function – hàm ghi dữ liệu
– ghi dữ liệu private
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.9 Các hàm truy nhập và các hàm tiện ích
.c
om
• Các hàm truy nhập – Access functions
– public
an
co
ng
– các hàm đọc và hiển thị dữ liệu
– các hàm ghi dữ liệu (kèm kiểm tra tính hợp lệ)
– các hàm mệnh đề – Predicate functions
th
• kiểm tra các điều kiện
du
o
ng
• Các hàm tiện ích – Utility functions
cu
u
– private
– chỉ hỗ trợ hoạt động của các hàm thành viên kiểu public
– không nhằm mục đích để cho client trực tiếp sử dụng
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// Fig. 6.9: salesp.h
// SalesPerson class definition.
// Member functions defined in salesp.cpp.
#ifndef SALESP_H
#define SALESP_H
.c
om
hàm ghi dữ liệu thực hiện việc
kiểm tra tính hợp lệ của dữ liệu
(validity checks).
ng
class SalesPerson {
co
constructor
input sales from keyboard
set sales for a month
summarize and print sales
th
an
public:
SalesPerson();
//
void getSalesFromUser();
//
void setSales( int, double ); //
void printAnnualSales();
//
salesp.h (1 of 1)
hàm tiện ích private
du
o
ng
private:
double totalAnnualSales();
double sales[ 12 ];
// utility function
// 12 monthly sales figures
u
}; // end class SalesPerson
#endif
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// Fig. 6.10: salesp.cpp
// Member functions for class SalesPerson.
#include
salesp.cpp (1 of 3)
.c
om
std::cout;
std::cin;
std::endl;
std::fixed;
ng
using
using
using
using
co
#include
th
an
using std::setprecision;
du
o
ng
// include SalesPerson class definition from salesp.h
#include "salesp.h"
u
// initialize elements of array sales to 0.0
SalesPerson::SalesPerson()
{
for ( int i = 0; i < 12; i++ )
sales[ i ] = 0.0;
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
} // end SalesPerson constructor
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// get 12 sales figures from the user at the keyboard
void SalesPerson::getSalesFromUser()
{
double salesFigure;
salesp.cpp (2 of 3)
co
ng
.c
om
for ( int i = 1; i <= 12; i++ ) {
cout << "Enter sales amount for month " << i << ": ";
cin >> salesFigure;
setSales( i, salesFigure );
th
} // end function getSalesFromUser
an
} // end for
hàm ghi dữ liệu thực hiện việc
kiểm tra tính hợp lệ của dữ
liệu (validity checks).
u
du
o
ng
// set one of the 12 monthly sales figures; function subtracts
// one from month value for proper subscript in sales array
void SalesPerson::setSales( int month, double amount )
{
// test for valid month and amount values
if ( month >= 1 && month <= 12 && amount > 0 )
sales[ month - 1 ] = amount; // adjust for subscripts 0-11
cu
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
else // invalid month or amount value
cout << "Invalid month or sales figure" << endl;
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
} // end function setSales
salesp.cpp (3 of 3)
ng
.c
om
// print total annual sales (with help of utility function)
void SalesPerson::printAnnualSales()
{
cout << setprecision( 2 ) << fixed
<< "\nThe total annual sales are: $"
<< totalAnnualSales() << endl; // call utility function
co
Hàm tiện ích private
phục vụ hàm printAnnualSales;
// private utility function to total annual sales đóng gói thao tác trên mảng sales.
th
an
} // end function printAnnualSales
du
o
ng
double SalesPerson::totalAnnualSales()
{
double total = 0.0;
// initialize total
// summarize s...
om
ng
co
th
an
Ngôn ngữ lập trình C++
cu
u
du
o
ng
Chương 6 – Cấu trúc dữ liệu trừu tượng
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
Chương 6: Cấu trúc dữ liệu trừu tượng
u
du
o
ng
th
an
co
ng
Giới thiệu
Cấu trúc - struct
Truy nhập các thành viên của struct
Cài đặt kiểu dữ liệu người dùng Time bằng struct
Cài đặt một kiểu dữ liệu trừu tượng Time bằng một lớp - class
Phạm vi lớp và truy nhập các thành viên của lớp
Tách giao diện ra khỏi cài đặt
Quản lý quyền truy nhập thành viên
Các hàm truy nhập và các hàm tiện ích
Khởi tạo các đối tượng: Constructor
Sử dụng các đối số mặc định cho Constructor
Destructor - hàm hủy
Khi nào Constructor và Destructor được gọi
Sử dụng các hàm Set và Get
Phép gán đối tượng mặc định
cu
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
6.9
6.10
6.11
6.12
6.13
6.14
6.15
.c
om
Đề mục
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
Tài liệu đọc thêm
cu
u
du
o
ng
th
an
co
ng
.c
om
• Day 6. TY21 (lập trình cơ bản)
• Chap 4,5. Introduction to OOP Using C++ (IOOP)
(khái niệm hướng đối tượng)
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.1 Giới thiệu
.c
om
• các kiểu dữ liệu phức hợp cấu tạo từ các thành
phần thuộc các kiểu dữ liệu khác
co
ng
– tạo kiểu dữ liệu mới - kiểu dữ liệu người dùng tự định
nghĩa (user-defined data type)
an
• bản ghi
u
• ví dụ
du
o
ng
th
– gồm nhiều trường, mỗi trường lưu trữ một thành viên
dữ liệu thuộc một kiểu dữ liệu cài sẵn hoặc một kiểu dữ
liệu người dùng khác.
cu
– Thời gian(giờ, phút, giây)
– Họ tên (họ, đệm, tên)
CuuDuongThanCong.com
17:10:02, 04:23:12,...
(Nguyễn, Văn, An), (Lê, Thị, Bình),...
https://fb.com/tailieudientucntt
6.1 Giới thiệu
• C++:
cu
u
du
o
ng
th
an
co
ng
.c
om
– struct và class - kiểu bản ghi
– đối tượng (một thể hiện của một kiểu struct hay class
nào đó) - bản ghi
– thành viên dữ liệu - trường
– hàm thành viên/phương thức - thao tác trên các thành
viên dữ liệu
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.2 Cấu trúc - struct
• struct definition
struct Time {
int hour;
int minute;
int second;
};
Structure members
ng
.c
om
Structure tag
ng
th
an
co
• quy tắc đặt tên cho các thành viên của cấu trúc
– trong cùng struct: không thể trùng tên
– trong các struct khác nhau: có thể trùng tên
• định nghĩa struct phải kết thúc bằng dấu chấm phảy.
Time
Time
Time
Time
timeObject;
timeArray[ 10 ];
*timePtr;
&timeRef = timeObject;
cu
•
•
•
•
u
du
o
– Các biến kiểu cấu trúc được khai báo như các biến thuộc các
loại khác
– Ví dụ: khai báo biến đơn, mảng, con trỏ, tham chiếu...
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.2 Cấu trúc - struct
.c
om
• Self-referential structure - cấu trúc đệ quy
– thành viên của một cấu trúc không thể thuộc kiểu cấu trúc đó
th
an
co
ng
– thành viên của một cấu trúc có thể là con trỏ đến kiểu cấu trúc đó
(self-referential structure - cấu trúc đệ quy)
• sử dụng cho danh sách liên kết (linked list), hàng đợi (queue),
ngăn xếp (stack), và cây (tree)
cu
u
du
o
ng
struct Node {
int data;
Node* next;
};
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.3 Truy nhập các thành viên của struct
.c
om
• các toán tử truy nhập thành viên (member access
operator)
ng
th
an
co
ng
– Toán tử dấu chấm (.) truy nhập trực tiếp đến các thành viên
của cấu trúc/lớp
– Toán tử mũi tên (->) truy nhập các thành viên qua con trỏ
đến đối tượng
– Ví dụ: in thành viên hour của đối tượng timeObject:
cout << timeObject.hour;
cu
u
du
o
hoặc
timePtr = &timeObject;
cout << timePtr->hour;
– timePtr->hour tương đương ( *timePtr ).hour
• Cần có cặp ngoặc do * không được ưu tiên bằng .
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// Fig. 6.1: fig06_01.cpp
// Create a structure, set its members, and print it.
#include
fig06_01.cpp
(1 of 3)
.c
om
using std::cout;
using std::endl;
ng
#include
co
using std::setfill;
using std::setw;
an
Định nghĩa kiểu cấu trúc Time
với 3 thành viên là số nguyên.
du
o
ng
th
// structure definition
struct Time {
int hour;
// 0-23 (24-hour clock format)
int minute;
// 0-59
int second;
// 0-59
Truyền tham chiếu tới hằng Time
để tránh sao chép tham số.
u
}; // end struct Time
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void printUniversal( const Time & );
void printStandard( const Time & );
CuuDuongThanCong.com
// prototype
// prototype
https://fb.com/tailieudientucntt
int main()
{
Time dinnerTime;
dụng
ký hiệu
dấu chấm để
// variable ofSử
new
type
Time
khởi tạo các thành viên cấu trúc.fig06_01.cpp
th
an
co
cout << "Dinner will be held at ";
printUniversal( dinnerTime );
cout << " universal time,\nwhich is ";
printStandard( dinnerTime );
cout << " standard time.\n";
(2 of 3)
.c
om
// set hour member of dinnerTime
// set minute member of dinnerTime
// set second member of dinnerTime
ng
dinnerTime.hour = 18;
dinnerTime.minute = 30;
dinnerTime.second = 0;
ng
// set hour to invalid value
// set minute to invalid value
du
o
dinnerTime.hour = 29;
dinnerTime.minute = 73;
Quyền truy nhập trực tiếp tới dữ liệu
cho phép gán các giá trị không hợp lệ.
u
cout << "\nTime with invalid values: ";
printUniversal( dinnerTime );
cout << endl;
cu
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
return 0;
} // end main
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// print time in universal-time format
void printUniversal( const Time &t )
{
cout << setfill( '0' ) << setw( 2 ) << t.hour << ":"
<< setw( 2 ) << t.minute << ":"
<< setw( 2 ) << t.second;
.c
om
fig06_01.cpp
(3 of 3)
fig06_01.cpp
Sử dụng manipulator
setfill.
output (1
of 1)
ng
} // end function printUniversal
du
o
ng
th
an
co
// print time in standard-time format
Dùng dấu chấm để truy nhập
void printStandard( const Time &t )
các thành viên dữ liệu.
{
cout << ( ( t.hour == 0 || t.hour == 12 ) ?
12 : t.hour % 12 ) << ":" << setfill( '0' )
<< setw( 2 ) << t.minute << ":"
<< setw( 2 ) << t.second
<< ( t.hour < 12 ? " AM" : " PM" );
u
} // end function printStandard
cu
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Dinner will be held at 18:30:00 universal time,
which is 6:30:00 PM standard time.
Time with invalid values: 29:73:00
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.4 Cài đặt kiểu dữ liệu người dùng Time
bằng struct
.c
om
• Truyền tham số:
– Mặc định struct được truyền bằng giá trị
cu
u
du
o
ng
th
an
co
ng
– Nên truyền struct bằng tham chiếu để tránh được
việc phải sao chép cấu trúc
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.4 Cài đặt kiểu dữ liệu người dùng Time
bằng struct
.c
om
• struct kiểu C
– không có giao diện giữa bên trong và bên ngoài cấu trúc
ng
• Nếu cài đặt thay đổi, mọi chương trình sử dụng struct đó phải
được sửa đổi theo
co
– không thể in ra như là một biến đơn
an
• Phải in/định dạng cho từng thành viên
th
– không thể so sánh hai struct theo kiểu thông thường
ng
• Phải so sánh từng thành viên
du
o
• struct kiểu C++
cu
u
– C++ mở rộng: struct có chức năng như class
– thông lệ: struct chỉ được dùng cho các cấu trúc chỉ gồm dữ liệu;
class dùng cho các lớp có cả dữ liệu và hàm thành viên.
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
.c
om
• Các lớp - Classes
– mô hình các đối tượng
co
ng
• Thuộc tính - Attributes (data members)
• Hành vi - Behaviors (member functions)
an
– từ khoá class
th
– các hàm thành viên – member functions
cu
u
du
o
ng
• còn được gọi là các phương thức - method
• được gọi để trả lời các thông điệp
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
Class body bắt đầu bằng
ngoặc mở.
Function prototype
cho các public
member function.
ng
class Time {
co
an
th
ng
du
o
Nhãn quyền truy nhập
// 0 - 23 (24-hour clock format)
// 0 - 59
// 0 - 59
u
private:
int hour;
int minute;
int second;
}; // end class Time
Class body kết
thúc bằng ngoặc
đóng.
CuuDuongThanCong.com
Class Time
definition
(1 of 1)
Constructor: thành viên trùng tên
với tên class, Time, và không có
giá trị trả về.
public:
Time();
// constructor
void setTime( int, int, int ); // set hour, minute, second
void printUniversal();
// print universal-time format
void printStandard();
// print standard-time format
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.c
om
Class definition bắt đầu bằng
từ khoá class.
private data member chỉ
có thể được truy nhập từ các
member function.
Definition kết thúc bằng dấu
chấm phảy.
https://fb.com/tailieudientucntt
.c
om
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
• Nhãn quyền truy nhập – Member access specifiers
ng
– quy định quyền truy nhập các thành viên của lớp từ các đoạn
trình bên ngoài định nghĩa lớp
co
– public:
th
an
• thành viên có thể được truy nhập từ trong toàn bộ phạm vi của đối
tượng
ng
– private:
du
o
• thành viên chỉ có thể được truy nhập từ các hàm thành viên của
chính lớp đó
cu
u
– protected:
• dùng cho quan hệ thừa kế
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
.c
om
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
• Constructor – phương thức khởi tạo
co
• khởi tạo các thành viên dữ liệu
• trùng tên với tên lớp
ng
– hàm thành viên đặc biệt
th
an
– được gọi khi đối tượng được tạo, ví dụ khi biến được khai báo
– có thể có vài constructor
ng
• hoạt động theo nguyên tắc hàm gọi chồng
u
cu
class Time {
public:
Time();
du
o
– không có giá trị trả về và không có kiểu giá trị trả về
…
};
CuuDuongThanCong.com
…
Time::Time()
{
hour = minute = second = 0;
} // end Time constructor
https://fb.com/tailieudientucntt
.c
om
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
• Destructor – phương thức hủy
– trùng tên với tên lớp
ng
• bắt đầu bằng dấu (~)
…
};
du
o
u
cu
class Time {
public:
Time();
~Time();
ng
th
an
co
– không có tham số
– tối đa 1 destructor, không thể bị gọi chồng
– dành cho việc dọn dẹp, chẳng hạn bộ nhớ
CuuDuongThanCong.com
…
Time::~Time()
{
//empty
} // end Time destructor
https://fb.com/tailieudientucntt
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
.c
om
• các đối tượng của một lớp
– Kể từ sau class definition
th
an
co
ng
• tên lớp trở thành tên kiểu mới - type specifier
– C++ là ngôn ngữ mở rộng được
• có thể khai báo đối tượng, mảng đối tượng, con trỏ và tham chiếu
tới đối tượng
du
o
u
sunset;
arrayOfTimes[ 5 ];
*pointerToTime;
&dinnerTime = sunset;
cu
Time
Time
Time
Time
ng
– Ví dụ:
CuuDuongThanCong.com
Tên lớp trở thành tên kiểu dữ liệu mới.
//
//
//
//
object of type Time
array of Time objects
pointer to a Time object
reference to a Time object
https://fb.com/tailieudientucntt
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
.c
om
• Các hàm thành viên được định nghĩa bên ngoài
lớp
ng
– toán tử phạm vi (::)
th
an
co
• gắn tên thành viên với tên lớp
• xác định duy nhất các hàm của một lớp nào đó
• các lớp khác nhau có thể có các hàm thành viên trùng tên
du
o
ng
– Công thức định nghĩa hàm thành viên
cu
u
ReturnType ClassName::MemberFunctionName( )
{
…
}
– như nhau đối với hàm public hay private
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
.c
om
• Các hàm thành viên được định nghĩa bên trong lớp
co
ng
– Không cần toán tử phạm vi (::) và tên lớp
– Trình biên dịch sẽ chuyển thành hàm inline nếu
có thể
cu
u
du
o
ng
th
an
• Bên ngoài lớp, các hàm inline cần từ khoá inline
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// Fig. 6.3: fig06_03.cpp
// Time class.
#include
fig06_03.cpp
(1 of 5)
.c
om
using std::cout;
using std::endl;
ng
#include
an
co
using std::setfill;
using std::setw;
Định nghĩa lớp Time.
ng
th
// Time abstract data type (ADT) definition
class Time {
u
du
o
public:
Time();
// constructor
void setTime( int, int, int ); // set hour, minute, second
void printUniversal();
// print universal-time format
void printStandard();
// print standard-time format
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
private:
int hour;
int minute;
int second;
// 0 - 23 (24-hour clock format)
// 0 - 59
// 0 - 59
.c
om
}; // end class Time
fig06_03.cpp
(2 of 5)
th
an
co
ng
// Time constructor initializes each data member to zero and
// ensures all Time objects start in a consistent state
Time::Time()
Constructor khởi tạo các thành
{
viên dữ liệu private về 0.
hour = minute = second = 0;
ng
} // end Time constructor
u
du
o
// set new Time value using universal time, perform validity
// checks on the data values and set invalid values to zero
void Time::setTime( int h, int m, int s )
{
hour = ( h >= 0 && h < 24 ) ? h : 0;
minute = ( m >= 0 && m < 60 ) ? m : 0;
second = ( s >= 0 && s < 60 ) ? s : 0;
cu
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
} // end function setTime
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
Hàm thành viên
public kiểm tra tính
hợp lệ của giá trị các
đối số trước khi gán trị
cho các thành viên dữ
liệu private
// print Time in universal format
void Time::printUniversal()
{
cout << setfill( '0' ) << setw( 2 ) << hour << ":"
<< setw( 2 ) << minute << ":"
<< setw( 2 ) << second;
.c
om
fig06_03.cpp
(3 of 5)
Không có tham số (ngầm hiểu mục
đích là in các thành viên dữ liệu);
lời gọi hàm thành viên ngắn gọn hơn
lời gọi hàm thường.
ng
} // end function printUniversal
du
o
ng
th
an
co
// print Time in standard format
void Time::printStandard()
{
cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )
<< ":" << setfill( '0' ) << setw( 2 ) << minute
<< ":" << setw( 2 ) << second
<< ( hour < 12 ? " AM" : " PM" );
u
} // end function printStandard
int main()
{
Time t;
cu
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Khai báo biến t là đối tượng
thuộc lớp Time.
// instantiate object t of class Time
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// output Time object t's initial values
cout << "The initial universal time is ";
t.printUniversal();
// 00:00:00
// change time
Dùng hàm thành viên public để gán
trị cho các thành viên dữ liệu.
ng
t.setTime( 13, 27, 6 );
.c
om
fig06_03.cpp
(4 of 5) để in
cout << "\nThe initial standard time is "; Gọi các hàm thành viên public
thời gian.
t.printStandard();
// 12:00:00 AM
an
co
// output Time object t's new values
cout << "\n\nUniversal time after setTime is ";
Thử gán các giá trị không hợp lệ cho các thành viên
t.printUniversal();
// 13:27:06
th
dữ liệu bằng cách sử dụng hàm thành viên public
du
o
ng
cout << "\nStandard time after setTime is ";
t.printStandard();
// 1:27:06 PM
t.setTime( 99, 99, 99 );
// attempt invalid settings
u
// output t's values after specifying invalid values
cout << "\n\nAfter attempting invalid settings:"
<< "\nUniversal time: ";
t.printUniversal();
// 00:00:00
cu
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
cout << "\nStandard time: ";
t.printStandard();
// 12:00:00 AM
cout << endl;
fig06_03.cpp
(5 of 5)
.c
om
return 0;
an
The initial universal time is 00:00:00
The initial standard time is 12:00:00 AM
ng
} // end main
co
93
94
95
96
97
98
99
ng
th
Universal time after setTime is 13:27:06
Standard time after setTime is 1:27:06 PM
cu
u
du
o
After attempting invalid settings:
Universal time: 00:00:00
Standard time: 12:00:00 AM
Các thành viên dữ liệu được
gán về 0 sau khi thử các giá
trị không hợp lệ.
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
fig06_03.cpp
output (1 of 1)
6.5 Cài đặt một kiểu dữ liệu trừu tượng Time
bằng một lớp - class
.c
om
• lợi ích khi dùng lớp
ng
– đơn giản hóa việc lập trình
– các giao diện – Interfaces
co
• che dấu phần cài đặt – Hide implementation
an
– tái sử dụng phần mềm – Software reuse
cu
u
du
o
ng
th
• khả năng tích hợp – Composition (aggregation)
– các thành viên của một lớp có thể là đối tượng thuộc lớp
khác
• thừa kế - Inheritance
– các lớp mới được tạo từ lớp cũ
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.6 Phạm vi lớp và
truy nhập các thành viên của lớp
.c
om
• phạm vi lớp – Class scope
ng
– gồm thành viên dữ liệu và hàm thành viên của lớp
– bên trong phạm vi lớp
th
an
co
• Các thành viên của lớp
– có thể được truy nhập thẳng từ mọi hàm thành viên
– gọi bằng tên
ng
– bên ngoài phạm vi lớp
cu
u
du
o
• được gọi đến bằng tên đối tượng, tham chiếu/con trỏ tới đối
tượng
– objectTime.printStandard()
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.6 Phạm vi lớp và
truy nhập các thành viên của lớp
.c
om
• Phạm vi file - File scope
– áp dụng cho các hàm không phải thành viên
du
o
ng
th
an
co
Gồm các biến được khai báo trong hàm thành viên
chỉ được biết đến trong hàm đó
bị hủy khi hàm kết thúc
các biến trùng tên với biến thuộc phạm vi lớp
u
• biến thuộc phạm vi lớp (class-scope variable) bị che (“hidden”)
– truy nhập bằng toán tử phạm vi (::)
ClassName::classVariableName
cu
–
–
–
–
ng
• Phạm vi hàm – Function scope
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.6 Phạm vi lớp và
truy nhập các thành viên của lớp
.c
om
• Các toán tử để truy nhập các thành viên của đối
tượng
co
ng
– giống các toán tử dành cho struct
– toán tử (.) dùng cho
th
an
• đối tượng
• tham chiếu đến đối tượng
du
o
ng
– toán tử (->) dùng cho
cu
u
• các con trỏ tới đối tượng
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
.c
om
// Fig. 6.4: fig06_04.cpp
// Demonstrating the class member access operators . and ->
//
// CAUTION: IN FUTURE EXAMPLES WE AVOID PUBLIC DATA!
#include
ng
using std::cout;
using std::endl;
// class Count definition
class Count {
an
co
Thành viên dữ liệu public x
minh họa các toán tử truy nhập;
thông thường các thành viên dữ liệu
đều là private.
u
du
o
void print()
{
cout << x << endl;
}
ng
th
public:
int x;
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
}; // end class Count
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
fig06_04.cpp
(1 of 2)
// create counter object
Sử dụng
dấu pointer
chấm cho to
đối counter
tượng
//
create
counter.
//
create reference to counter
fig06_04.cpp
(2 of 2)
.c
om
int main()
{
Count counter;
Count *counterPtr = &counter;
Count &counterRef = counter;
fig06_04.cpp
cout << "Assign 1 to x and print using the object's name: ";
output (1 of 1)
counter.x = 1;
// assign 1 to data member x
Sử dụng dấu chấm cho counterRef là
counter.print();
// call member function print
co
ng
tham chiếu đến đối tượng.
th
an
cout << "Assign 2 to x and print using a reference: ";
counterRef.x = 2;
// assignSử2 dụng
to data
member
x
mũi tên
cho counterPtr
counterRef.print(); // call member
là con trỏfunction
tới đối tượng.
return 0;
} // end main
u
du
o
ng
cout << "Assign 3 to x and print using a pointer: ";
counterPtr->x = 3;
// assign 3 to data member x
counterPtr->print(); // call member function print
cu
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Assign 1 to x and print using the object's name: 1
Assign 2 to x and print using a reference: 2
Assign 3 to x and print using a pointer: 3
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
• Tách giao diện khỏi cài đặt
– ích lợi
co
ng
• dễ sửa đổi chương trình
.c
om
6.7 Tách giao diện ra khỏi cài đặt
an
– bất lợi
cu
u
du
o
ng
th
• phải tạo các file header gồm
– một phần của cài đặt
• Inline member functions – các hàm inline
– gợi ý về phần khác của cài đặt
• private members
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.7 Tách giao diện ra khỏi cài đặt
.c
om
• Các file header
ng
– chứa các định nghĩa lớp và các nguyên mẫu hàm
– được include trong mỗi file sử dụng lớp đó
co
• #include
an
– mở rộng của file .h
th
• Các file mã nguồn – Source-code files
u
du
o
ng
– chứa định nghĩa của các hàm thành viên
– trùng tên file với file header tương ứng (không kể phần mở
rộng)
cu
• đây chỉ là thông lệ, không bắt buộc
– được biên dịch và liên kết với file chương trình chính
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
Mã tiền xử lý để tránh việc file bị
// Fig. 6.5: time1.h
// Declaration of class Time. include nhiều lần.
// Member functions are defined in time1.cpp
“If not defined”
.c
om
// prevent multiple inclusions of header file
#ifndef TIME1_H
#define TIME1_H
time1.h (1 of 1)
ng
Mã giữa hai định hướng này không được
// Time abstract data type definition
include nến tên TIME1_H đã được định nghĩa.
class Time {
co
Định hướng tiền xử lý định nghĩa tên
TIME1_H.
// 0 - 23 (24-hour clock format)
// 0 - 59
// 0 - 59
u
private:
int hour;
int minute;
int second;
du
o
ng
th
an
public:
Time();
// constructor
void setTime( int, int, int ); // set hour, minute, second
void printUniversal();
// print universal-time format
void printStandard();
// print standard-time format
cu
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
}; // end class Time
Thông lệ đặt tên: tên header file với dấu gạch
dưới thay cho dấu chấm.
#endif
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// Fig. 6.6: time1.cpp
// Member-function definitions for class Time.
#include
time1.cpp (1 of 3)
.c
om
using std::cout;
#include
ng
using std::setfill;
using std::setw;
co
Include header file
time1.h.
th
an
// include definition of class Time from time1.h
#include "time1.h"
u
du
o
ng
// Time constructor initializes each data member to zero.
// Ensures all Time objects start in a consistent state.
Time::Time()
Tên của header file đặt trong ngoặc kép;
{
cặp ngoặc nhọn làm trình biên dịch cho
hour = minute = second = 0; rằng đó là một phần của thư viện chuẩn
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
C++ (C++ Standard Library).
} // end Time constructor
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
.c
om
// Set new Time value using universal time. Perform validity
// checks on the data values. Set invalid values to zero.
void Time::setTime( int h, int m, int s )
{
hour = ( h >= 0 && h < 24 ) ? h : 0;
minute = ( m >= 0 && m < 60 ) ? m : 0;
second = ( s >= 0 && s < 60 ) ? s : 0;
co
ng
} // end function setTime
du
o
ng
th
an
// print Time in universal format
void Time::printUniversal()
{
cout << setfill( '0' ) << setw( 2 ) << hour << ":"
<< setw( 2 ) << minute << ":"
<< setw( 2 ) << second;
u
} // end function printUniversal
cu
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
time1.cpp (2 of 3)
.c
om
// print Time in standard format
void Time::printStandard()
{
cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )
<< ":" << setfill( '0' ) << setw( 2 ) << minute
<< ":" << setw( 2 ) << second
<< ( hour < 12 ? " AM" : " PM" );
u
du
o
ng
th
an
co
ng
} // end function printStandard
cu
42
43
44
45
46
47
48
49
50
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
time1.cpp (3 of 3)
// Fig. 6.7: fig06_07.cpp
// Program to test class Time.
// NOTE: This file must be compiled with time1.cpp.
#include
.c
om
using std::cout;
using std::endl;
fig06_07.cpp
(1 of 2)
Include time1.h để đảm bảo tạo đúng và để
tính kích thước đối tượng thuộc lớp Time.
an
th
// instantiate object t of class Time
ng
int main()
{
Time t;
co
ng
// include definition of class Time from time1.h
#include "time1.h"
u
du
o
// output Time object t's initial values
cout << "The initial universal time is ";
t.printUniversal();
// 00:00:00
cout << "\nThe initial standard time is ";
t.printStandard();
// 12:00:00 AM
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
t.setTime( 13, 27, 6 );
CuuDuongThanCong.com
// change time
https://fb.com/tailieudientucntt
// output Time object t's new values
cout << "\n\nUniversal time after setTime is ";
t.printUniversal();
// 13:27:06
cout << "\nStandard time after setTime is ";
t.printStandard();
// 1:27:06 PM
fig06_07.cpp
(2 of 2)
.c
om
t.setTime( 99, 99, 99 );
// attempt invalid settings
fig06_07.cpp
output (1 of 1)
} // end main
u
return 0;
du
o
ng
th
an
co
ng
// output t's values after specifying invalid values
cout << "\n\nAfter attempting invalid settings:"
<< "\nUniversal time: ";
t.printUniversal();
// 00:00:00
cout << "\nStandard time: ";
t.printStandard();
// 12:00:00 AM
cout << endl;
cu
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
The initial universal time is 00:00:00
The initial standard time is 12:00:00 AM
Universal time after setTime is 13:27:06
Standard time after setTime is 1:27:06 PM
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
• các kiểu truy nhập – Access
– private
.c
om
6.8 Quản lý quyền truy nhập thành viên
an
co
ng
• kiểu mặc định - Default access mode
• chỉ có các hàm thành viên và các hàm friend là có thể truy
nhập các thành viên private
th
– public
du
o
– protected
ng
• truy nhập được từ mọi hàm trong chương trình.
cu
u
• dành cho quan hệ thừa kế, hiện tại chưa nói đến
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// Fig. 6.8: fig06_08.cpp
// Demonstrate errors resulting from attempts
// to access private class members.
#include
.c
om
using std::cout;
fig06_08.cpp
(1 of 1)
an
// create Time object
hour là thành viên private;
truy nhập các thành viên private sẽ gây lỗi.
// error: 'Time::hour' is not accessible
du
o
t.hour = 7;
ng
th
int main()
{
Time t;
co
ng
// include definition of class Time from time1.h
#include "time1.h"
minute cũng là private;
u
// error: 'Time::minute' is not accessible
cout << "minute = " << t.minute;
return 0;
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
} // end main
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.8 Quản lý quyền truy nhập thành viên
.c
om
• quyền truy nhập các thành viên của class
ng
– mặc định private
– phải đặt tường minh public, protected
co
• quyền truy nhập các thành viên của struct
ng
th
an
– mặc định public
– phải đặt tường minh private, protected
du
o
• truy nhập dữ liệu private của lớp
– các hàm truy nhập (accessor method)
cu
u
• Get function – hàm đọc dữ liệu
– đọc dữ liệu private
• Set function – hàm ghi dữ liệu
– ghi dữ liệu private
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
6.9 Các hàm truy nhập và các hàm tiện ích
.c
om
• Các hàm truy nhập – Access functions
– public
an
co
ng
– các hàm đọc và hiển thị dữ liệu
– các hàm ghi dữ liệu (kèm kiểm tra tính hợp lệ)
– các hàm mệnh đề – Predicate functions
th
• kiểm tra các điều kiện
du
o
ng
• Các hàm tiện ích – Utility functions
cu
u
– private
– chỉ hỗ trợ hoạt động của các hàm thành viên kiểu public
– không nhằm mục đích để cho client trực tiếp sử dụng
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// Fig. 6.9: salesp.h
// SalesPerson class definition.
// Member functions defined in salesp.cpp.
#ifndef SALESP_H
#define SALESP_H
.c
om
hàm ghi dữ liệu thực hiện việc
kiểm tra tính hợp lệ của dữ liệu
(validity checks).
ng
class SalesPerson {
co
constructor
input sales from keyboard
set sales for a month
summarize and print sales
th
an
public:
SalesPerson();
//
void getSalesFromUser();
//
void setSales( int, double ); //
void printAnnualSales();
//
salesp.h (1 of 1)
hàm tiện ích private
du
o
ng
private:
double totalAnnualSales();
double sales[ 12 ];
// utility function
// 12 monthly sales figures
u
}; // end class SalesPerson
#endif
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// Fig. 6.10: salesp.cpp
// Member functions for class SalesPerson.
#include
salesp.cpp (1 of 3)
.c
om
std::cout;
std::cin;
std::endl;
std::fixed;
ng
using
using
using
using
co
#include
th
an
using std::setprecision;
du
o
ng
// include SalesPerson class definition from salesp.h
#include "salesp.h"
u
// initialize elements of array sales to 0.0
SalesPerson::SalesPerson()
{
for ( int i = 0; i < 12; i++ )
sales[ i ] = 0.0;
cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
} // end SalesPerson constructor
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
// get 12 sales figures from the user at the keyboard
void SalesPerson::getSalesFromUser()
{
double salesFigure;
salesp.cpp (2 of 3)
co
ng
.c
om
for ( int i = 1; i <= 12; i++ ) {
cout << "Enter sales amount for month " << i << ": ";
cin >> salesFigure;
setSales( i, salesFigure );
th
} // end function getSalesFromUser
an
} // end for
hàm ghi dữ liệu thực hiện việc
kiểm tra tính hợp lệ của dữ
liệu (validity checks).
u
du
o
ng
// set one of the 12 monthly sales figures; function subtracts
// one from month value for proper subscript in sales array
void SalesPerson::setSales( int month, double amount )
{
// test for valid month and amount values
if ( month >= 1 && month <= 12 && amount > 0 )
sales[ month - 1 ] = amount; // adjust for subscripts 0-11
cu
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
else // invalid month or amount value
cout << "Invalid month or sales figure" << endl;
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
} // end function setSales
salesp.cpp (3 of 3)
ng
.c
om
// print total annual sales (with help of utility function)
void SalesPerson::printAnnualSales()
{
cout << setprecision( 2 ) << fixed
<< "\nThe total annual sales are: $"
<< totalAnnualSales() << endl; // call utility function
co
Hàm tiện ích private
phục vụ hàm printAnnualSales;
// private utility function to total annual sales đóng gói thao tác trên mảng sales.
th
an
} // end function printAnnualSales
du
o
ng
double SalesPerson::totalAnnualSales()
{
double total = 0.0;
// initialize total
// summarize s...
 








Các ý kiến mới nhất