Kỹ thuật lập trình - Chương 5: Lớp và đối tượng

5.1 Kháiniệm

5.2 Từcấutrúcsanglớp

5.3 Biếnthànhviên

5.4 Hàmthànhviên

5.5 Kiểmsoáttruynhập

pdf19 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 1684 | Lượt tải: 1download
Tóm tắt nội dung Kỹ thuật lập trình - Chương 5: Lớp và đối tượng, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 2005 - HMS
5.1 Khái niệm
Đối tượng là gì?
ƒ Thực thể phần mềm
ƒ Mô hình/₫ại diện của một ₫ối tượng vật lý:
— Tank, Heater, Furnace
— Motor, Pump, Valve
— Sensor, Thermometer, Flowmeter
— Control Loop, Control System 
ƒ Hoặc một ₫ối tượng logic ("conceptual object):
— Trend, Report, Button, Window
— Matrix, Vector, Polynomial
4©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
Một ₫ối tượng có...
 Các thuộc tính (attributes)
 Trạng thái (state)
• Dữ liệu 
• Quan hệ
 Hành vi (behavior)
• Các phép toán
• Đặc tính phản ứng
 Căn cước (identity)
 Ngữ nghĩa/trách nhiệm 
(semantic/responsibilities)
Hành vi
sủa, cắn, chạy
chạy khi gặp nguy hiểm
Trạng thái
tư thế
sức khỏe
Căn cước
Tên: Rex
ID: 007
Ngữ nghĩa
Chó giữ nhà
Thuộc tính
màu lông: vàng
giống: Berge
5©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
Lớp là gì?
ƒ Một lớp là thực thi của các ₫ối tượng có chung
— Ngữ nghĩa
— Thuộc tính
— Quan hệ
— Hành vi
ƒ Lớp = Đóng gói [Cấu trúc dữ liệu + hàm thao tác]
— Lớp các vector, lớp các ma trận (dữ liệu phần tử + các phép truy
nhập và phép toán cơ bản)
— Lớp các hình chữ nhật (các dữ liệu tọa ₫ộ + phép vẽ, xóa,...)
— Lớp các mô hình hàm truyền (các hệ số ₫a thức tử/mẫu, các phép
toán xác ₫ịnh tính ổn ₫ịnh, xác ₫ịnh các ₫iểm cực,...)
ƒ Các dữ liệu của một lớp => biến thành viên
ƒ Các hàm của một lớp => hàm thành viên
ƒ Các biến của một lớp => một ₫ối tượng, một thể nghiệm
6©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
Lập trình hướng ₫ối tượng
(object-oriented programming, OOP)
ƒ Trừu tượng hóa (abstraction): giúp ₫ơn giản hóa vấn ₫ề, dễ sử
dụng lại
ƒ Đóng gói dữ liệu/che dấu thông tin (data encapsulation/ 
information hiding): nâng cao giá trị sử dụng lại và ₫ộ tin cậy 
của phần mềm
ƒ Dẫn xuất/thừa kế (subtyping/inheritance): giúp dễ sử dụng lại 
mã phần mềm và thiết kế
ƒ Đa hình/₫a xạ (polymorphism): giúp phản ánh trung thực thế
giới thực và nâng cao tính linh hoạt của phần mềm
Phương pháp luận hướng ₫ối tượng cho phép tư duy ở mức
trừu tượng cao nhưng gần với thế giới thực!
7©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
5.2 Từ cấu trúc sang lớp
struct Time {
int hour; // gio
int min; // phut
int sec; // giay
};
void addHour(Time& t, int h) {
t.hour += h;
}
void addMin(Time& t, int m) {
t.min += m;
if (t.min > 59) {
t.hour += t.min/60;
t.min %= 60;
}
else if (t.min < 0) {
t.hour += (t.min/60 - 1);
t.min = (t.min % 60) + 60;
}
}
void addSec(Time& t, int s) { 
t.sec += s;
if (t.sec > 59) {
addMin(t, t.sec/60);
t.sec %= 60;
}
else if (t.sec < 0) {
addMin(t, t.sec/60 - 1);
t.sec = (t.sec % 60) + 60;
}
}
void main() {
Time t = {1, 0, 0};
addMin(t,60);
addMin(t,-5);
addSec(t,25);
...
}
8©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
Một số vấn ₫ề của cấu trúc
ƒ Truy nhập dữ liệu trực tiếp, không có kiểm soát có thể dẫn ₫ến
không an toàn
Time t1 = {1, 61, -3}; // ??!
Time t2; // Uncertain values
int h = t2.hour; // ??!
int m = 50;
t2.min = m + 15; // ??! 
ƒ Không phân biệt giữa “chi tiết bên trong” và “giao diện bên
ngoài”, một thay ₫ổi nhỏ ở chi tiết bên trong cũng bắt người sử
dụng phải thay ₫ổi mã sử dụng theo!
Ví dụ: cấu trúc Time ₫ược sửa lại tên biến thành viên:
struct Time {
int h, m, s; 
};
Đoạn mã cũ sẽ không biên dịch ₫ược:
Time t;
t.hour = 5;
9©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
Đóng gói hay "lớp hóa"
class Time {
int hour; // gio
int min; // phut
int sec; // giay
public:
Time() {hour=min=sec=0;}
void setTime(int h, int m, int s) 
{
hour = h;
min = sec = 0;
addSec(s);
addMin(m);
}
int getHour() { return hour; }
int getMin() { return min; }
int getSec() { return sec; }
void addHour(int h) { hour += h; }
...
Biến thành viên
(member variable)
Hàm tạo (constructor)
Hàm thành viên
(member functions)
10
©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
void addMin(int m) { 
min += m;
if (min > 59) {
hour += min/60;
min %= 60;
}
else if (min < 0) {
hour += (min/60 - 1);
min = (min % 60) + 60;
}
}
void addSec(int s) { 
sec += s;
if (sec > 59) {
addMin(sec/60);
sec %= 60;
}
else if (sec < 0) {
addMin(sec/60 - 1);
sec = (sec % 60) + 60;
}
}
};
void main() 
{
Time t;
t.addHour(1);
t.addMin(60);
t.addMin(-5);
t.addSec(25);
t.hour = 1; // error
t.min = 65; // error
t.sec = -3; // error
t.setTime(1, 65, -3); 
int h = t.getHour();
int m = t.getMin();
int s = t.getSec();
}
11
©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
5.3 Biến thành viên
ƒ Khai báo biến thành viên của một lớp tương tự như cấu trúc
class Time {
int hour, min, sec;
...
};
ƒ Mặc ₫ịnh, các biến thành viên của một lớp không truy nhập
₫ược từ bên ngoài (biến riêng), ₫ương nhiên cũng không khởi
tạo ₫ược theo cách cổ ₫iển:
Time t = {1, 0, 0}; // error!
t.hour = 2; // error!
ƒ Có thể làm cho một biến thành viên truy nhập ₫ược từ bên
ngoài (biến công cộng), tuy nhiên ít khi có lý do cần làm như thế:
class Point {
public:
int x,y;
};
12
©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
ƒ Kiểm soát việc truy nhập các biến riêng thông qua các hàm
thành viên
ƒ Cách duy nhất ₫ể khởi tạo giá trị cho các biến thành viên là sử
dụng hàm tạo:
class Time {
...
public:
Time() {hour=min=sec=0;}
};
Time t; // t.hour = t.min = t.sec = 0;
ƒ Một số biến thành viên có vai trò lưu trữ trạng thái bên trong
của ₫ối tượng, không nên cho truy nhập từ bên ngoài (ngay cả
gián tiếp qua các hàm)
class PID {
double Kp, Ti, Td; // controller parameters
double I; // internal state
...
};
13
©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
5.4 Hàm thành viên
Định nghĩa cấu trúc & hàm Định nghĩa lớp
struct Time {
int hour, min, sec 
};
void addHour(Time& t, int h) {
t.hour += h;
}
...
class Time {
int hour,min,sec;
public:
void addHour(int h) {
hour += h;
}
...
};
Gọi hàm thành viên của ĐT Gọi hàm với biến cấu trúc
Time t;
...
t.addHour(5);
Time t;
...
addHour(t,5);
Ở ₫ây có sự khác nhau về cách viết, 
nhưng chưa có sự khác nhau cơ bản
14
©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
Khai báo và ₫ịnh nghĩa hàm thành viên
ƒ Thông thường, lớp cùng các hàm thành viên ₫ược khai báo
trong tệp tin ₫ầu (*.h). Ví dụ trong tệp có tên “mytime.h”:
class Time {
int hour,min,sec;
public:
void addHour(int h);
void addMin(int m);
void addSec(int s);
...
};
ƒ Các hàm thường ₫ược ₫ịnh nghĩa trong tệp tin nguồn (*.cpp):
#include “mytime.h”
...
void Time::addHour(int h) {
hour += h;
}
15
©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
ƒ Có thể ₫ịnh nghĩa một hàm thành viên trong tệp tin ₫ầu dưới dạng
một hàm inline (chỉ nên áp dụng với hàm ₫ơn giản), ví dụ:
inline void Time::addHour(int h) { hour += h;}
ƒ Một hàm thành viên cũng có thể ₫ược ₫ịnh nghĩa trong phần khai
báo lớp => mặc ₫ịnh trở thành hàm inline, ví dụ
class Time {
int hour,min,sec;
public:
void addHour(int h) { hour += h; }
};
ƒ Khi ₫ịnh nghĩa hàm thành viên, có thể sử dụng các biến thành
viên và gọi hàm thành viên khác mà không cần (thậm chí không
thể ₫ược) ₫ưa tên biến ₫ối tượng, ví dụ:
void Time::addSec(int s) { 
...
addMin(sec/60);
...
}
16
©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
Bản chất của hàm thành viên?
class Time {
int hour,min,sec;
public:
Time() { hour=min=sec=0; }
void addHour(int h) {
this->hour += h;// con trỏ this chính là ₫ịa chỉ của
} // ₫ối tượng gọi hàm thành viên
...
};
void main() {
Time t1,t2; // Tự ₫ộng gọi hàm tạo Time() cho t1 và t2
t1.addHour(5); // Có thể hiểu như là addHour(&t1,5);
t2 = t1; // OK
t2.addHour(5); // Có thể hiểu như là addHour(&t2,5);
...
}
17
©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
5.5 Kiểm soát truy nhập
ƒ public: Các thành viên công cộng, có thể sử dụng ₫ược từ bên
ngoài
ƒ private: Các thành viên riêng, không thể truy nhập ₫ược từ bên
ngoài, ngay cả trong lớp dẫn xuất (sẽ ₫ề cập sau)
class Time {
private:
int hour,min,sec;
...
};
ƒ Mặc ₫ịnh, khi ₫ã khai báo class thì các thành viên là private.
ƒ protected: Các thành viên ₫ược bảo vệ, không thể truy nhập
₫ược từ bên ngoài, nhưng truy nhập ₫ược các lớp dẫn xuất (sẽ ₫ề
cập sau)
18
©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
5.6 Con trỏ ₫ối tượng
#include "mytime.h"
void main() {
Time t; // call constructor Time()
t.addHour(5);
Time *pt = &t; // pt is identical to this pointer
pt->addSec(70);
pt = new Time; // call constructor Time()
pt->addMin(25);
...
delete pt;
pt = new Time[5]; // call constructor 5 times
for (int i=0; i < 5; ++ i)
pt[i].addSec(10);
...
delete [] pt;
}
19
©
2
0
0
4
,
H
O
À
N
G
M
I
N
H
S
Ơ
N
Chương 5: Lớp và đối tượng © 2005 - HMS
Bài tập về nhà
ƒ Dựa trên cấu trúc Vector và các hàm liên quan ₫ã thực hiện
trong chương 4, hãy xây dựng lớp ₫ối tượng Vector với các hàm
thành viên cần thiết.
ƒ Khai báo một lớp thực hiện lưu trữ thông tin của một lớp sinh
viên gồm những thành phần thuộc tính như sau:
— Số hiệu sinh viên : Kiểu số nguyên
— Họ và tên: Chuỗi ký tự
— Năm sinh: Kiểu số nguyên
ƒ Khai báo và ₫ịnh nghĩa mở rộng lớp quản lý sinh viên bằng các
hàm thành viên thực hiện các chức năng như sau:
— Nhập họ tên sinh viên
— Nhập số hiệu sinh viên
— Nhập năm sinh
— Tìm và hiển thị thông tin sinh viên khi biết mã số

File đính kèm:

  • pdfC5_Classes&Objects.pdf
Tài liệu liên quan