Microsoft PowerPoint LapTrinh1 26 3 XOAved Autosaved pptx KỸ THUẬT LẬP TRÌNH Chương 6 Lập trình hướng đối tượng 277 Lập trình hướng đối tượng C++ 278 Tổng quan 279 Lập trình cấu trúc • Lập trình cấu trúc (1960s) – Phân chia vấn đề lớn thành các vấn đề con độc lập, từ đó tạo thành thủ tục và hàm – Trọng tâm của lập trình truyền thống dựa trên các chi tiết của việc thực hiện – Phương pháp viết chương trình chặt chẽ – Rõ ràng, dễ thử nghiệm và sửa lỗi, dễ thay đổi – Khi chương trình lớn hơn kh.
Trang 1KỸ THUẬT LẬP TRÌNH
Chương 6 Lập trình hướng
đối tượng
Trang 2Lập trình hướng đối tượng
C++
Trang 3Tổng quan
Trang 4– Phương pháp viết chương trình chặt chẽ
– Rõ ràng, dễ thử nghiệm và sửa lỗi, dễ thay đổi
– Khi chương trình lớn hơn khó quản lý
– Dữ liệu đóng vai trò quan trọng
• Khi thêm 1 dữ liệu kiểu mới, phải thay đổi tất cả các công việc
và các hàm liên quan đến dữ liệu đó
Trang 7(1) Lập trình tuyến tính: Đặc điểm
• Chương trình đơn giản, số dòng lệnh ít
• Thực hiện trình tự từ đầu đến cuối
• Không có cấu trúc
• Dùng các lệnh “goto/ gosub” để nhảy đến một
vị trí nào đó trong chương trình
Trang 9(2) Lập trình có cấu trúc
• Khái niệm trừu tượng hóa (abstraction) theo
tiết bên trong
• Phân chia công việc thành các chức năng đơn
giản hơn gọi là lập trình đơn thể (module)
Trang 10(2) Lập trình có cấu trúc: Đặc điểm
Ưu điểm
• Đơn giản hóa quá trình thiết kế và cài đặt
• Dễ đọc chương trình, hiểu chi tiết bài toán
• Các chương trình con tương đối độc lập, dễ
phân công cho từng nhóm
Trang 12(2) Lập trình có cấu trúc: Đặc điểm
Khuyết điểm
• Sai sót trong việc trao đổi thông tin giữa các
thành viên trong nhóm có thể mất nhiều thời gian để sửa chữa chương trình
• Phần xử lý nằm rải rác và phải hiểu rõ cấu
trúc dữ liệu
Trang 13(3) Lập trình Hướng đối tượng
Trang 14Mục tiêu
• Loại bỏ những thiếu sót của tiếp cận theo thủ tục
• Tiếp cận theo hướng trừu tượng hoá (abstraction)
• Dữ liệu được xem là phần trung tâm và được bảo vệ
• Hàm gắn kết với dữ liệu
(3) Lập trình Hướng đối tượng
(Object-oriented Programming)
Trang 15Mục tiêu
• Phân tách bài toán thành nhiều đối tượng và yêu cầu chúng thực hiện hành động của mình
• Tăng cường khả năng sử dụng lại
(3) Lập trình Hướng đối tượng (Object-oriented Programming)
Trang 16Ưu điểm
• Cung cấp một cấu trúc module rõ ràng: Giao diện định nghĩa rõ ràng và chi tiết cài đặt ẩn
• Duy trì và sửa đổi mã nguồn dễ dàng
• Cung cấp framework tốt với các thư viện mã nguồn
(3) Lập trình Hướng đối tượng (Object-oriented Programming)
Trang 17• Object oriented programming (OOP)
– Chia bài toán thành các nhóm nhỏ có liên hệ với nhau gọi là đối tượng.
Lập trình hướng đối tượng
Trang 18Đối Tượng (Object)
hướng đối tượng,
mọi thứ đều là đối
tượng
Trang 19Accounts
What is the salary of Jack?
Jack's salary
is $2000
– Hộp đen chứa các lệnh (code) và dữ liệu.
– Thông tin truyền giữa các phần khác nhau gọi là các
thông điệp giữa các đối tượng
– Các thông điệp này
có thể được chuyển thành lời gọi hàm
trong chương trình.
Đối tượng (Object)
Trang 20Một đối tượng cụ thể
Trang 21Đối Tượng Thế Giới Thực
Trang 22Đối Tượng Phần Mềm
(Software Object)
• Các đối tượng phần mềm có thể được
dùng để biểu diễn các đối tượng thế giới
Trang 23Lớp (Class)
• Nhóm các đối tượng có cùng thuộc tính (hay còn gọi là trạng thái, hoặc Dữ liệu thành viên), hành vi (Hàm thành viên) và mối quan hệ chung.
• Lớp là viết tắt của “lớp của đối tượng”.
• Một lớp là một thiết kế (blueprint) hay mẫu (prototype) cho các đối tượng cùng kiểu
– Ví dụ: lớp XeDap là một thiết kế chung cho nhiều đối tượng xe đạp được tạo ra
• Một đối tượng là một thể hiện (instance) cụ thể của một lớp.
– Ví dụ: mỗi đối tượng xe đạp là một thể hiện của lớp XeDap
• Mỗi thể hiện có thể có những thuộc tính thể hiện khác
nhau
– Ví dụ: một cây mai có hoa 6 cánh, trong khi một cây khác có hoa
Trang 24Số cạnh Màu viền Màu nền
Phương thức (methode):
Vẽ Xóa Đối tượng đa giác
Trang 25Thuộc Tính Lớp
& Phương Thức Lớp
đối tượng hoặc thực thể được biểu diễn trong một lớp
• Thuộc tính lớp được định nghĩa bên trong định nghĩa lớp
và được chia sẻ bởi tất cả các thể hiện của lớp.
– Ví dụ: Lớp đa giác gồm các thuộc tính như: số cạnh, màu viền, màu chữ…
động) yêu cầu của đối tượng hoặc thực thể được biểu diễn trong một lớp
• Tất cả các phương thức lớp ảnh hưởng đến toàn bộ lớp chứ không ảnh hưởng đến một lớp riêng rẽ nào.
– Ví dụ: Lớp đa giác gồm các phương thức như: vẽ, xóa, di chuyển…
Trang 26Thuộc tính (Attribute) và Phương
Trang 27Thông Điệp
& Truyền Thông Điệp
một hoạt động Gồm có:
– Đối tượng nhận thông điệp
– Tên của phương thức thực hiện
– Các tham số mà phương thức cần
gọi một hay nhiều phương thức của đối tượng khác để yêu cầu thông tin.
Trang 28Đặc Điểm Quan Trọng
• Nhấn mạnh trên dữ liệu hơn là thủ tục
• Các chương trình được chia thành các đối tượng
• Dữ liệu được che giấu và không thể được truy xuất từ các hàm bên ngoài
• Các đối tượng có thể giao tiếp với nhau
thông qua các hàm
• Dữ liệu hay các hàm mới có thể được
thêm vào khi cần
Trang 29Thuận Lợi
• So với các tiếp cận cổ điển thì OOP có
những thuận lợi sau:
– OOP cung cấp một cấu trúc module rõ ràng
• Giao diện được định nghĩa tốt
• Những chi tiết cài đặt được ẩn – OOP giúp lập trình viên duy trì mã và sửa đổi mã tồn tại dễ dàng (các đối tượng được tạo ra với những
khác nhau nhỏ so với những đối tượng tồn tại).
– OOP cung cấp một cơ chế tốt với các thư viện mã mà các thành phần có thể được chọn và sửa đổi bởi lập trình viên
Trang 30Trừu Tượng Hóa
(Abstraction)
• Trừu tượng hóa
– Tiến trình xem xét các khía cạnh nào đó của bài toán.
– Biểu diễn những đặc tính, bỏ qua những chi tiết vụn vặt hoặc những giải thích
• Các kỹ thuật trừu tượng
– Đóng gói (encapsulation)
– Ẩn thông tin (information hiding)
– Thừa kế (inheritance)
Trang 31Tính đóng gói (Encapsulation)
– Cho phép truy cập đối tượng chỉ qua thông điệp của nó trong khi giữ kín các chi tiết riêng
tư gọi là ẩn thông tin.
– Là tiến trình che giấu việc thực thi chi tiết của một đối tượng.
Trang 32Ẩn thông tin (Information Hiding)
• Đóng gói Thuộc tính được lưu trữ
hay phương thức được cài đặt như thế nào được che giấu đi từ các đối
tượng khác
Việc che giấu những chi tiết thiết kế và cài đặt từ những đối tượng khác được gọi là ẩn thông tin
Trang 33Tính Thừa Kế (Inheritance)
• Hệ thống hướng đối tượng cho phép các lớp được định nghĩa kế thừa từ các lớp
khác
– Ví dụ, lớp xe đạp leo núi và xe đạp đua là
những lớp con (subclass) của lớp xe đạp
thuộc tính được định nghĩa trong một lớp
có thể được thừa kế hoặc được sử dụng lại bởi lớp khác.
Trang 34Tính Đa Hình (Polymorphism)
Trang 35Chương trình học
• Chương 1 Tổng quan
• Chương 2 Biến, biểu thức và toán tử
• Chương 3 Cấu trúc điều khiển
Trang 36KỸ THUẬT LẬP TRÌNH
Chương 7 Lớp
Trang 37Khái niệm lớp
• Lớp: khái niệm trung tâm của OOP
• Định nghĩa: Lớp là nhóm của những đối
tượng (objects) có cùng chung thuộc tính (properties) và có những mối quan hệ
chung
• Đối tượng: thể hiện một thực thể trong thế giới thực.
Trang 38Cú pháp khai báo lớp
class < Ten lop >
{ private : < Khai bao cac
thanh phan private >
public : < Khai bao cac
thanh phan public >
protected : < Khai bao
cac thanh phan protected >
};
class Xedap { };
Trang 39Sử dụng lớp đối tượng
• <Tên lớp> <Tên biến lớp>;
• Tên lớp: là tên lớp đối tượng đã được định nghĩa trước khi khai báo biến.
• Tên biến lớp: là tên đối tượng cụ thể Tên biến lớp sẽ được
sử dụng như các biến thông thường trong C++, ngoại trừ
việc nó có kiểu lớp đối tượng.
Xedap xedap ; // đúng, nhưng khai báo:
class Xedap xedap ; ; // Lỗi cú pháp là sai cú pháp
Trang 40Các thành phần của lớp
• Thuộc tính của lớp (Dữ liệu thành viên)
<Kiểu dữ liệu> <Tên thuộc tính>;
Các thành phần chỉ dữ liệu của lớp, được gọi
là thuộc tính của lớp
class Xedap
{ private : int tocdo ;
public : string nhanhieu ;
};
Trang 41Các thành phần của lớp
<Kiểu trả về> <Tên phương thức>([<Các
Trang 42Khái niệm lớp
• Lớp: kiểu dữ liệu trừu tượng.
TÊN LỚP
Dữ liệu thành viên
Hàm thành viên
{ < Quyền truy xuất > :
Trang 43Quyền truy xuất
• Các thành viên lớp được liệt kê vào một trong ba loại quyền truy
xuất khác nhau:
• Các thành viên (hàm thành viên và dữ liệu thành viên) có quyền truy cập là chung: (public) có thể được truy xuất bởi tất cả các
thành phần sử dụng lớp.
• Các thành viên riêng (hàm thành viên và dữ liệu thành viên) có
quyền truy cập là riêng: (private) chỉ có thể được truy xuất bởi các thành viên lớp.
• Các thành viên hàm thành viên và dữ liệu thành viên) có quyền truy cập là chung: được bảo vệ (protected) chỉ có thể được truy
xuất bởi các thành viên lớp và các thành viên của một lớp dẫn xuất
Trang 44void OffsetPt (int, int);
void main() {Point pt;
Tạo ra đối tượng thuộc lớp Point
Trang 45void OffsetPt (int, int);
yVal += y;
}
void main() {Point pt;
Tạo ra đối tượng thuộc lớp Point
Đối tượng
Trang 46void OffsetPt (int, int);
void main() {Point pt;
Tạo ra đối tượng thuộc lớp Point
Trang 47void OffsetPt (int, int);
yVal += y;
}
void main() { Point pt;
pt.SetPt(10,20);
Gọi hàm trên đối tượng
Tạo ra đối tượng thuộc lớp Point
Trang 48void OffsetPt (int, int);
void main() {Point pt;
Tạo ra đối tượng thuộc lớp Point
Trang 49Cơ bản về lớp
• Lớp gồm các thành viên:
– Dữ liệu thành viên (Member Data):
• Có cú pháp của định nghĩa biến
• Một đặc trưng của đối tượng
• Có thể là kiểu đã được định nghĩa hoặc tự định nghĩa
• Dữ liệu thành viên của lớp không thể có kiểu của lớp đó, nhưng có thể là con trỏ kiểu lớp đó.
– Hàm thành viên (Member Function) hay phương thức (Method)
• Có cú pháp của khai báo hàm
• Chỉ định các thao tác của lớp
• Một hoạt động, hành vi của đối tượng
Trang 50Cơ bản về lớp
• Đối tượng của lớp
– Đối tượng là một thể hiện cụ thể của một lớp
– Đối tượng được khai báo sau định nghĩa lớp
• Khai báo đối tượng hoặc mảng, con trỏ, tham chiếu đến đối tượng
Trang 51Cơ bản về lớp
Trang 52Cơ bản về lớp
• Dữ liệu thành viên:
– Nên được khai báo với từ khoá private.
– Không được khởi tạo giá trị của dữ liệu thành phần trong định nghĩa lớp.
class Employee // khai báo tên lớp
{
private: // từ khóa cho biết không thể truy nhập từ ngoài lớp
unsigned int EmpID =1; // sai
char EmpName[30];
float EmpSalary;
public: // từ khóa cho biết có thể truy nhập từ ngoài lớp
void AddEmployee();
Trang 53Kiểutrảvề Tênlớp::Tênhàmthànhviên( ) { …
}
– Không phụ thuộc vào hàm public hay private
• Các hàm thành viên định nghĩa bên trong lớp
– Không cần toán tử :: và tên lớp
– Trình biên dịch sẽ cố thực hiện inline
• Ở ngoài lớp, ta chỉ định inline với từ khoá inline
Trang 54Ví dụ
• Viết chương trình nhập từ bàn phím chiều
dài và chiều rộng của một hình chữ nhật
và hiển thị diện tích và chu vi ra màn hình
• Phương pháp lập trình hướng đối tượng là
phương pháp giải quyết các bài toán lập
trình thông qua các đối tượng, do đó bài
này bạn cần tạo ra một đối tượng thuộc
lớp Rectangle (hình chữ nhật) giống như
sau:
Trang 55Ví dụ
Trong đó:
•length và width là hai thuộc tính (Dữ liệu thành
viên) chỉ chiều dài và chiều rộng của hình
chữ nhật.
•getInformation() là phương thức nhập dữ liệu
(Hàm thành viên) cho thuộc
tính length và width từ bàn phím.
•display() là phương thức dùng để hiển thị thông
tin về chu vi và diện tích của hình chữ nhật ra
màn hình.
•getArea() và getPerimeter() là hai phương thức trả
về diện tích và chu vi của hình chữ nhật, hai
phương thức này được dùng trong phương
thức display().
Trang 56{ return width * length;
} double getPerimeter()
{ return (width + length)
void display() { cout << "Area: " << getArea()
<< endl;
cout << "Perimeter: " <<
getPerimeter() << endl; } };
int main() {
Rectangle r1;
r1.getInformation();
r1.display();
return 0; }
Trang 57Điền chỗ thiếu vào các ô trống
Trang 59Hàm inline
• Hàm không phải thành viên:
– Dùng từ khóa inline trong khai báo hàm và dòng đầu định nghĩa
Trang 60Hàm thành viên nội tuyến
void OffsetPt (int, int);
xVal = x;
yVal = y;
} void OffsetPt (int x, int y) {
xVal += x;
Cách 2:
Định nghĩa bên trong lớp
Trang 61– public
• Bất kỳ hàm nào trong chương trình xử lý đối tượng đó cũng
có thể truy cập được (có thể được truy xuất bởi tất cả các thành phần sử dụng lớp)
– protected
• Sẽ được học sau Hiện tại giống với private
• Dữ liệu mặc định là private để đảm bảo giấu kín
• Hàm mặc định là public để có thể dùng mọi nơi
Trang 62Các hàm truy cập và các hàm hữu dụng
Trang 63Sự đóng gói (encapsulation)
• Sự truy xuất đến đối tượng thông qua các thông điệp
(message) mà vẫn giữ các thuộc tính private dưới
dạng thông tin ẩn
• Làm cho việc truy xuất đến dữ liệu của các lớp từ bên ngoài lớp bị giới hạn, trở nên không cần thiết hoặc
không thể thực hiện được
• Người dùng không cần quan tâm đến cấu trúc và hoạt động bên trong của lớp, chỉ quan tâm giải quyết vấn đề lớn hơn
• Mục tiêu:
– tạo bức tường không thể thâm nhập được để bảo vệ, tránh
những hư hại vô tình hoặc cố ý do những lỗi chúng ta mắc phải – Dễ dàng cô lập lỗi dễ dàng tìm kiếm và sữa chữa
Trang 64Hàm tạo (Constructor)
• Dùng để định nghĩa và khởi tạo đối tượng cùng 1 lúc.
• (1) Có tên trùng với tên lớp,
• (2) Không cần khai báo kiểu cho hàm tạo
• (3) Không có kiểu trả về.
• Không gọi trực tiếp, sẽ được tự động gọi khi khởi tạo đt.
• Gán giá trị, cấp vùng nhớ cho các dữ liệu thành viên.
class Point {
int xVal, yVal;
public: Point (int x, int y) {
xVal = x; yVal = y;
} void OffsetPt (int x, int y) {
xVal += x; yVal += y;
}
void main() { Point pt1(10,20);
Trang 65Định nghĩa lớp Set
Trang 66Định nghĩa lớp Set
Trang 67Point (float len, float angle) {
xVal = (int) (len * cos(angle));
yVal = (int) (len * sin(angle));
Set s2(20);
Set s3(1000); …}
Mềm dẻo hơn
Không cần phải nhớ gọi hàm EmptySet() khi khởi tạo
Trang 68Point (float len, float angle) {
xVal = (int) (len * cos(angle));
yVal = (int) (len * sin(angle));
Set s2(20);
Set s3(1000); …
Mềm dẻo hơn
Không cần phải nhớ gọi hàm EmptySet()
Trang 69Point (float len, float angle) {
xVal = (int) (len * cos(angle));
yVal = (int) (len * sin(angle));
Set s2(20);
Set s3(1000); …}
Mềm dẻo hơn
Không cần phải nhớ gọi hàm EmptySet() khi khởi tạo
Trang 70Hàm tạo
• Hàm tạo sao chép khởi tạo đối tượng dựa trên một đối tượng khác thuộc cùng lớp.
• Mỗi lớp có một hàm tạo sao chép mặc định – hàm này
có một tham số là đối tượng cùng lớp.
• Ta có thể định nghĩa lại hàm tạo sao chép.
Trang 71Hàm hủy
• Giải phóng 1 đối tượng trước khi nó được thu hồi.
• Cú pháp: Có tên trùng với tên lớp, có dấu ~ phía trước
Set(const int size) { …… }
~Set() { delete[] elems; }
s2 = TestFunct1(s1);
}
Tổng cộng
có bao nhiêu lần
hàm hủy được gọi ?
4
Trang 72Set(const int size) { …… }
~Set() { delete[] elems; }
s2 = TestFunct1(s1);
}
Tổng cộng
có bao nhiêu lần
hàm hủy được gọi ?
Trang 73Hàm tạo và hàm hủy mặc định
• Hàm tạo mặc định:
– Thường tạo hàm tạo và hàm hủy khi lớp có thành phần cấp phát động
– Nếu lớp không có hàm tạo thì trình biên dịch
sẽ cung cấp 1 hàm tạo mặc định không đối Hàm này chỉ cấp phát bộ nhớ, không khởi tạo
Trang 74Point (int x = 0, int y = 0);
Point (float x=0, float y=0, int i=0);
//
};
void main() {Point p2(1.6, 5.0); // như là ???
Point p3(10,20, 10); // như là ???Point p4; // ?????
Tối nghĩa
Mơ hồ
Trang 75Cho biết kết quả?
class Point {
int xVal, yVal;
public : Point( int x = 0, int y = 0){
xVal = x ; yVal = y ; }
pt.Print();
}
Đáp án (5,0)
Trang 76Point (int x = 0, int y = 0);
Point (float x=0, float y=0, int i=0);//
};
void main() {Point p2(1.6, 5.0); // như là ???
Point p3(10,20, 10); // như là ???Point p4; // ?????
Tối nghĩa
Mơ hồ
Trang 77• Có những trường hợp sử dụng *this là dư thừa (Ví dụ trên)
• Tuy nhiên, có những trường hợp phải sử dụng con trỏ *this
Trang 79Sử dụng con trỏ this
• Các lời gọi hàm thành phần liên tiếp
– Nhiều hàm được gọi trong cùng 1 lệnh
– Hàm trả về 1 tham chiếu đến cùng đối tượng đó
{ return *this; }
– Các hàm khác hoạt động trên con trỏ này
– Hàm không trả về tham chiếu phải được gọi sau cùng