Professional Documents
Culture Documents
Lap Trinh C++ Nguyen Manh Hung Chapter06 Adts (Cuuduongthancong - Com)
Lap Trinh C++ Nguyen Manh Hung Chapter06 Adts (Cuuduongthancong - Com)
.c
ng
co
Ngôn ngữ lập trình C++
an
th
Chương 6 – Cấu trúc dữ liệu trừu tượng
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Chương 6: Cấu trúc dữ liệu trừu tượng
Đề mục
om
6.1 Giới thiệu
.c
6.2 Cấu trúc - struct
6.3 Truy nhập các thành viên của struct
ng
6.4 Cài đặt kiểu dữ liệu người dùng Time bằng struct
co
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
an
6.7 Tách giao diện ra khỏi cài đặt
th
6.8 Quản lý quyền truy nhập thành viên
ng
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
o
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tài liệu đọc thêm
om
• Chap 4,5. Introduction to OOP Using C++ (IOOP)
.c
(khái niệm hướng đối tượng)
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.1 Giới thiệu
• 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
om
– tạo kiểu dữ liệu mới - kiểu dữ liệu người dùng tự định
.c
nghĩa (user-defined data type)
ng
co
• bản ghi
an
– gồm nhiều trường, mỗi trường lưu trữ một thành viên
th
dữ liệu thuộc một kiểu dữ liệu cài sẵn hoặc một kiểu dữ
ng
liệu người dùng khác.
o
du
• ví dụ
u
– Họ tên (họ, đệm, tên) (Nguyễn, Văn, An), (Lê, Thị, Bình),...
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.1 Giới thiệu
• C++:
– struct và class - kiểu bản ghi
om
– đối tượng (một thể hiện của một kiểu struct hay class
.c
nào đó) - bản ghi
ng
– thành viên dữ liệu - trường
co
an
– hàm thành viên/phương thức - thao tác trên các thành
th
viên dữ liệu ng
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.2 Cấu trúc - struct
• struct definition
struct Time {
int hour; Structure tag
om
int minute;
.c
int second; Structure members
};
ng
• quy tắc đặt tên cho các thành viên của cấu trúc
co
– trong cùng struct: không thể trùng tên
an
– trong các struct khác nhau: có thể trùng tên
th
• định nghĩa struct phải kết thúc bằng dấu chấm phảy.
ng
– Các biến kiểu cấu trúc được khai báo như các biến thuộc các
o
loại khác
du
– Ví dụ: khai báo biến đơn, mảng, con trỏ, tham chiếu...
u
• Time timeObject;
cu
• Time timeArray[ 10 ];
• Time *timePtr;
• Time &timeRef = timeObject;
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.2 Cấu trúc - struct
om
– thành viên của một cấu trúc không thể thuộc kiểu cấu trúc đó
.c
– thành viên của một cấu trúc có thể là con trỏ đến kiểu cấu trúc đó
ng
(self-referential structure - cấu trúc đệ quy)
co
• 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)
an
struct Node {
th
ng
int data;
o
du
Node* next;
u
};
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.3 Truy nhập các thành viên của struct
• các toán tử truy nhập thành viên (member access
om
operator)
– Toán tử dấu chấm (.) truy nhập trực tiếp đến các thành viên
.c
của cấu trúc/lớp
ng
– Toán tử mũi tên (->) truy nhập các thành viên qua con trỏ
co
đến đối tượng
an
– Ví dụ: in thành viên hour của đối tượng timeObject:
th
cout << timeObject.hour;
ng
hoặc
o
du
timePtr = &timeObject;
cout << timePtr->hour;
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.1: fig06_01.cpp
2 // Create a structure, set its members, and print it.
3 #include <iostream>
4 fig06_01.cpp
5 using std::cout; (1 of 3)
using std::endl;
om
6
7
.c
8 #include <iomanip>
9
ng
10 using std::setfill;
co
11 using std::setw;
12 Định nghĩa kiểu cấu trúc Time
an
13 // structure definition với 3 thành viên là số nguyên.
th
14 struct Time {
15 int hour; // 0-23 (24-hour clock format)
ng
16 int minute; // 0-59
o
17 int second; // 0-59
du
20
21 void printUniversal( const Time & ); // prototype
22 void printStandard( const Time & ); // prototype
23
CuuDuongThanCong.com https://fb.com/tailieudientucntt
24 int main()
25 {
26 Time dinnerTime; // variable ofSử dụng
new ký hiệu
type Timedấu chấm để
27
khởi tạo các thành viên cấu trúc.fig06_01.cpp
28 dinnerTime.hour = 18; // set hour member of dinnerTime (2 of 3)
dinnerTime.minute = 30; // set minute member of dinnerTime
om
29
30 dinnerTime.second = 0; // set second member of dinnerTime
.c
31
32 cout << "Dinner will be held at ";
ng
33 printUniversal( dinnerTime );
co
34 cout << " universal time,\nwhich is ";
35 printStandard( dinnerTime );
an
36 cout << " standard time.\n"; 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ệ.
th
37
38 dinnerTime.hour = 29; // set hour to invalid value
ng
39 dinnerTime.minute = 73; // set minute to invalid value
o
40
du
om
54
55 fig06_01.cpp
Sử dụng manipulator setfill.
output (1 of 1)
.c
56 } // end function printUniversal
57
ng
58 // print time in standard-time format Dùng dấu chấm để truy nhập
co
59 void printStandard( const Time &t ) các thành viên dữ liệu.
60 {
an
61 cout << ( ( t.hour == 0 || t.hour == 12 ) ?
th
62 12 : t.hour % 12 ) << ":" << setfill( '0' )
63 << setw( 2 ) << t.minute << ":"
ng
64 << setw( 2 ) << t.second
o
65 << ( t.hour < 12 ? " AM" : " PM" );
du
66
67 } // end function printStandard
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.4 Cài đặt kiểu dữ liệu người dùng Time
bằng struct
• Truyền tham số:
om
– Mặc định struct được truyền bằng giá trị
.c
– Nên truyền struct bằng tham chiếu để tránh được
ng
việc phải sao chép cấu trúc
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.4 Cài đặt kiểu dữ liệu người dùng Time
bằng struct
• struct kiểu C
om
– không có giao diện giữa bên trong và bên ngoài cấu trúc
.c
• Nếu cài đặt thay đổi, mọi chương trình sử dụng struct đó phải
ng
được sửa đổi theo
– không thể in ra như là một biến đơn
co
• Phải in/định dạng cho từng thành viên
an
– không thể so sánh hai struct theo kiểu thông thường
• Phải so sánh từng thành viên
th
ng
• struct kiểu C++
o
du
– thông lệ: struct chỉ được dùng cho các cấu trúc chỉ gồm dữ liệu;
cu
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ác lớp - Classes
om
– mô hình các đối tượng
.c
• Thuộc tính - Attributes (data members)
ng
• Hành vi - Behaviors (member functions)
co
– từ khoá class
an
– các hàm thành viên – member functions
th
• còn được gọi là các phương thức - method
ng
• được gọi để trả lời các thông điệp
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Class definition bắt đầu bằng Class body bắt đầu bằng
từ khoá class. ngoặc mở.
Class Time
Function prototype definition
cho các public
(1 of 1)
om
member function.
.c
1 class Time { Constructor: thành viên trùng tên
2 với tên class, Time, và không có
ng
3 public: giá trị trả về.
Time(); // constructor
co
4
5 void setTime( int, int, int ); // set hour, minute, second
an
6 void printUniversal(); // print universal-time format
void printStandard(); // print standard-time format
th
7
8
ng
9 private:
Nhãn quyền truy nhập
o
10 int hour; // 0 - 23 (24-hour clock format)
du
11 int minute; // 0 - 59
12 int second; // 0 - 59
u
cu
om
– quy định quyền truy nhập các thành viên của lớp từ các đoạn
.c
trình bên ngoài định nghĩa lớp
ng
– public:
co
• thành viên có thể được truy nhập từ trong toàn bộ phạm vi của đối
tượng
an
th
– private: ng
• thành viên chỉ có thể được truy nhập từ các hàm thành viên của
o
chính lớp đó
du
– protected:
u
cu
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
• Constructor – phương thức khởi tạo
om
– hàm thành viên đặc biệt
.c
• khởi tạo các thành viên dữ liệu
ng
• trùng tên với tên lớp
co
– được gọi khi đối tượng được tạo, ví dụ khi biến được khai báo
an
– có thể có vài constructor
th
• hoạt động theo nguyên tắc hàm gọi chồng
ng
– không có giá trị trả về và không có kiểu giá trị trả về
o
du
class Time { …
u
public: Time::Time()
cu
Time(); {
… hour = minute = second = 0;
}; } // end Time constructor
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
• Destructor – phương thức hủy
om
– trùng tên với tên lớp
.c
• bắt đầu bằng dấu (~)
ng
– không có tham số
co
– tối đa 1 destructor, không thể bị gọi chồng
an
– dành cho việc dọn dẹp, chẳng hạn bộ nhớ
th
ng
class Time { …
o
du
public: Time::~Time()
Time(); {
u
~Time();
cu
//empty
… } // end Time destructor
};
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ác đối tượng của một lớp
om
– Kể từ sau class definition
.c
• tên lớp trở thành tên kiểu mới - type specifier
ng
– C++ là ngôn ngữ mở rộng được
co
• có thể khai báo đối tượng, mảng đối tượng, con trỏ và tham chiếu
an
tới đối tượng
th
– Ví dụ: ng
Tên lớp trở thành tên kiểu dữ liệu mới.
o
du
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ác hàm thành viên được định nghĩa bên ngoài
om
lớp
.c
– toán tử phạm vi (::)
ng
• gắn tên thành viên với tên lớp
co
• xác định duy nhất các hàm của một lớp nào đó
an
• các lớp khác nhau có thể có các hàm thành viên trùng tên
th
– Công thức định nghĩa hàm thành viên
o ng
du
ReturnType ClassName::MemberFunctionName( )
{
u
…
cu
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ác hàm thành viên được định nghĩa bên trong lớp
om
– Không cần toán tử phạm vi (::) và tên lớp
.c
– Trình biên dịch sẽ chuyển thành hàm inline nếu
ng
có thể
co
• Bên ngoài lớp, các hàm inline cần từ khoá inline
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.3: fig06_03.cpp
2 // Time class.
3 #include <iostream>
4 fig06_03.cpp
5 using std::cout; (1 of 5)
using std::endl;
om
6
7
.c
8 #include <iomanip>
9
ng
10 using std::setfill;
co
11 using std::setw;
12
an
13 // Time abstract data type (ADT) definition Định nghĩa lớp Time.
th
14 class Time {
15
ng
16 public:
o
17 Time(); // constructor
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
22 private:
23 int hour; // 0 - 23 (24-hour clock format)
24 int minute; // 0 - 59
25 int second; // 0 - 59 fig06_03.cpp
26 (2 of 5)
}; // end class Time
om
27
28
.c
29 // Time constructor initializes each data member to zero and
30 // ensures all Time objects start in a consistent state
ng
31 Time::Time()
Constructor khởi tạo các thành
co
32 { viên dữ liệu private về 0.
33 hour = minute = second = 0;
an
34
th
35 } // end Time constructor
36
ng
37 // set new Time value using universal time, perform validity
o
38 // checks on the data values and set invalid values to zero Hàm thành viên
du
om
52
53
Không có tham số (ngầm hiểu mục
.c
54 } // end function printUniversal
55 đích là in các thành viên dữ liệu);
ng
56 // print Time in standard format
lời gọi hàm thành viên ngắn gọn hơn
lời gọi hàm thường.
co
57 void Time::printStandard()
58 {
an
59 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )
th
60 << ":" << setfill( '0' ) << setw( 2 ) << minute
61 << ":" << setw( 2 ) << second
ng
62 << ( hour < 12 ? " AM" : " PM" );
o
63
du
66 int main()
67 {
68 Time t; // instantiate object t of class Time
69
CuuDuongThanCong.com https://fb.com/tailieudientucntt
70 // output Time object t's initial values
71 cout << "The initial universal time is ";
72 t.printUniversal(); // 00:00:00
73 fig06_03.cpp
74 cout << "\nThe initial standard time is "; Gọi các hàm thành viên public
(4 of 5) để in
t.printStandard(); // 12:00:00 AM thời gian.
om
75
76
.c
77 t.setTime( 13, 27, 6 ); // change time
78 Dùng hàm thành viên public để gán
ng
79 // output Time object t's new values trị cho các thành viên dữ liệu.
co
80 cout << "\n\nUniversal time after setTime is ";
81 t.printUniversal(); // 13:27:06 Thử gán các giá trị không hợp lệ cho các thành viên
an
82 dữ liệu bằng cách sử dụng hàm thành viên public
th
83 cout << "\nStandard time after setTime is ";
84 t.printStandard(); // 1:27:06 PM
ng
85
o
86 t.setTime( 99, 99, 99 ); // attempt invalid settings
du
87
88 // output t's values after specifying invalid values
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
93 cout << "\nStandard time: ";
94 t.printStandard(); // 12:00:00 AM
95 cout << endl;
96 fig06_03.cpp
97 return 0; (5 of 5)
om
98
99 } // end main fig06_03.cpp
output (1 of 1)
.c
ng
The initial universal time is 00:00:00
co
The initial standard time is 12:00:00 AM
an
Universal time after setTime is 13:27:06
th
Standard time after setTime is 1:27:06 PM Các thành viên dữ liệu được
gán về 0 sau khi thử các giá
ng
After attempting invalid settings: trị không hợp lệ.
o
Universal time: 00:00:00
du
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
• lợi ích khi dùng lớp
om
– đơn giản hóa việc lập trình
.c
– các giao diện – Interfaces
ng
• che dấu phần cài đặt – Hide implementation
co
– tái sử dụng phần mềm – Software reuse
an
• khả năng tích hợp – Composition (aggregation)
th
– các thành viên của một lớp có thể là đối tượng thuộc lớp
ng
khác
o
• thừa kế - Inheritance
du
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
• phạm vi lớp – Class scope
om
– gồm thành viên dữ liệu và hàm thành viên của lớp
.c
– bên trong phạm vi lớp
ng
• Các thành viên của lớp
co
– có thể được truy nhập thẳng từ mọi hàm thành viên
an
– gọi bằng tên
th
– bên ngoài phạm vi lớp
ng
• được gọi đến bằng tên đối tượng, tham chiếu/con trỏ tới đối
o
tượng
du
– objectTime.printStandard()
u
cu
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
• Phạm vi file - File scope
om
– áp dụng cho các hàm không phải thành viên
.c
• Phạm vi hàm – Function scope
ng
– Gồm các biến được khai báo trong hàm thành viên
co
– chỉ được biết đến trong hàm đó
an
th
– bị hủy khi hàm kết thúc ng
– các biến trùng tên với biến thuộc phạm vi lớp
o
du
ClassName::classVariableName
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ác toán tử để truy nhập các thành viên của đối
om
tượng
.c
– giống các toán tử dành cho struct
ng
– toán tử (.) dùng cho
co
• đối tượng
an
• tham chiếu đến đối tượng
– toán tử (->) dùng cho th
o ng
• các con trỏ tới đối tượng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.4: fig06_04.cpp
2 // Demonstrating the class member access operators . and ->
3 //
4 // CAUTION: IN FUTURE EXAMPLES WE AVOID PUBLIC DATA! fig06_04.cpp
5 #include <iostream> (1 of 2)
om
6
7 using std::cout;
.c
8 using std::endl;
9
ng
10 // class Count definition
Thành viên dữ liệu public x
co
11 class Count {
12 minh họa các toán tử truy nhập;
an
13 public: thông thường các thành viên dữ liệu
đều là private.
th
14 int x;
15
ng
16 void print()
o
17 {
du
20
21 }; // end class Count
22
CuuDuongThanCong.com https://fb.com/tailieudientucntt
23 int main()
24 {
25 Count counter; // create counter object
26 Count *counterPtr = &counter; Sử dụng
// dấu pointer
create chấm cho to
đối counter
tượng fig06_04.cpp
27 Count &counterRef = counter; counter.
// create reference to counter (2 of 2)
om
28
29 cout << "Assign 1 to x and print using the object's name: "; fig06_04.cpp
output (1 of 1)
.c
30 counter.x = 1; // assign 1 to data member x
Sử dụng dấu chấm cho counterRef là
31 counter.print(); // call member function print
tham chiếu đến đối tượng.
ng
32
co
33 cout << "Assign 2 to x and print using a reference: ";
34 counterRef.x = 2; // assignSử2 dụng
to data member
mũi tên x
cho counterPtr
an
35 counterRef.print(); // call member
là con trỏfunction print
tới đối tượng.
th
36
37 cout << "Assign 3 to x and print using a pointer: ";
ng
38 counterPtr->x = 3; // assign 3 to data member x
o
39 counterPtr->print(); // call member function print
du
40
41 return 0;
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.7 Tách giao diện ra khỏi cài đặt
om
– ích lợi
.c
• dễ sửa đổi chương trình
ng
co
– bất lợi
an
• phải tạo các file header gồm
th
– một phần của cài đặt
ng
• Inline member functions – các hàm inline
o
du
• private members
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.7 Tách giao diện ra khỏi cài đặt
om
– chứa các định nghĩa lớp và các nguyên mẫu hàm
.c
– được include trong mỗi file sử dụng lớp đó
ng
• #include
co
– mở rộng của file .h
an
• Các file mã nguồn – Source-code files
th
– chứa định nghĩa của các hàm thành viên
o ng
– trùng tên file với file header tương ứng (không kể phần mở
du
rộng)
u
– đượ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
1 // Fig. 6.5: time1.h Mã tiền xử lý để tránh việc file bị
2 // Declaration of class Time. include nhiều lần.
3 // Member functions are defined in time1.cpp
4 “If not defined” time1.h (1 of 1)
5 // prevent multiple inclusions of header file
#ifndef TIME1_H
om
6
7 #define TIME1_H
.c
8 Mã giữa hai định hướng này không được
9 // Time abstract data type definition
include nến tên TIME1_H đã được định nghĩa.
ng
10 class Time {
Định hướng tiền xử lý định nghĩa tên
co
11
12 public: TIME1_H.
an
13 Time(); // constructor
th
14 void setTime( int, int, int ); // set hour, minute, second
15 void printUniversal(); // print universal-time format
ng
16 void printStandard(); // print standard-time format
o
17
du
18 private:
19 int hour; // 0 - 23 (24-hour clock format)
u
cu
20 int minute; // 0 - 59
21 int second; // 0 - 59
Thông lệ đặt tên: tên header file với dấu gạch
22
dưới thay cho dấu chấm.
23 }; // end class Time
24
25 #endif
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.6: time1.cpp
2 // Member-function definitions for class Time.
3 #include <iostream>
4 time1.cpp (1 of 3)
5 using std::cout;
om
6
7 #include <iomanip>
.c
8
9 using std::setfill;
ng
10 using std::setw; Include header file
time1.h.
co
11
12 // include definition of class Time from time1.h
an
13 #include "time1.h"
th
14
15 // Time constructor initializes each data member to zero.
ng
16 // Ensures all Time objects start in a consistent state.
o
17 Time::Time()
Tên của header file đặt trong ngoặc kép;
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
23 // Set new Time value using universal time. Perform validity
24 // checks on the data values. Set invalid values to zero.
25 void Time::setTime( int h, int m, int s )
26 { time1.cpp (2 of 3)
27 hour = ( h >= 0 && h < 24 ) ? h : 0;
minute = ( m >= 0 && m < 60 ) ? m : 0;
om
28
29 second = ( s >= 0 && s < 60 ) ? s : 0;
.c
30
31 } // end function setTime
ng
32
co
33 // print Time in universal format
34 void Time::printUniversal()
an
35 {
th
36 cout << setfill( '0' ) << setw( 2 ) << hour << ":"
37 << setw( 2 ) << minute << ":"
ng
38 << setw( 2 ) << second;
o
39
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
42 // print Time in standard format
43 void Time::printStandard()
44 {
45 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 ) time1.cpp (3 of 3)
46 << ":" << setfill( '0' ) << setw( 2 ) << minute
<< ":" << setw( 2 ) << second
om
47
48 << ( hour < 12 ? " AM" : " PM" );
.c
49
50 } // end function printStandard
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.7: fig06_07.cpp
2 // Program to test class Time.
3 // NOTE: This file must be compiled with time1.cpp.
4 #include <iostream> fig06_07.cpp
5 (1 of 2)
using std::cout;
om
6 Include time1.h để đảm bảo tạo đúng và để
7 using std::endl; tính kích thước đối tượng thuộc lớp Time.
.c
8
9 // include definition of class Time from time1.h
ng
10 #include "time1.h"
co
11
12 int main()
an
13 {
th
14 Time t; // instantiate object t of class Time
15
ng
16 // output Time object t's initial values
o
17 cout << "The initial universal time is ";
du
18 t.printUniversal(); // 00:00:00
19 cout << "\nThe initial standard time is ";
u
cu
20 t.printStandard(); // 12:00:00 AM
21
22 t.setTime( 13, 27, 6 ); // change time
23
CuuDuongThanCong.com https://fb.com/tailieudientucntt
24 // output Time object t's new values
25 cout << "\n\nUniversal time after setTime is ";
26 t.printUniversal(); // 13:27:06
27 cout << "\nStandard time after setTime is "; fig06_07.cpp
28 t.printStandard(); // 1:27:06 PM (2 of 2)
om
29
30 t.setTime( 99, 99, 99 ); // attempt invalid settings fig06_07.cpp
output (1 of 1)
.c
31
32 // output t's values after specifying invalid values
ng
33 cout << "\n\nAfter attempting invalid settings:"
co
34 << "\nUniversal time: ";
35 t.printUniversal(); // 00:00:00
an
36 cout << "\nStandard time: ";
th
37 t.printStandard(); // 12:00:00 AM
38 cout << endl;
ng
39
o
40 return 0;
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.8 Quản lý quyền truy nhập thành viên
om
– private
.c
• kiểu mặc định - Default access mode
ng
• chỉ có các hàm thành viên và các hàm friend là có thể truy
co
nhập các thành viên private
an
– public
th
• truy nhập được từ mọi hàm trong chương trình.
ng
– protected
o
• dành cho quan hệ thừa kế, hiện tại chưa nói đến
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.8: fig06_08.cpp
2 // Demonstrate errors resulting from attempts
3 // to access private class members.
4 #include <iostream> fig06_08.cpp
5 (1 of 1)
using std::cout;
om
6
7
.c
8 // include definition of class Time from time1.h
9 #include "time1.h"
ng
10
co
11 int main()
12 {
an
13 Time t; // 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.
th
14
15
ng
16 t.hour = 7; // error: 'Time::hour' is not accessible
o
17
du
20
21 return 0;
22
23 } // end main
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.8 Quản lý quyền truy nhập thành viên
om
– mặc định private
.c
– phải đặt tường minh public, protected
ng
• quyền truy nhập các thành viên của struct
co
– mặc định public
an
– phải đặt tường minh private, protected
th
ng
• truy nhập dữ liệu private của lớp
o
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.9 Các hàm truy nhập và các hàm tiện ích
om
– public
.c
– các hàm đọc và hiển thị dữ liệu
ng
– các hàm ghi dữ liệu (kèm kiểm tra tính hợp lệ)
co
– các hàm mệnh đề – Predicate functions
an
• kiểm tra các điều kiện
th
• Các hàm tiện ích – Utility functions
o ng
– private
du
– chỉ hỗ trợ hoạt động của các hàm thành viên kiểu public
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.9: salesp.h
2 // SalesPerson class definition.
3 // Member functions defined in salesp.cpp.
4 #ifndef SALESP_H salesp.h (1 of 1)
5 #define SALESP_H
om
6
hàm ghi dữ liệu thực hiện việc
7 class SalesPerson {
kiểm tra tính hợp lệ của dữ liệu
.c
8
(validity checks).
9 public:
ng
10 SalesPerson(); // constructor
co
11 void getSalesFromUser(); // input sales from keyboard
12 void setSales( int, double ); // set sales for a month
an
13 void printAnnualSales(); // summarize and print sales
th
14
hàm tiện ích private
15 private:
ng
16 double totalAnnualSales(); // utility function
o
17 double sales[ 12 ]; // 12 monthly sales figures
du
18
19 }; // end class SalesPerson
u
cu
20
21 #endif
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.10: salesp.cpp
2 // Member functions for class SalesPerson.
3 #include <iostream>
4 salesp.cpp (1 of 3)
5 using std::cout;
using std::cin;
om
6
7 using std::endl;
.c
8 using std::fixed;
9
ng
10 #include <iomanip>
co
11
12 using std::setprecision;
an
13
th
14 // include SalesPerson class definition from salesp.h
15 #include "salesp.h"
ng
16
o
17 // initialize elements of array sales to 0.0
du
18 SalesPerson::SalesPerson()
19 {
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
25 // get 12 sales figures from the user at the keyboard
26 void SalesPerson::getSalesFromUser()
27 {
28 double salesFigure; salesp.cpp (2 of 3)
29
for ( int i = 1; i <= 12; i++ ) {
om
30
31 cout << "Enter sales amount for month " << i << ": ";
.c
32 cin >> salesFigure;
33 setSales( i, salesFigure );
ng
34
co
35 } // end for
36 hàm ghi dữ liệu thực hiện việc
an
37 } // end function getSalesFromUser kiểm tra tính hợp lệ của dữ
liệu (validity checks).
th
38
39 // set one of the 12 monthly sales figures; function subtracts
ng
40 // one from month value for proper subscript in sales array
o
41 void SalesPerson::setSales( int month, double amount )
du
42 {
43 // test for valid month and amount values
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
49
50 } // end function setSales
51
52 // print total annual sales (with help of utility function) salesp.cpp (3 of 3)
53 void SalesPerson::printAnnualSales()
{
om
54
55 cout << setprecision( 2 ) << fixed
.c
56 << "\nThe total annual sales are: $"
57 << totalAnnualSales() << endl; // call utility function
ng
58
Hàm tiện ích private
co
59 } // end function printAnnualSales
60 phục vụ hàm printAnnualSales;
an
61 // private utility function to total annual sales đóng gói thao tác trên mảng sales.
th
62 double SalesPerson::totalAnnualSales()
63 {
ng
64 double total = 0.0; // initialize total
o
65
du
68
69 return total;
70
71 } // end function totalAnnualSales
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.11: fig06_11.cpp
2 // Demonstrating a utility function.
3 // Compile this program with salesp.cpp
4 fig06_11.cpp
5 // include SalesPerson class definition from salesp.h (1 of 1)
#include "salesp.h"
om
6
7 Chuỗi gọi hàm đơn giản;
logic chương trình được đóng gói trong các
.c
8 int main()
hàm thành viên.
9 {
ng
10 SalesPerson s; // create SalesPerson object s
co
11
12 s.getSalesFromUser(); // note simple sequential code; no
an
13 s.printAnnualSales(); // control structures in main
th
14
15 return 0;
ng
16
o
17 } // end main
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Enter sales amount for month 1: 5314.76
Enter sales amount for month 2: 4292.38
Enter sales amount for month 3: 4589.83
Enter sales amount for month 4: 5534.03 fig06_11.cpp
Enter sales amount for month 5: 4376.34 output (1 of 1)
Enter sales amount for month 6: 5698.45
om
Enter sales amount for month 7: 4439.22
.c
Enter sales amount for month 8: 5893.57
Enter sales amount for month 9: 4909.67
ng
Enter sales amount for month 10: 5123.45
co
Enter sales amount for month 11: 4024.97
Enter sales amount for month 12: 5923.92
an
th
The total annual sales are: $60120.59 o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.10 Khởi tạo các đối tượng: Constructor
• Constructors
om
– khởi tạo các thành viên dữ liệu
.c
• hoặc có thể gán trị cho các thành viên dữ liệu sau
ng
– trùng tên với tên lớp class Time {
co
– không có kiểu trả về public:
Time( int, int, int);
an
• Các giá trị khởi tạo – Initializers ...
th
}; // end class Time
– được truyền dưới dạng đối số
ng
...
int main()
o
cho constructor
du
{
– khi khai báo biến: đặt trong cặp Time t( 27, 74, 99 );
u
...
ngoặc đơn trước dấu chấm phảy
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.11 Sử dụng các đối số mặc định với
constructor
om
.c
– tương tự đối số mặc định của hàm thông thường
ng
• constructor mặc định:
co
– có thể gọi không cần tham số
an
• Time t;
th
– Tất cả các đối số là mặc định HOẶC thực sự không nhận tham
ng
số
o
du
• Time();
– mỗi lớp chỉ được có tối đa một constructor mặc định
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.12: time2.h
2 // Declaration of class Time.
3 // Member functions defined in time2.cpp.
4 time2.h (1 of 1)
5 // prevent multiple inclusions of header file
#ifndef TIME2_H
om
6
7 #define TIME2_H
.c
8
9 // Time abstract data type definition
ng
10 class Time { Default constructor chỉ định giá
trị mặc định cho mọi đối số.
co
11
12 public:
an
13 Time( int = 0, int = 0, int = 0); // default constructor
th
14 void setTime( int, int, int ); // set hour, minute, second
15 void printUniversal(); // print universal-time format
ng
16 void printStandard(); // print standard-time format
o
17
du
18 private:
19 int hour; // 0 - 23 (24-hour clock format)
u
cu
20 int minute; // 0 - 59
21 int second; // 0 - 59
22
23 }; // end class Time
24
25 #endif
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.13: time2.cpp
2 // Member-function definitions for class Time.
3 #include <iostream>
4 time2.cpp (1 of 2)
5 using std::cout;
om
6
7 #include <iomanip>
.c
8
9 using std::setfill;
ng
10 using std::setw;
co
11
12 // include definition of class Time from time2.h
an
13 #include "time2.h"
th
14
15 // Time constructor initializes each data member to zero;
ng
16 // ensures all Time objects start in a consistent state
o
17 Time::Time( int hr, int min, int sec ) Constructor gọi setTime để kiểm tra các
du
20
21 } // end Time constructor
22
CuuDuongThanCong.com https://fb.com/tailieudientucntt
23 // set new Time value using universal time, perform validity
24 // checks on the data values and set invalid values to zero
25 void Time::setTime( int h, int m, int s )
26 { time2.cpp (2 of 2)
27 hour = ( h >= 0 && h < 24 ) ? h : 0;
28 minute = ( m >= 0 && m < 60 ) ? m : 0;
om
29 second = ( s >= 0 && s < 60 ) ? s : 0;
30
.c
31 } // end function setTime
32
ng
33 // print Time in universal format
co
34 void Time::printUniversal()
35 {
an
36 cout << setfill( '0' ) << setw( 2 ) << hour << ":"
th
37 << setw( 2 ) << minute << ":"
38 << setw( 2 ) << second;
ng
39
o
40 } // end function printUniversal
du
41
42 // print Time in standard format
u
43 void Time::printStandard()
cu
44 {
45 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )
46 << ":" << setfill( '0' ) << setw( 2 ) << minute
47 << ":" << setw( 2 ) << second
48 << ( hour < 12 ? " AM" : " PM" );
49
50 } // end function printStandard
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.14: fig06_14.cpp
2 // Demonstrating a default constructor for class Time.
3 #include <iostream>
4 fig06_14.cpp
5 using std::cout; (1 of 2)
using std::endl;
om
6
7
.c
8 // include definition of class Time from time2.h
9 #include "time2.h"
ng
10
Khởi tạo các đối tượng Time sử
co
11 int main()
12 { dụng các tham số mặc định.
an
13 Time t1; // all arguments defaulted
th
14 Time t2( 2 ); // minute and second defaulted
15 Time t3( 21, 34 ); // second defaulted
ng
16 Time t4( 12, 25, 42 ); // all values specified
o
17 Time t5( 27, 74, 99 ); // all bad values specified
du
18
19 cout << "Constructed with:\n\n" Khởi tạo đối tượng Time với
u
CuuDuongThanCong.com https://fb.com/tailieudientucntt
25 cout << "\n\nhour specified; default minute and second:\n ";
26 t2.printUniversal(); // 02:00:00
27 cout << "\n ";
28 t2.printStandard(); // 2:00:00 AM fig06_14.cpp
29 (2 of 2)
cout << "\n\nhour and minute specified; default second:\n ";
om
30
31 t3.printUniversal(); // 21:34:00
.c
32 cout << "\n ";
33 t3.printStandard(); // 9:34:00 PM
ng
34
co
35 cout << "\n\nhour, minute, and second specified:\n ";
36 t4.printUniversal(); // 12:25:42
an
37 cout << "\n ";
th
38 t4.printStandard(); // 12:25:42 PM
39
ng
40 cout << "\n\nall invalid values specified:\n "; t5 được xây dựng bằng các
o
41 t5.printUniversal(); // 00:00:00 đối số không hợp lệ, các giá
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.12 Destructor – hàm hủy
om
– hàm thành viên đặc biệt
.c
– trùng tên với tên lớp
ng
• bắt đầu bằng dấu ngã (~)
co
– không nhận đối số
an
– không có giá trị trả về
– không thể bị gọi chồng
th
ng
– thực hiện việc dọn dẹp
o
du
• trước khi hệ thống lấy lại phần bộ nhớ của đối tượng
u
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.13 Khi nào Constructor và Destructor
được gọi
• các constructor và destructor
om
– được gọi ngầm bởi trình biên dịch
.c
• thứ tự gọi hàm
ng
– phụ thuộc vào thứ tự thực thi chương trình
co
• khi chương trình vào và ra khỏi phạm vi của các đối tượng
an
– các đối tượng cũng là các biến thông thường,
th
• biến được khởi tạo – constructor được gọi – tại thời điểm bắt
ng
đầu tồn tại / phạm vi
o
• biến bị hủy – destructor được gọi – khi kết thúc sự tồn tại / ra
du
khỏi phạm vi
u
cu
– thông thường, các lời gọi destructor theo thứ tự ngược lại với
thứ tự gọi các constructor
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.13 Khi nào Constructor và Destructor
được gọi
• Thứ tự các lời gọi constructor, destructor
om
– đối với các đối tượng/biến phạm vi toàn cục (global
.c
scope objects)
ng
• Constructor
co
– được gọi trước mọi hàm khác (kể cả main)
an
• Destructor
th
– được gọi khi main kết thúc (hoặc khi hàm exit được
ng
gọi)
o
– không được gọi nếu chương trình kết thúc bằng hàm
du
abort
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.13 Khi nào Constructor và Destructor
được gọi
• Thứ tự các lời gọi constructor, destructor
om
– đối với các đối tượng/biến địa phương (automatic local
.c
objects)
ng
• Constructor
co
– được gọi khi đối tượng được định nghĩa
an
• mỗi khi chương trình vào phạm vi của đối tượng
th
• Destructor ng
– được gọi khi đối tượng ra khỏi phạm vi
o
nghĩa
u
cu
– không được gọi nếu chương trình kết thúc bằng exit hay
abort
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.13 Khi nào Constructor và Destructor
được gọi
• Thứ tự các lời gọi constructor, destructor
om
– các đối tượng tĩnh địa phương (static local objects)
.c
• Constructor
ng
– đúng một lần
co
– khi chương trình chạy đến chỗ đối tượng được định nghĩa
an
• Destructor
th
– khi hàm main kết thúc hoặc khi hàm exit được gọi
ng
– không được gọi nếu chương trình kết thúc bằng hàm
o
abort
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.15: create.h
2 // Definition of class CreateAndDestroy.
3 // Member functions defined in create.cpp.
4 #ifndef CREATE_H create.h (1 of 1)
5 #define CREATE_H
om
6
Các hàm thành viên
7 class CreateAndDestroy {
constructor và destructor
.c
8
9 public:
ng
10 CreateAndDestroy( int, char * ); // constructor
co
11 ~CreateAndDestroy(); // destructor
12
Các thành viên private
an
13 private:
để minh họa thứ tự các lời gọi
th
14 int objectID;
constructor và destructor
15 char *message;
ng
16
o
17 }; // end class CreateAndDestroy
du
18
19 #endif
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.16: create.cpp
2 // Member-function definitions for class CreateAndDestroy
3 #include <iostream>
4 create.cpp (1 of 2)
5 using std::cout;
using std::endl;
om
6
7
.c
8 // include CreateAndDestroy class definition from create.h
9 #include "create.h"
ng
10
co
11 // constructor
12 CreateAndDestroy::CreateAndDestroy(
an
13 int objectNumber, char *messagePtr )
th
14 {
Output message để thể hiện
15 objectID = objectNumber;
ng
thời gian của các lời gọi hàm
16 message = messagePtr;
constructor.
o
17
du
18 cout << "Object " << objectID << " constructor runs "
19 << message << endl;
u
cu
20
21 } // end CreateAndDestroy constructor
22
CuuDuongThanCong.com https://fb.com/tailieudientucntt
23 // destructor Output message để thể hiện thời gian
24 CreateAndDestroy::~CreateAndDestroy() của các lời gọi hàm destructor
25 {
26 // the following line is for pedagogic purposes only create.cpp (2 of 2)
27 cout << ( objectID == 1 || objectID == 6 ? "\n" : "" );
om
28
29 cout << "Object " << objectID << " destructor runs "
.c
30 << message << endl;
31
ng
32 } // end ~CreateAndDestroy destructor
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.17: fig06_17.cpp
2 // Demonstrating the order in which constructors and
3 // destructors are called.
4 #include <iostream> fig06_17.cpp
5 (1 of 2)
using std::cout;
om
6
7 using std::endl;
.c
8
9 // include CreateAndDestroy class definition from create.h
ng
10 #include "create.h"
tạo đối tượng có phạm vi toàn cục
co
11
12 void create( void ); // prototype
an
13
th
14 // global object
15 CreateAndDestroy first( 1, "(global before main)" );
ng
16
o
17 int main()
Tạo đối tượng tự động địa phương.
du
18 {
19 cout << "\nMAIN FUNCTION: EXECUTION BEGINS" << endl;
u
20
21 CreateAndDestroy second( 2, "(local automatic in main)" );
22
23 static CreateAndDestroy third( 3, "(local static in main)" );
24 Tạo các đối tượng tự động địa phương.
25 create(); // call function to create objects
26 CuuDuongThanCong.com https://fb.com/tailieudientucntt
28 cout << "\nMAIN FUNCTION: EXECUTION RESUMES" << endl;
29
30 CreateAndDestroy fourth( 4, "(local automatic in main)" );
31 fig06_17.cpp
32 cout << "\nMAIN FUNCTION: EXECUTION ENDS" << endl; (2 of 2)
Tạo đối tượng tự động địa phương.
om
33
34 return 0;
.c
35
36 } // end main
ng
37
co
38 // function to create objects
39 void create( void )
Tạo đối tượng tự động địa phương bên trong hàm.
an
40 {
th
41 cout << "\nCREATE FUNCTION: EXECUTION BEGINS" << endl;
42 Tạo đối tượng địa phương static bên trong hàm.
ng
43 CreateAndDestroy fifth( 5, "(local automatic in create)" );
o
44
du
47
48 CreateAndDestroy seventh(
49 7, "(local automatic in create)" );
50
51 cout << "\nCREATE FUNCTION: EXECUTION ENDS\" << endl;
52
53 } // end functionCuuDuongThanCong.com
create https://fb.com/tailieudientucntt
Object 1 constructor runs (global before main)
om
CREATE FUNCTION: EXECUTION BEGINS
Object 5 constructor runs (local automatic in create)
.c
Object 6 constructor runs (local static in create)
Object 7 constructor runs (local automatic in create)
đối
các tượng
destructorstaticcho cácđịađối
ng
CREATE FUNCTION: EXECUTION ENDS đối tượng
phương
tượng tựtồn toàn cục
tại địa
động được
chophương
đến khitạo
co
Object 7 destructor runs (local automatic in create) trước
các
chương khi
đốihàm main
tượng
trình bắt
tự động
kết thúc
đượcđầu
địavà bị
trong
đối tượng main
static địa gọi
Object 5 destructor runs (local automatic in create) hủy
theo cuối
phươngthứbị cùng.
tự hủy
ngượcsauvới
khicác
hàm
phương được tạo tại lời gọivới
an
kết thúc
constructor.theo thứ tự ngược
MAIN FUNCTION: EXECUTION RESUMES hàm
thứ tựđầu
tạo.tiên và hủy sau khi
th
Object 4 constructor runs (local automatic in main)
ng hàm main kết thúc.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
6.14 Sử dụng các hàm truy nhập
om
– kiểm tra tính hợp lệ trước khi sửa đổi dữ liệu private
.c
– thông báo nếu các giá trị là không hợp lệ
ng
– thông báo qua các giá trị trả về
co
• Get functions – các hàm đọc
an
th
– các hàm truy vấn – “Query” functions
ng
– quản lý định dạng của dữ liệu trả về
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.18: time3.h
2 // Declaration of class Time.
3 // Member functions defined in time3.cpp
4 time3.h (1 of 2)
5 // prevent multiple inclusions of header file
#ifndef TIME3_H
om
6
7 #define TIME3_H
.c
8
9 class Time {
ng
10
co
11 public:
12 Time( int = 0, int = 0, int = 0 ); // default constructor
an
13
Các hàm ghi
th
14 // set functions
15 void setTime( int, int, int ); // set hour, minute, second
ng
16 void setHour( int ); // set hour
o
17 void setMinute( int ); // set minute
du
20 // get functions
21 int getHour(); // return hour
22 int getMinute(); // return minute
23 int getSecond(); // return second
24
CuuDuongThanCong.com https://fb.com/tailieudientucntt
25 void printUniversal(); // output universal-time format
26 void printStandard(); // output standard-time format
27
28 private: time3.h (2 of 2)
29 int hour; // 0 - 23 (24-hour clock format)
int minute; // 0 - 59
om
30
31 int second; // 0 - 59
.c
32
33 }; // end clas Time
ng
34
co
35 #endif
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1 // Fig. 6.19: time3.cpp
2 // Member-function definitions for Time class.
3 #include <iostream>
4 time3.cpp (1 of 4)
5 using std::cout;
om
6
7 #include <iomanip>
.c
8
9 using std::setfill;
ng
10 using std::setw;
co
11
12 // include definition of class Time from time3.h
an
13 #include "time3.h"
th
14
15 // constructor function to initialize private data;
ng
16 // calls member function setTime to set variables;
o
17 // default values are 0 (see class definition)
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
24 // set hour, minute and second values
25 void Time::setTime( int h, int m, int s )
26 {
27 setHour( h ); time3.cpp (2 of 4)
28 setMinute( m );
setSecond( s );
om
29
30 Gọi các hàm set dể kiểm tra
tính hợp lệ.
.c
31 } // end function setTime
32
ng
33 // set hour value
co
34 void Time::setHour( int h )
35 {
an
36 hour = ( h >= 0 && h < 24 ) ? h : 0;
th
37
38 } // end function setHour
ng Các hàm set kiểm tra tính hợp
lệ trước khi sửa đổi dữ liệu.
39
o
40 // set minute value
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các hàm set kiểm tra tính hợp
47 // set second value
lệ trước khi sửa đổi dữ liệu.
48 void Time::setSecond( int s )
49 {
50 second = ( s >= 0 && s < 60 ) ? s : 0; time3.cpp (3 of 4)
51
} // end function setSecond
om
52
53
.c
54 // return hour value
55 int Time::getHour()
ng
56 {
co
57 return hour;
58
Các hàm get cho client đọc dữ
liệu
an
59 } // end function getHour
th
60
61 // return minute value
ng
62 int Time::getMinute()
o
63 {
du
64 return minute;
65
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
68 // return second value
69 int Time::getSecond()
70 {
71 return second; time3.cpp (4 of 4)
72 Hàm get cho client đọc dữ liệu
} // end function getSecond
om
73
74
.c
75 // print Time in universal format
76 void Time::printUniversal()
ng
77 {
co
78 cout << setfill( '0' ) << setw( 2 ) << hour << ":"
79 << setw( 2 ) << minute << ":"
an
80 << setw( 2 ) << second;
th
81
82 } // end function printUniversal
ng
83
o
84 // print Time in standard format
du
85 void Time::printStandard()
86 {
u
cu
om
6
7
.c
8 // include definition of class Time from time3.h
9 #include "time3.h"
ng
10
co
11 void incrementMinutes( Time &, const int ); // prototype
12
an
13 int main()
Gọi các hàm set để gán các
th
14 {
giá trị hợp lệ.
15 Time t; // create Time object
ng
16
o
17 // set time using individual set functions
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
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() fig06_20.cpp
26 << " Second: " << t.getSecond(); (2 of 3)
Cố dùng các hàm set để gán
các giá trị không hợp lệ.
om
27
28 // set time using individual set functions
.c
29 t.setHour( 234 ); // invalid hour set to 0
30 t.setMinute( 43 ); // set minute to valid value
ng
31 t.setSecond( 6373 ); // invalid second set to 0
các giá trị không hợp lệ làm
co
32
33 // display hour, minute and second after setting
các data member bị gán về 0.
an
34 // invalid hour and second values
th
35 cout << "\n\nResult of attempting to set invalid hour and"
36 << " second:\n Hour: " << t.getHour()
ng
37 << " Minute: " << t.getMinute() Sửa đổi data member bằng
<< " Second: " << t.getSecond() << "\n\n"; hàm setTime.
o
38
du
39
40 t.setTime( 11, 58, 0 ); // set time
u
cu
om
52 Dùng các hàm get để đọc và
53 các hàm set để sửa dữ liệu.
.c
54 for ( int i = 0; i < count; i++ ) {
55 tt.setMinute( ( tt.getMinute() + 1 ) % 60 );
ng
56
co
57 if ( tt.getMinute() == 0 )
58 tt.setHour( ( tt.getHour() + 1 ) % 24);
an
59
th
60 cout << "\nminute + 1: ";
61 tt.printStandard();
ng
62 Result of setting all valid values:
o
63 } // end for Hour: 17 Minute: 34 Second: 25
du
64
65 cout << endl; Result of attempting to set invalid hour and second:
u
66
67 } // end function incrementMinutes
Incrementing minute 3 times:
Start time: 11:58:00 AM Cố gắng gán các giá trị không
minute + 1: 11:59:00 AM hợp lệ cho các thành viên dữ
minute + 1: 12:00:00 PM liệu, kết quả là thông báo lỗi
và các thành viên bị gán về 0.
minute + 1: 12:01:00 PM https://fb.com/tailieudientucntt
CuuDuongThanCong.com
6.15 Phép gán mặc định
om
– Phép gán (=)
.c
• 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)
ng
– Mỗi thành viên của đối tượng vế phải được gán cho thành viên
co
tương ứng tại vế trái
an
• được ngầm thực hiện khi
th
– truyền tham số là đối tượng ng
– trả về đối tượng
o
CuuDuongThanCong.com https://fb.com/tailieudientucntt
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 <iostream> fig06_24.cpp
5 (1 of 3)
using std::cout;
om
6
7 using std::endl;
.c
8
9 // class Date definition
ng
10 class Date {
co
11
12 public:
an
13 Date( int = 1, int = 1, int = 1990 ); // default constructor
th
14 void print();
15
ng
16 private:
o
17 int month;
du
18 int day;
19 int year;
u
cu
20
21 }; // end class Date
22
CuuDuongThanCong.com https://fb.com/tailieudientucntt
23 // Date constructor with no range checking
24 Date::Date( int m, int d, int y )
25 {
26 month = m; fig06_24.cpp
27 day = d; (2 of 3)
year = y;
om
28
29
.c
30 } // end Date constructor
31
ng
32 // print Date in the format mm-dd-yyyy
co
33 void Date::print()
34 {
an
35 cout << month << '-' << day << '-' << year;
th
36
37 } // end function print
ng
38
o
39 int main()
du
40 {
41 Date date1( 7, 4, 2002 );
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
44 cout << "date1 = "; phép gán mặc định gán từng
45 date1.print(); thành viên của date1 cho
46 cout << "\ndate2 = "; thành viên tương ứng của
47 date2.print(); date2. fig06_24.cpp
48 (3 of 3)
date2 = date1; // default memberwise assignment
om
49
50 fig06_24.cpp
output (1 of 1)
.c
51 cout << "\n\nAfter default memberwise assignment, date2 = ";
52 date2.print();
ng
53 cout << endl;
co
54
55 return 0;
an
56
th
57 } // end main o ng
du
date1 = 7-4-2002
u
date2 = 1-1-1990
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt