Pplthdt c02 lop_doi_tuong_v13.09a
Transcript of Pplthdt c02 lop_doi_tuong_v13.09a
trueclass
cout
C++operator
catch
virtual throw
try
friend bool
cinnew
inline private OOP
deleteusing falseSTL
public
1
T h S . Đ ặ n g B ì n h P h ư ơ n gd b p h u o n g @ f i t . h c m u s . e d u . v n
VCBB© 13.09a
this
Bộ môn Công nghệ phần mềm
Khoa Công nghệ thông tin
Trường Đại học Khoa học Tự nhiên
PP LT HƯỚNG ĐỐI TƯỢNG
LỚP VÀ ĐỐI TƯỢNG
2
VC
BB
1 2 3 4 5 6 7
Nội dung
Lớp và đối tượng
Khái niệm lập trình hướng đối tượng
Khái niệm về lớp và đối tượng
Sự che giấu dữ liệu và phương thức
Tạo lập, sử dụng và hủy đối tượng
Một vài ví dụ minh họa
Ký hiệu UML
Sự tương đồng và khác nhau giữa C++, Java và C#
#include <iostream>using namespace std;
void main(){
cout << “Hello World”;cout << endl;
3
VC
BB
Khái niệm về lập trình hướng đối tượng1 2 3 4 5 6 7
LTr hướng thủ tục và hướng đối tượng
Lớp và đối tượng
Procedural Programming
vs.
Object-Oriented Programming
4
VC
BB
Khái niệm về lập trình hướng đối tượng1 2 3 4 5 6 7
3 đặc điểm chính
Sự đóng kín (encapsulation)
Mã và dữ liệu liên kết với nhau tạo thành một
đối tượng như một “hộp đen” độc lập.
Tính đa dạng (polymorphism)
Ý tưởng “một giao diện, nhiều phương pháp”
nhằm giảm tính phức tạp.
Tính kế thừa (inheritance)
Đối tượng kế thừa các tính chất tổng quát và
bổ sung thêm các tính chất riêng của nó.
Cho phép phân loại đối tượng theo thứ bậc.Lớp và đối tượng
5
VC
BB
Khái niệm về lập trình hướng đối tượng1 2 3 4 5 6 7
Thảo luận
Một số ví dụ về sự đóng kín, tính đa dạng và
tính kế thừa trong thực tế?
Lớp và đối tượng
6
VC
BB
Khái niệm về lớp và đối tượng1 2 3 4 5 6 7
Phân biệt lớp đối tượng và đối tượng
Lớp (class) hay còn gọi là lớp đối tượng được
dùng để mô hình hóa một nhóm các thực thể
(entity) hay đối tượng (object) cùng loại trong
thế giới thực.
Một đối tượng thuộc về một lớp là một thể hiện
(instance) hay một phần tử điển hình của lớp đó.
Các đối tượng thuộc về một lớp sẽ có cùng một
cách ứng xử (behaviour) được thiết lập nhờ vào
những phương thức (method) của lớp đó.
Lớp và đối tượng
7
VC
BB
Khái niệm về lớp và đối tượng1 2 3 4 5 6 7
Các thành phần chính của lớp
Tên lớp (class name): tên duy nhất để phân biệt
với các lớp khác trong cùng một phạm vi.
Thành phần dữ liệu (data member) hay các
thuộc tính (attribute): lưu dữ liệu cho mỗi đối
tượng của lớp đang mô tả hoặc tham chiếu đến
các đối tượng của lớp khác.
Hệ thống các phương thức của lớp (method hay
functional member): các hàm được viết riêng
cho các đối tượng của lớp nhằm tác động lên
chính các đối tượng thuộc lớp này.
Lớp và đối tượng
8
VC
BB
Khái niệm về lớp và đối tượng1 2 3 4 5 6 7
Ví dụ các thành phần của lớp đối tượng
Lớp CPoint2D (điểm trong không gian 2 chiều)
bao gồm các thành phần:
Các thuộc tính:
• Hoành độ và tung độ.
Các phương thức:
• Khởi tạo (init) hoành độ và tung độ của điểm.
• Di chuyển (move) điểm theo một độ dời cho trước.
• Nhân tỉ lệ (scale) hoành độ, tung độ của điểm với
các hệ số tỉ lệ cho trước.
• Tính khoảng cách (get distance) từ điểm tới một
điểm khác.Lớp và đối tượng
9
VC
BB
Khái niệm về lớp và đối tượng1 2 3 4 5 6 7
Khai báo và định nghĩa lớp
Cú pháp khai báo lớp
Cú pháp định nghĩa một phương thức của lớp
(sử dụng toán tử phân giải phạm vi ::)
Lớp và đối tượng
1234567
class class-name
{
private:
// Các thuộc tính và phương thức riêng của lớp
public:
// Các thuộc tính và phương thức chung của lớp
};
12
type-name class-name::method-name(param-list)
{ /* Các câu lệnh… */ }
10
VC
BB
Khái niệm về lớp và đối tượng1 2 3 4 5 6 7
Khai báo và định nghĩa lớp
Lưu ý, các thuộc tính và phương thức có thể
khai báo thành nhiều nhóm xem kẽ nhau và mặc
định là private (do đó nếu nằm trên cùng của
khai báo thì không cần ghi từ khóa private).
Lớp và đối tượng
123456789
class class-name {
// Các thuộc tính và phương thức riêng của lớp
public:
// Các thuộc tính và phương thức chung của lớp
private:
// Các thuộc tính và phương thức riêng khác của lớp
public:
// Các thuộc tính và phương thức chung khác của lớp
};
11
VC
BB
Khái niệm về lớp và đối tượng1 2 3 4 5 6 7
Khai báo và định nghĩa lớp
Có thể thực hiện bằng một trong hai cách sau:
Khai báo lớp và cài đặt lớp trong cùng một
tập tin mã nguồn .cpp (C++ source code).
Khai báo lớp trong tập tin tiêu đề .h (header)
nhằm mô tả giao tiếp lập trình (programming
interface) và cài đặt lớp trong tập tin mã
nguồn .cpp (nên sử dụng cách này).
Ví dụ:
Khai báo và định nghĩa lớp CPoint2D.
Lớp và đối tượng
12
VC
BB
Khái niệm về lớp và đối tượng1 2 3 4 5 6 7
Gộp chung khai báo và cài đặt lớp
Tập tin Point2D.cpp (phiên bản 1)
Lớp và đối tượng
12345678910111213
class CPoint2D
{
double m_dX, m_dY; // Mặc định là private
public:
void init(double dX, double dY)
{ m_dX = dX; m_dY = dY; }
void move(double dX, double dY)
{ m_dX += dX; m_dY += dY; }
void scale(double dX, double dY)
{ m_dX *= dX; m_dY *= dY; }
};
13
VC
BB
Khái niệm về lớp và đối tượng1 2 3 4 5 6 7
Tách rời khai báo và cài đặt lớp
Tập tin Point2D.h
Lớp và đối tượng
12345678910111213
#ifndef _POINT2D_H // Có thể đặt #pragma once ở đầu
#define _POINT2D_H // thay thế #ifndef #define #endif
class CPoint2D
{
double m_dX, m_dY; // Mặc định là private
public:
void init(double dX, double dY);
void move(double dX, double dY);
void scale(double dX, double dY);
};
#endif
14
VC
BB
Khái niệm về lớp và đối tượng1 2 3 4 5 6 7
Tách rời khai báo và cài đặt lớp
Tập tin Point2D.cpp (phiên bản 2)
Lớp và đối tượng
1234567891011121314
#include “Point2D.h”
void CPoint2D::init(double dX, double dY)
{
m_dX = dX; m_dY = dY;
}
void CPoint2D::move(double dX, double dY)
{
m_dX += dX; m_dY += dY;
}
void CPoint2D::scale(double dX, double dY)
{
m_dX *= dX; m_dY *= dY;
}
15
VC
BB
Khái niệm về lớp và đối tượng1 2 3 4 5 6 7
Con trỏ this
Khái niệm
Được truyền tự động cho các phương thức
thành viên của lớp khi được gọi và trỏ tới đối
tượng thực hiện lời gọi phương thức đó.
Ví dụ
Lớp và đối tượng
1234567
class CPoint2D
{
double dX, dY;
public:
void init(double dX, double dY)
{ this->dX = dX; this->dY = dY; }
}
16
VC
BB
Sự che giấu dữ liệu và phương thức1 2 3 4 5 6 7
Từ khóa private và public
Các thành phần dữ liệu và phương thức được
khai báo dưới từ khóa:
private (hoặc bỏ qua): được bảo
vệ, che giấu bên trong lớp và không
thể được truy xuất từ bên ngoài (chỉ
có thể truy xuất bên trong các đối
tượng cùng thuộc một lớp).
public: có thể được sử dụng từ
bên ngoài để tác động lên đối tượng
của lớp.
Lớp và đối tượng
17
VC
BB
Sự che giấu dữ liệu và phương thức1 2 3 4 5 6 7
Từ khóa private và public
Ví dụ
Lớp và đối tượng
1234567891011121314
class CVisibilityTest {
int m_nPriAttr;
void priMethod() { cout << “Private method” << endl; }
public:
int m_nPubAttr;
void pubMethod() { cout << “Private method” << endl; }
};
void main() {
CVisibilityTest visiTest; // Không () sau visiTest
visiTest.m_nPriAttr = 2912; // Lỗi!
visiTest.m_nPubAttr = 1706; // OK nhưng không nên!
visiTest.priMethod(); // Lỗi!
visiTest.pubMethod(); // OK
}
18
VC
BB
Sự che giấu dữ liệu và phương thức1 2 3 4 5 6 7
Từ khóa private và public
Ví dụ
Lớp và đối tượng
1234567891011121314
class CVisibilityPrivateTest {
int m_nPriAttr;
public:
void setPriAttr(int nValue)
{ m_nPriAttr = nValue; }
void doSomething(CVisibilityPrivateTest x)
{ cout << x.m_nPriAttr << endl; } // OK
};
void main() {
CVisibilityPrivateTest visiPriTestX, visiPriTestY;
visiPriTestX.m_nPriAttr = 2912; // Lỗi!
visiPriTestX.setPriAttr(2912); // OK
visiPriTestY.doSomething(visiPriTestX); // OK!
}
19
VC
BB
Tạo lập, sử dụng và hủy đối tượng1 2 3 4 5 6 7
Toán tử new và delete
Khái niệm
Toán tử new dùng để tạo lập một hay nhiều
(mảng) đối tượng mới một cách tường minh.
Toán tử delete dùng để hủy một hay nhiều
(mảng) đối tượng đã được tạo ra trước đó
(bằng new) khi không còn muốn dùng nữa.
Lớp và đối tượng
12345
ptr-var-name = new type(init-value); // Tạo 1 đối tượng
delete ptr-var-name; // Hủy 1 đối tượng
ptr-var-name = new type[size]; // Tạo mảng đối tượng
delete []ptr-var-name; // Hủy mảng đối tượng
20
VC
BB
Tạo lập, sử dụng và hủy đối tượng1 2 3 4 5 6 7
Toán tử new và delete
Ví dụ
Lớp và đối tượng
1234567891011121314
void main()
{
CPoint2D* pPt2D = NULL; // Gán NULL khi chưa tạo lập
pPt2D = new CPoint2D(); // Tạo lập đối tượng
if (pPt2D != NULL) // Kiểm tra trước khi sử dụng
{ /* … */ } // Sử dụng đối tượng ở đây
if (pPt2D != NULL) // Kiểm tra trước khi hủy
{
delete pPt2D; // Hủy đối tượng
pPt2D = NULL; // Gán NULL sau khi hủy
}
}
21
VC
BB
Tạo lập, sử dụng và hủy đối tượng1 2 3 4 5 6 7
Toán tử new và delete
Ưu điểm của toán tử new và delete so với hàm
malloc() và free() (trong malloc.h hoặc
stdlib.h)
Không cần phải sử dụng toán tử sizeof để
xác định kích thước 1 phần tử khi cấp phát.
Toán tử new thực hiện chuyển đổi kiểu tự
động nên không cần ép kiểu con trỏ trả về.
Không cần phải khai báo thư viện (#include)
do nó là toán tử chứ không phải là hàm.
Có thể được nạp chồng (overloading).
Lớp và đối tượng
22
VC
BB
Một vài ví dụ minh họa1 2 3 4 5 6 7
Cài đặt lớp hình tròn
Lớp CCircle bao gồm:
Các thuộc tính:
• Tâm: m_pt2DCenter kiểu CPoint2D.
• Bán kính: m_dRadius kiểu double.
Các phương thức:
• init(dX, dY, dRadius): khởi tạo hình tròn với
tọa độ tâm (dX, dY) và bán kính cho trước.
• move(dX, dY): di chuyển hình tròn đang xét theo
một độ dời (dX, dY).
• getPerimeter(): tính chu vi hình tròn đang xét.
• getArea(): tính diện tích hình tròn đang xét.Lớp và đối tượng
23
VC
BB
Một vài ví dụ minh họa1 2 3 4 5 6 7
Cài đặt lớp hình chữ nhật
Lớp CRectangle bao gồm:
Các thuộc tính:
• Tọa độ trái trên: m_pt2DTopLeft kiểu CPoint2D.
• Chiều dài, rộng: m_dLength, m_dWidth kiểu double.
Các phương thức:
• init(pt2DTopLeft, dLength, dWidth): khởi
tạo các cạnh hình chữ nhật với độ dài cho trước.
• move(dX, dY): di chuyển hình tròn đang xét theo
một độ dời (dX, dY).
• getPerimeter(): tính chu hình chữ nhật đang xét.
• getArea(): tính diện tích hình chữ nhật đang xét.Lớp và đối tượng
24
VC
BB
Một vài ví dụ minh họa1 2 3 4 5 6 7
Cài đặt lớp hình tam giác
Lớp CTriangle bao gồm:
Các thuộc tính:
• Tọa độ 3 đỉnh: m_aPt2D là mảng gồm 3 đối tượng
thuộc lớp CPoint2D.
Các phương thức:
• isValid(): kiểm tra tam giác có hợp lệ không (chỉ
sử dụng bên trong lớp)
• init(aPt2D): khởi tạo tam giác theo 3 điểm cho
trước trong mảng aPt2D.
• getPerimeter(): tính chu vi tam giác.
• getArea(): tính diện tích tam giác.
Lớp và đối tượng
25
VC
BB
Một vài ví dụ minh họa1 2 3 4 5 6 7
Cài đặt lớp xúc sắc (6 mặt)
Lớp CDice bao gồm:
Các thuộc tính:
• Thông tin các mặt: m_aszInfo là mảng gồm 6
chuỗi ký tự thể hiện thông tin mỗi mặt.
Các phương thức:
• init(aszInfo): khởi tạo thông tin cho các mặt
của xúc sắc.
• roll(): gieo xúc xắc và trả về thông tin mặt ngửa
(mặt nhận được).
Lớp và đối tượng
26
VC
BB
Ký hiệu UML1 2 3 4 5 6 7
Ký hiệu lớp đối tượng và đối tượng
Ngôn ngữ UML (Unified Modeling Language) là
một hệ thống ký hiệu được dùng cho việc mô tả
hay mô hình hóa các đối tượng trong những
chương trình được viết bằng các ngôn ngữ lập
trình hướng đối tượng.
Lưu ý, tên lớp/thuộc tính/phương thức ở đây
không nhất thiết phải trùng tên khi cài đặt.
Lớp và đối tượng
Ký hiệu lớp Ký hiệu đối tượng
class-name
attributes
methods
:class-name
attributes
methods
27
VC
BB
Ký hiệu UML1 2 3 4 5 6 7
Ký hiệu thuộc tính và phương thức
Dùng dấu - đặt trước thuộc tính hay phương
thức private.
Dùng dấu + đặt trước thuộc tính hay phương
thức public.
Lớp và đối tượng
CPoint2D
- m_dX: double
- m_dY: double
+ init(dX: double, dY: double)
+ move(dX: double, dY: double)
+ scale(dX: double, dY: double)
+ getDistance(point2D: CPoint2D): double
28
VC
BB
Sự tương đồng và khác nhau giữa C++, Java và C#1 2 3 4 5 6 7
Đọc thêm [OOP] trang 41-49
Tổ chức các tập tin và khai báo lớp.
Truy xuất các thuộc tính và phương thức.
Khởi tạo hằng số và giá trị các thuộc tính.
Chương trình chính.
Việc tạo lập và hủy đối tượng.
Lớp và đối tượng
29
VC
BB
1 2 3 4 5 6 7
Một số thuật ngữ
attribute: thuộc tính hay trường dữ liệu (data member).
behaviour: ứng xử (của đối tượng).
class declaration: khai báo lớp.
class implementation: cài đặt lớp.
class name: tên lớp.
class: lớp.
data member: trường dữ liệu.
encapsulation: khái niệm về sự bao bọc.
environment variables: biến hay tham số môi trường.
inheritance: tính kế thừa.
instance/object: thể hiện/đối tượng của lớp.
method: phương thức.
polymorphism: tính đa dạng.
programming interface: giao tiếp lập trình.
Unified Modeling Language: ngôn ngữ mô hình hóa thống nhất.
Lớp và đối tượng
30
VC
BB
1 2 3 4 5 6 7
Tài liệu tham khảo
[OOP] Chương 1 – Lớp và đối tượng
(trang 16-50)
[Primer] Chapter 10 – Objects and Classes
Procedural and Object-Oriented Programming
(trang 446-447)
Abstraction and Classes (trang 446-463)
Lớp và đối tượng
31
VC
BB
1 2 3 4 5 6 7
Bài tập 2.1
Bổ sung các phương thức lấy (get) và gán (set)
giá trị cho các thuộc tính thành viên của các lớp
đã cài đặt:
Lớp CPoint2D.
Lớp CCircle.
Lớp CRectangle.
Lớp CTriangle.
Lớp CDice.
Lớp và đối tượng
32
VC
BB
1 2 3 4 5 6 7
Bài tập 2.2
Bổ sung vào lớp CCircle đã cài đặt một số
phương thức để kiểm tra hình tròn đang xét có
mối quan hệ gì với hình tròn cir cho trước:
isInside(cir): nằm trong hình tròn cir?
isOverlap(cir): trùng nhau?
isBoundary(cir): chứa hình tròn cir?
isIntersection(cir): giao nhau?
isContact(cir): tiếp xúc nhau?
isOutside(cir): nằm bên ngoài?
Lớp và đối tượng
33
VC
BB
1 2 3 4 5 6 7
Bài tập 2.3 & 2.4
Xây dựng lớp phát sinh số ngẫu nhiên (CRand)
cho phép thực hiện:
Khởi tạo hạt giống (từ thời gian).
Phát sinh số nguyên trong khoảng [0, 𝑛) (𝑛 là
số nguyên dương cho trước).
Phát sinh số nguyên trong đoạn [𝑎, 𝑏] (𝑎, 𝑏 là
số nguyên cho trước)
Phát sinh số thực trong đoạn [0, 1].
Sửa lại lớp CDice sử dụng lớp CRand đã cài đặt
trong việc phát sinh ngẫu nhiên.
Lớp và đối tượng
34
VC
BB
1 2 3 4 5 6 7
Bài tập 2.5
Xây dựng lớp bầu cua (CDiceGame) cho phép
gieo một lúc 3 xúc xắc và trả về số tiền nhận
được ứng với số tiền và mặt đã cho trước, biết:
Thông tin các mặt: cá (fish), tôm (prawn), cua
(crab), gà (rooster), bầu (squash), nai (stag).
Số tiền nhận được bằng số tiền đặt trước
nhân với với số mặt trùng của xúc xắc với
mặt đặt trước.
Ví dụ: đặt 3$ cho cua
thắng 3$ x 2 = 6$
Lớp và đối tượng
35
VC
BB
1 2 3 4 5 6 7
Bài tập 2.6
Xây dựng lớp phân số (CFraction) cho phép
thực hiện:
Nhập (input), xuất (output), khởi tạo (init).
Lấy/Gán (get/set) giá trị tử số (numerator),
mẫu số (denominator).
Nghịch đảo (inverse), rút gọn (reduce).
Cộng (add), trừ (subtract), nhân (multiply),
chia (divide) và so sánh (equal to, not equal
to, greater/less than, greater/less than or
equal to) với phân số hoặc với số nguyên.
Lớp và đối tượng
36
VC
BB
1 2 3 4 5 6 7
Bài tập 2.7
Xây dựng lớp đơn thức (CMonomial) cho phép
thực hiện:
Nhập, xuất, khởi tạo.
Lấy/Gán giá trị hệ số (coefficient), số mũ
(exponent).
Tính giá trị (value), đạo hàm (derivative),
nguyên hàm (primitive).
Cộng, trừ, nhân, chia và so sánh với đơn thức
khác cùng bậc.
Lớp và đối tượng
37
VC
BB
1 2 3 4 5 6 7
Bài tập 2.8
Xây dựng lớp sinh viên (CStudent) gồm họ tên,
điểm văn, điểm toán và cho phép thực hiện:
Nhập, xuất, khởi tạo.
Lấy/Gán giá trị họ tên (full name), điểm văn
(literature), điểm toán (math).
Tính điểm trung bình (average score).
Xếp loại theo tiêu chí tiêu chí sau:
Lớp và đối tượng
Yếu
(poor)
Trung bình
(fair)
Khá
(good)
Giỏi
(excellent)
Xuất sắc
(out standing)
< 5.0 ≥ 5.0 ≥ 6.5 ≥ 8.0 ≥ 9.0
38
VC
BB
1 2 3 4 5 6 7
Bài tập 2.9
Xây dựng lớp mảng tĩnh (CStaticArray) tối đa
100 phần tử và cho phép thực hiện:
Nhập, xuất, khởi tạo (cho tất cả phần tử bằng
giá trị nào đó).
Lấy kích thước (size).
Lấy/Gán giá trị phần tử tại vị trí nào đó.
Tìm phần tử (find) nào đó.
Tìm phần tử có giá trị lớn nhất, nhỏ nhất.
Sắp xếp (sort) tăng dần (ascending), giảm
dần (descending).Lớp và đối tượng
39
VC
BB
1 2 3 4 5 6 7
Bài tập 2.10
Xây dựng lớp ngày (CDate) cho phép thực hiện:
Nhập, xuất, khởi tạo.
Kiểm tra hợp lệ, năm nhuận (leap year).
Lấy/Gán giá trị của ngày, tháng, năm.
Lấy số ngày trong tháng.
Tìm thứ tự ngày trong năm và cách 1/1/1.
Tìm ngày hôm trước, ngày hôm sau.
Tính khoảng cách với một ngày khác.
So sánh thứ tự trước sau với một ngày khác.
Lớp và đối tượng