Tải bản đầy đủ (.pdf) (82 trang)

Lap trinh c++ adts Cấu trúc dữ liệu trừu tượng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (681.45 KB, 82 trang )

.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

/>

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

/>

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

/>

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),...

/>

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

/>

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

/>

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

/>

6.3 Truy nhập các thành viên của struct

.c
om


• các tố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

/>

// Fig. 6.1: fig06_01.cpp
// Create a structure, set its members, and print it.
#include <iostream>

fig06_01.cpp
(1 of 3)

.c
om

using std::cout;
using std::endl;

ng

#include <iomanip>

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

/>

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

/>

// 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

/>

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

/>


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 ngồ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

/>

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

/>

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.
/>

.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 ngồi định nghĩa lớp

co

– public:

th

an

• thành viên có thể được truy nhập từ trong tồ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

/>

.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 ngun 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

/>

.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

/>

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

/>

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 ngồi
lớp


ng

– tố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

/>

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 tố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 ngồi lớp, các hàm inline cần từ khoá inline

CuuDuongThanCong.com

/>

// Fig. 6.3: fig06_03.cpp
// Time class.
#include <iostream>

fig06_03.cpp
(1 of 5)

.c
om

using std::cout;
using std::endl;

ng

#include <iomanip>

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

/>

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

/>
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

/>

// 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

/>

×