1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng môn học Lập trình hướng đối tượng - Chương 2: Đối tượng và lớp

120 16 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 120
Dung lượng 0,95 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng Lập trình hướng đối tượng - Chương 2 trang bị cho người học những kiến về đối tượng và lớp. Các nội dung chính trong chương này gồm có: Đối tượng và lớp, cài đặt lớp trong C++, thiết lập và huỷ bỏ đối tượng, giao diện và chi tiết cài đặt, các nguyên tắc xây dựng lớp, một số ví dụ về lớp. Mời các bạn cùng tham khảo.

Trang 1

Lập Trình Hướng Đối Tượng

45 LT+30TH

Trang 2

Chương 2

Chương 2 –– Đối tượng và Lớp Đối tượng và Lớp

1 Đối tượng và lớp

2 Cài đặt lớp trong C++

3 Thiết lập và huỷ bỏ đối tượng

4 Giao diện và chi tiết cài đặt

5 Các nguyên tắc xây dựng lớp

6 Một số ví dụ về lớp

Trang 3

2.1 Đối tượng và lớp

 Ta định nghĩa một đối tượng là một "cái gì đó" có ý

nghĩa cho vấn đề ta quan tâm Đối tượng phục vụ hai mục đích: Giúp hiểu rõ thế giới thực và cung cấp cơ sở cho việc cài đặt trong máy

 Mỗi đối tượng có một nét nhận dạng để phân biệt nó với các đối tượng khác Nét nhận dạng mang ý nghĩa các đối tượng được phân biệt với nhau do sự tồn tại vốn

các đối tượng được phân biệt với nhau do sự tồn tại vốn có của chúng chứ không phải các tính chất mà chúng có

Trang 4

Đối tượng và lớp

 Các đối tượng có các đặc tính tương tự nhau được gom chung lại thành lớp đối tượng Ví dụ Người là một lớp đối tượng Một lớp đối tượng được đặc trưng bằng các thuộc tính, và các hoạt động (hành vi)

 Một thuộc tính (attribute) là một giá trị dữ liệu cho mỗi đối tượng trong lớp Tên, Tuổi, Cân nặng là các thuộc tính của Người

tính của Người

 Một thao tác (operation) là một hàm hay một phép biến đổi có thể áp dụng vào hay áp dụng bởi các đối tượng trong lớp

Trang 5

Đối tượng và lớp

 Cùng một thao tác có thể được áp dụng cho nhiều lớp đối tượng khác nhau, một thao tác như vậy được gọi là có tính đa dạng (polymorphism)

 Mỗi thao tác trên mỗi lớp đối tượng cụ thể tương ứng với một cài đặt cụ thể khác nhau Một cài đặt như vậy được gọi là một phương thức (method)

 Một đối tượng cụ thể thuộc một lớp được gọi là một thể hiện (instance) của lớp đó Joe Smith, 25 tuổi, nặng

 Một đối tượng cụ thể thuộc một lớp được gọi là một thể hiện (instance) của lớp đó Joe Smith, 25 tuổi, nặng

58kg, là một thể hiện của lớp người

Trang 6

Sơ đồ đối tượng

 Ta dùng sơ đồ đối tượng để mô tả các lớp đối tượng Sơ đồ đối tượng bao gồm sơ đồ lớp và sơ đồ thể hiện

 Sơ đồ lớp mô tả các lớp đối tượng trong hệ thống, một lớp đối tượng được diễn tả bằng một hình chữ nhật có 3 phần: phần đầu chỉ tên lớp, phần thứ hai mô tả các

thuộc tính và phần thứ ba mô tả các thao tác của các đối tượng trong lớp đó

đối tượng trong lớp đó

Trang 7

Sơ đồ lớp và sơ đồ thể hiện

Sinh viênHọ tên

Năm sinhMã số

Điểm TB

(Sinh viên)Nguyễn Văn A1984

0610234T9.2

9.2

Thao tác

Trang 8

2.2 Các thành phần của lớp

 Một kiểu dữ liệu là một biểu diễn cụ thể một khái niệm trong thực tế Ví dụ kiểu int là một biểu diễn cụ thể của khái niệm số nguyên trong toán học

 Trong C++, các kiểu dữ liệu có sẵn (built-in data types) :int, long, float, double, char cho phép kiểm tra lúc

biên dịch và phát sinh mã chương trình tối ưu Các kiểu dữ liệu này cung cấp một giao diện tự nhiên độc lập với

biên dịch và phát sinh mã chương trình tối ưu Các kiểu dữ liệu này cung cấp một giao diện tự nhiên độc lập với phần cài đặt

Trang 9

2.2 Các thành phần của lớp

 Lớp trong C++ là cài đặt của kiểu dữ liệu trừu tượng do người sử dụng định nghĩa, cho phép kết hợp dữ liệu, các phép toán, các hàm liên quan để tạo ra một đơn vị

chương trình duy nhất Các lớp này có đầy đủ ưu điểm và tiện lợi như các kiểu dữ liệu nội tại Lớp tách rời phần

giao diện (chỉ liên quan với người sử dụng) và phần cài đặt lớp

đặt lớp

 Lớp trong C++ được cài đặt sử dụng từ khoá struct và

class

Trang 10

Ví dụ so sánh: Xây dựng kiểu dữ liệu stack.

1 Cách tiếp cận cổ điển:

// Stack1.cpp :

//Dung cau truc va ham toan cuc

#include <iostream.h>

typedef int bool;

typedef int Item;

const bool false = 0, true = 1;

const bool false = 0, true = 1;

Trang 15

Ví dụ so sánh (tt)

Nhận xét:

 Giải quyết được vấn đề

 Khai báo cấu trúc dữ liệu nằm riêng, các hàm xử lý dữ liệu nằm riêng ở một nơi khác Do đó khó theo dõi

quản lý khi hệ thống lớn Vì vậy khó bảo trì

 Mọi thao tác đều có tham số đầu tiên là con trỏ đến đối tượng cần thao tác Tư tưởng thể hiện ở đây là hàm hay

 Mọi thao tác đều có tham số đầu tiên là con trỏ đến đối tượng cần thao tác Tư tưởng thể hiện ở đây là hàm hay thủ tục đóng vai trò trọng tâm Đối tượng được gởi đến cho hàm xử lý

 Trình tự sử dụng qua các bước: Khởi động, sử dụng thực sự, dọn dẹp

Trang 16

bool Empty() const {return (top <= st);} bool Push(Item x);

bool Pop(Item *px);

Trang 19

Ví dụ so sánh (tt)

Nhận xét:

 Giải quyết được vấn đề

 Dữ liệu và các hàm xử lý dữ liệu được gom vào một chỗ bên trong cấu trúc Do đó dễ theo dõi quản lý, dễ bảo trì nâng cấp

 Các thao tác đều bớt đi một tham số so với cách tiếp cận cổ điển Vì vậy việc lập trình gọn hơn Tư tưởng thể hiện

cổ điển Vì vậy việc lập trình gọn hơn Tư tưởng thể hiện

ở đây là đối tượng đóng vai trò trọng tâm Đối tượng

thực hiện thao tác trên chính nó

 Trình tự sử dụng qua các bước: Khởi động, sử dụng thực sự, dọn dẹp

Trang 20

2.2.1 Các hàm thành phần.

 Là hàm được khai báo trong lớp Hàm thành phần có thể được định nghĩa bên trong hoặc bên ngoài lớp

 Hàm thành phần có nghi thức giao tiếp giống với các

hàm bình thường khác: có tên, danh sách tham số, giá trị trả về

 Gọi hàm thành phần bằng phép toán dấu chấm (.) hoặc dấu mũi tên (->)

dấu mũi tên (->)

Stack s, *ps = &s;

s.Init(10);

for (int i = 0; i < 20; i++)

ps->Push(i);

Trang 21

2.2.3 Lớp

 Trong cách tiếp cận dùng struct và hàm thành phần,

người sử dụng có toàn quyền truy xuất, thay đổi các

thành phần dữ liệu của đối tượng thuộc cấu trúc Ví dụ:

Stack s;

s.Init(10);

s.size = 100; // Nguy hiem

for (int i = 0; i < 20; i++)

for (int i = 0; i < 20; i++)

s.Push(i);

 Vì vậy, ta không có sự an toàn dữ liệu Lớp là một

phương tiện để khắc phục nhược điểm trên

 Lớp có được bằng cách thay từ khoá struct bằng từ khoá class

Trang 22

 Trong lớp mọi thành phần mặc nhiên đều là riêng tư

(private) nghĩa là thế giới bên ngoài không được phép truy xuất Do đó có sự an toàn dữ liệu

void CleanUp() {if (st) delete [] st;}

bool Full() const {return (top - st >= size);} bool Empty() const {return (top <= st);}

bool Push(Item x);

Trang 23

 Phát biểu:

s.size = 100; // Bao sai

Sẽ bị báo sai lúc biên dịch, nhờ đó tránh được những lỗi lúc chạy chương trình (run-time error) rất khó tìm khi thực hiện chương trình

Trang 24

2.2.4 Thuộc tính truy xuất

 Tuy nhiên lớp như trên trở thành vô dụng vì các hàm thành phần cũng trở thành private và không ai dùng được Điều đó được khắc phục nhờ thuộc tính truy xuất

 Thuộc tính truy xuất của một thành phần của lớp chỉ rõ phần chương trình được phép truy xuất đến nó

• Thuộc tính private

• Thuộc tính public

• Thuộc tính public

Trang 25

Thuộc tính truy xuất

 Các thành phần là nội bộ của lớp, bao gồm dữ liệu và các hàm phục vụ nội bộ được đặt trong phần private Các hàm nhằm mục đích cho người sử dụng dùng được đặt trong phần public

 Ví dụ sau minh hoạ thuộc tính truy xuất

Trang 27

Ví dụ về lớp và thuộc tính truy xuất

Trang 28

Ví dụ về lớp và thuộc tính truy xuất

Trang 29

Sử dụng phạm vi truy xuất

 Phạm vi truy xuất được sử dụng đúng sẽ cho phép ta kết luận: Nhìn vào lớp thấy được mọi thao tác trên lớp

 Người dùng bình thường có thể khai thác hết các chức năng (public) của lớp

 Người dùng cao cấp có thể thay đổi chi tiết cài đặt, cải tiến giải thuật các hàm thành phần

Trang 30

Tự tham chiếu

 Là tham số ngầm định của hàm thành phần trỏ đến đối tượng Nhờ đó hàm thành phần biết được nó đang thao tác trên đối tượng nào

 Khi một đối tượng gọi một thao tác, địa chỉ của đối tượng được gởi đi một cách ngầm định với tên this, tên các

thành phần của đối tượng được hiểu là của đối tượng có địa chỉ this này

địa chỉ this này

Trang 31

Phương thức thiết lập và hủy bỏ

 Phương thức thiết lập và huỷ bỏ được xây dựng nhằm mục đích khắc phục lỗi quên khởi động đối tượng hoặc khởi động dư Việc quên khởi động đối tượng thường gây ra những lỗi rất khó tìm

 Phương thức thiết lập là hàm thành phần đặc biệt được tự động gọi đến mỗi khi một đối tượng thuộc lớp được tạo ra Người ta thường lợi dụng đặc tính trên để khởi

tạo ra Người ta thường lợi dụng đặc tính trên để khởi động đối tượng

 Phương thức thiết lập có tên trùng với tên lớp để phân biệt nó với các hàm thành phần khác

Trang 32

Phương thức thiết lập và hủy bỏ

 Có thể có nhiều phiên bản khác nhau của phương thức thiết lập

 Phương thức huỷ bỏ là hàm thành phần đặc biệt được tự động gọi đến mỗi khi một đối tượng bị huỷ đi Người ta thường lợi dụng đặc tính trên để dọn dẹp đối tượng

 Phương thức huỷ bỏ bắt đầu bằng dấu ngã (~) theo sau bởi tên lớp để phân biệt nó với các hàm thành phần

bởi tên lớp để phân biệt nó với các hàm thành phần

khác

 Chỉ có thể có tối đa một phương thức huy bo

Trang 33

Phương thức thiết lập và hủy bỏ

typedef int Item;

Trang 34

2.3 Các đặc tính khác của lớp

 Hàm bạn (Friends)

 Hàm thành phần hằng (const member functions)

 Thành phần tĩnh (static members)

 Con trỏ tới hàm thành phần

Trang 35

2.3.1 Hàm bạn (friends)

 Nguyên tắc chung khi thao tác trên lớp là thông qua các hàm thành phần Tuy nhiên có những trường hợp ngoại lệ, khi hàm phải thao tác trên hai lớp

 Hàm bạn của một lớp là hàm được khai báo ở bên

ngoài nhưng được phép truy xuất các thành phần riêng

tư của lớp

 Ta làm một hàm trở thành hàm bạn của lớp bằng cách

 Ta làm một hàm trở thành hàm bạn của lớp bằng cách đưa khai báo của hàm đó vào trong lớp, thêm từ khoá friend ở đầu

 Ta dùng hàm bạn trong trường hợp hàm phải là hàm

toàn cục nhưng có liên quan mật thiết với lớp, hoặc là hàm thành phần của một lớp khác

Trang 36

Ví dụ: Nhân ma trận, không dùng hàm bạn

double Get(int i) const {return a[i];}

void Set(int i, double x) {a[i] = x;}

};

};

Trang 37

Ví dụ: Nhân ma trận, không dùng hàm bạn

};

};

Trang 38

Ví dụ: Nhân ma trận, không dùng hàm bạn

Vector Multiply(const Matrix &m, const Vector &v)

Trang 39

double Get(int i) const {return a[i];}

void Set(int i, double x) {a[i] = x;}

Ví dụ: Nhân ma trận, dùng hàm bạn

void Set(int i, double x) {a[i] = x;}

friend Vector Multiply(const Matrix &m, const Vector

&v);

};

Trang 40

class Matrix

{

double a[N][N];

public:

double Get(int i, int j) const {return a[i][j];}

void Set(int i, int j, double x) {a[i][j] = x;}

friend Vector Multiply(const Matrix &m, const Vector

&v);

Ví dụ: Nhân ma trận, dùng hàm bạn

&v);

};

Trang 41

Ví dụ minh hoạ: Sử dụng hàm bạn

Vector Multiply(const Matrix &m, const Vector &v)

Trang 42

2.3.2 Hàm thành phần hằng

 Hàm thành phần hằng là hàm thành phần có thể áp dụng được cho các đối tượng hằng

 Ta qui định một hàm thành phần là hằng bằng cách

thêm từ khoá const vào cuối khai báo của nó

 Ta khai báo hàm thành phần là hằng khi nó không thay đổi các thành phần dữ liệu của đối tượng

đổi các thành phần dữ liệu của đối tượng

Trang 43

Hàm thành phần hằng

inline char *strdup(const char *s)

Trang 44

Hàm thành phần hằng

Trang 45

2.3.3 Thành phần tĩnh (static members)

 Thành phần dữ liệu tĩnh là thành phần dữ liệu dùng

chung cho mọi đối tượng thuộc lớp

 Hàm thành phần tĩnh là hàm thành phần có thể hoạt

động không cần dữ liệu của đối tượng, nói cách khác,

nó không cần đối tượng

 Ta dùng hàm thành phần tĩnh thay vì hàm toàn cục vì

nó có liên quan mật thiết với lớp

nó có liên quan mật thiết với lớp

 Ta còn dùng hàm thành phần tĩnh để tạo đối tượng có

giá trị trả về cho biết việc tạo đối tượng có thành công

theo nghĩa luận lý hay không

Trang 46

Ví dụ về thành phần tĩnh: CDate

typedef int bool;

const bool false = 0, true = 1;

class CDate

{

static int dayTab[][13];

int day, month, year;

public:

public:

static bool LeapYear(int y) {return y%400

== 0 || y%4==0 && y%100 != 0;}

static int DayOfMonth(int m, int y);

static bool ValidDate(int d, int m, int y);void Input();

};

Trang 47

Ví dụ về thành phần tĩnh : CDate

int CDate::dayTab[][13] =

{

{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};

int CDate::DayOfMonth(int m, int y)

Trang 48

Ví dụ về thành phần tĩnh : CDate

bool CDate::ValidDate(int d, int m, int y)

Trang 49

Ví dụ về thành phần tĩnh: Stack

static Stack *Create(int sz);

bool Full() const {return (top-st >= size);}bool Empty() const {return (top <= st);}

bool Push(Item x);

bool Pop(Item *px);

Trang 50

Ví dụ về thành phần tĩnh: Stack

Trang 52

void main()

{

Stack *ps = new Stack(50000); // khong biet tao

duoc stack khong Stack *pr = Stack::Create(50000);

Trang 53

2.4 Thiết lập và huỷ bỏ đối tượng

Ta cần kiểm soát khi nào phương thức thiết lập được

gọi, khi nào phương thức huỷ bỏ được gọi

• Khi nào đối tượng thiết lập được gọi? Khi đối tượng

được tạo ra

• Khi nào phương thức huỷ bỏ được gọi? Khi đối tượng bị huỷ đi

Thời gian từ khi đối tượng được tạo ra đến khi nó bị huỷ

• Thời gian từ khi đối tượng được tạo ra đến khi nó bị huỷ

đi được gọi là thời gian sống

 Vậy vấn đề xác định khi nào phương thức thiết lập và huỷ bỏ được gọi trở thành:

Khi nào đối tượng được tạo ra ?

Trang 54

Thiết lập và huỷ bỏ đối tượng

 Thời gian sống của đối tượng khác nhau tuỳ thuộc đối tượng đó thuộc lớp lưu trữ (storage class) nào Trong C++ có các lớp lưu trữ sau:

 Ta sẽ lần lượt xét các loại sau:

Đối tượng tự động

Đối tượng toàn cục

Đối tượng tĩnh

Đối tượng được cấp phát động

Đối tượng thành phần

Trang 55

Đối tượng tự động

 Đối tượng tự động (automatic objects) là đối tượng được tự động sinh ra và tự động bị huỷ đi

 Đối tượng địa phương

• Là các biến được khai báo, định nghĩa bên trong một khối.

• Nó được tự động sinh ra khi chương trình thực hiện ngang dòng lệnh chứa định nghĩa và bị huỷ đi sau khi chương trình hoàn tất khối chứa định nghĩa đó

khối chứa định nghĩa đó

 Khi khởi động một đối tượng bằng một đối tượng cùng kiểu, cơ chế tạo đối tượng mặc nhiên là sao chép từng bit, do đó đối tượng được khởi động sẽ chia sẻ tài

nguyên với đối tượng nguồn

Trang 56

Đối tượng là biến địa phương

Trang 57

void main()

{

string a("Nguyen Van A");

string b = a; // String b(a) a.Output(); cout << "\n";

b.Output(); cout << "\n";

}

Trang 58

 Xuất liệu khi thực hiện đoạn chương trình trên:

Trang 59

Đối tượng là tham số truyền bằng giá trị

 Đối tượng là tham số hàm, truyền bằng giá trị thì tham số hình thức là bản sao của tham số thực sự, nên có nội dung vật lý giống tham số thực sự do cơ chế sao chép từng bit

extern char *strdup(const char *s);

Trang 60

Đối tượng là tham số truyền bằng giá trị

int String::Compare(String s) const

String a("Nguyen Van A");

String b("Le Van Beo");

int c = a.Compare(b);

cout << (c > 0 ? "a > b" : c == 0 ? "a =

b" : "a < b") << "\n";

}

Trang 61

Đối tượng là tham số truyền bằng giá trị

 Khi thực hiện đoạn chương trình trên, ta được xuất liệu (có thể thay đổi ở những lần thực hiện khác nhau hoặc

ở máy khác):

Trang 62

Đối tượng là giá trị trả về

extern char *strdup(const char *s);

void Output() const {cout << p;}

int Compare(String s) const;

String UpCase() const;

};

Trang 63

Đối tượng là giá trị trả về

String String::UpCase() const

String a("Nguyen Van A");

cout << "a = "; a.Output(); cout << "\n"; String A;

A = a.UpCase();

cout << "a = "; a.Output(); cout << "\n"; cout << "A = "; a.Output(); cout << "\n";

Trang 64

Đối tượng là giá trị trả về

 Khi thực hiện đoạn chương trình trên, ta được xuât liệu

Null pointer assignment

Đối tượng giá trị trả về là bản sao của biểu thức trả về

Do đó có sự chia sẻ tài nguyên (SAI)

Trang 65

Đối tượng là giá trị trả về

Các lỗi sai gây ra ở đoạn chương trình trên do sao chép đối tượng (phát biểu String r = *this), đối tượng giá trị trả về và phép gán (A = a.Upcase)

 Ta có thể khắc phục lỗi gây ra do phép gán bằng cách thay hai phát biểu khai báo A và gán bằng phát biểu

khởi động:

String A = a.UpCase();

String A = a.UpCase();

Ngày đăng: 11/05/2021, 03:03

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w