1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Giáo trình Lập trình hướng đối tượng (Nghề Lập trình máy tính)

183 20 3

Đ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 183
Dung lượng 1,72 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 này sẽ trình bầy một cách hệ thống các khái niệm của lập trình hướng đối tượng được cài đặt trong C++ như lớp, đối tượng, sự thừa kế, tính tương ứng bội và các khả năng mới tro

Trang 1

BỘ NÔNG NGHIỆP VÀ PHÁT TRIỂN NÔNG THÔN TRƯỜNG CAO ĐẲNG CƠ GIỚI NINH BÌNH

GIÁO TRÌNH MÔN HỌC: MH 13_LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

NGHỀ: LẬP TRÌNH MÁY TÍNH TRÌNH ĐỘ: Cao đẳng/ trung cấp

Ban hành kèm theo Quyết định số: /QĐ-…TCGNB ngày…….tháng….năm

của Hiệu trưởng Trường Cao Đẳng Cơ giới Ninh Bình

1

Trang 2

Ninh Bình

TUYÊN BỐ BẢN QUYỀN

Tài liệu này thuộc loại sách giáo trình nên các nguồn thông tin có thể được phép dùng nguyên bản hoặc trích dùng cho các mục đích về đào tạo và tham khảo Mọi mục đích khác mang tính lệch lạc hoặc sử dụng với mục đích kinh doanh thiếu lành mạnh sẽ bị nghiêm cấm.

2

Trang 3

MỤC LỤC

Lời nói đầu 1

Chương 1 PHƯƠNG PHÁP HƯỚNG ĐỐI TƯỢNG 3

1.1 Các phương pháp lập trình 3

1.2 Đặc điểm của lập trình hướng đối tượng 10

1.3 Xây dựng lớp đối tượng 10

BÀI TẬP CHƯƠNG 1 11

Chương 2 CÁC THÀNH PHẦN CỦA LỚP 12

2.1 Khai báo một lớp cơ sở

2.2 Hàm CONSTRUCTOR (Hàm tạo) 13

2.3 Hàm DESTRUCTOR (Hàm hủy) 19

2.4 Hàm INLINE (Hàm nội tuyến) 22

2.5 Thành phần tĩnh của lớp 25

2.6 Hàm FRIEND (hàm bạn) 29

BÀI TẬP CHƯƠNG 2 39

Chương 3 LỚP

3.1 Định nghĩa lớp 41

3.2 Tạo lập đối tượng 44

3.3 Truy nhập tới các thành phần của lớp 45

3.4 Con trỏ đối tượng 47

BÀI TẬP CHƯƠNG 3 59

Chương 4 TOÁN TỬ ĐỊNH NGHĨA CHỒNG

5.1 Cách định nghĩa chồng các toán tử 63

5.2 Cách dùng hàm toán tử 76

BÀI TẬP CHƯƠNG 4 83

Chương 5 THỪA KẾ

6.1 Giới thiệu 84

6.2 Đơn thừa kế 86

6.3 Đa kế thừa 99

BÀI TẬP CHƯƠNG 5 106

Chương 6: HÀM ẢO VÀ TÍNH TƯƠNG ỨNG BỘI 111

7.1 Hàm ảo 111

7.2 Lớp cơ sở ảo 117

Chương 7: HÀM, LỚP TEMPLATE

8.1 Khuôn hình hàm 125

8.2 Khuôn hình lớp 130

BÀI TẬP CHƯƠNG 7 133

Phụ lục 1 135

Phụ lục 2 137

3

Trang 4

TÀI LIỆU THAM KHẢO 143

LỜI GIỚI THIỆU

Phương pháp lập trình hướng đối tượng trở nên phổ biến, ngày càng được quan tâm nghiên cứu nhiều Vì lập trình hướng đối tượng dựa trên việc tổ chức chương trình thành các lớp Khác với hàm và thủ tục, lớp là một đơn vị bao gồm

cả dữ liệu và các phương thức xử lý vì vậy lớp có thể mô tả các thực thể một cách chân thực, đầy đủ cả phần dữ liệu và yêu cầu quản lý Tư tưởng lập trình hướng đối tượng được áp dụng cho hầu hết các ngôn ngữ mới chạy trên môi trường Windows như Microsoft Access, C++, Visual Basic, Visual C++, Java,

Vì vậy việc nghiên cứu phương pháp lập trình mới này là rất cần thiết đối với tất

cả những người quan tâm tới lập trình.

C ra đời năm 1973 với mục đích ban đầu là để viết hệ điều hành Unix trên máy tính mini PDP Sau đó C đã được sử dụng rộng rãi trên nhiều loại máy tính khác nhau và đã trở thành một ngôn ngữ lập trình cấu trúc rất được ưa chuộng.

Để đưa C vào thế giới hướng hướng đối tượng, năm 1980 nhà khoa học người Mỹ B Stroustrup đã cho ra đời một ngôn ngữ C mới có tên ban đầu là “C

có lớp”, sau đó đến năm 1983 thì gọi là C++ Ngôn ngữ C++ là một sự phát triển mạnh mẽ của C Trong C++ chẳng những đưa vào tất cả các khái niệm, công

cụ của lập trình hướng đối tượng mà còn đưa vào nhiều khả năng mới mẻ cho hàm Như vậy C++ là một ngôn ngữ lai cho phép tổ chức chương trình theo các lớp và các hàm Có thể nói C++ đã thúc đẩy ngôn ngữ C vốn đã rất thuyết phục đi vào thế giới lập trình hướng đối tượng và C++ đã trở thành ngôn ngữ hướng đối tượng nổi bật trong những năm 90.

Bài giảng này sẽ trình bầy một cách hệ thống các khái niệm của lập trình hướng đối tượng được cài đặt trong C++ như lớp, đối tượng, sự thừa kế, tính tương ứng bội

và các khả năng mới trong xây dựng, sử dụng hàm như: đối tham chiếu, đối mặc định,

hàm trùng tên, hàm toán tử Các chương từ 1 đến 7 với cách giải thích tỉ mỉ

và với nhiều chương trình minh hoạ sẽ cung cấp cho người học các khái niệm, phương pháp và kinh nghiệm lập trình hướng đối tượng trên C++.

Bài giảng gồm 7 chương và 2 phụ lục

Chương 1: Phương pháp hướng đối tượng.

Trang 5

Phụ lục 2 trình bầy một vấn đề quan trọng nhưng còn ít được nói đến trong các tài liệu, đó là cách sử dụng con trỏ void để xây dựng các hàm với số đối không cố định giống như các hàm printf và scanf của C.

Khi viết chúng tôi đã hết sức cố gắng để cuốn sách được hoàn chỉnh, song chắc chắn không tránh khỏi thiếu sót, vì vậy rất mong nhận được sự góp ý của các bạn.

Xin chân thành cám ơn!

Ninh Bình, ngày tháng năm

Tham gia biên soạn

1 Chủ biên - Đoàn Xuân Luận

2 Phạm Thị Thoa

3 Nguyễn Anh Văn

5

Trang 6

GIÁO TRÌNH MÔN HỌC Tên Môn học: Lập trình hướng đối tượng

Mã môn học: MH13

Vị trí, tính chất của mô đun:

- Vị trí: Môn học được bố trí sau khi học xong các môn học chung.

- Tính chất: Môn học này là môn học cơ sở.

- Ý nghĩa, vai trò của môn học: Đây là môn học cơ sở ngành của các ngành liên quan đến công nghệ thông tin, cung cấp cho sinh viên các kiến thức cơ bản về lập trình.

Mục tiêu của môn học:

Nội dung của môn học:

Chương 1: Phương pháp hướng đối tượng.

Trang 7

CHƯƠNG 1 PHƯƠNG PHÁP HƯỚNG ĐỐI TƯỢNG

Mã chương: MH13_CH01 Giới thiệu:

Phương pháp hướng đối tượng hiện đang được sử dụng rộng rãi trên thế giới

do có những đặt điểm quan trọng giúp người lập trình có thể giảm thiểu đáng kể thời gian lập trình, một số công nghệ hiện đại hiện nay như C++ Builder, Visual Studio NET, cho phép người lập trình kế thừa một kho tàng đối tượng phong phú

để có thể xây dựng giao diện ứng dụng đồ họa một cách nhanh chóng Những đặt tính cơ bản của phương pháp này sẽ được trình bày trong môn học này.

Mục tiêu:

- Trình bày được các phương pháp của lập trình hướng đối tượng, các đặt điểm nỗi bật của phương pháp lập trình hướng đối tượng.

- Trình bày được các thành phần của một lớp đối tượng

- Thực hiện các thao tác an toàn với máy tính.

Hàm là một đơn vị chương trình độc lập dùng để thực hiện một phần việc nào đónhư: nhập số liệu, in kết quả hay thực hiện một số tính toán Hàm cần có đối và cácbiến, mảng cục bộ dùng riêng cho hàm

Việc trao đổi dữ liệu giữa các hàm thực hiện thông qua các đối và các biến toàn bộ Các ngôn ngữ như C, PASCAL, FOXPRO là các ngôn ngữ cho phép triển khai

Trang 8

chương trình thành các hàm, thủ tục: Chương trình sẽ bao gồm các hàm, thủ tục nào.

Ví dụ : Xét yêu cầu sau: Viết chương trình nhập toạ độ (x,y) của một dãy điểm,

sau đó tìm một cặp điểm cách xa nhau nhất

Trên tư tưởng của lập trình hướng cấu trúc có thể tổ chức chương trình như sau:+ Sử dụng 2 mảng thực toàn bộ x và y để chứa toạ độ dãy điểm

+ Xây dựng 2 hàm:

Hàm nhapsl dùng để nhập toạ độ n điểm, hàm này có một đối là biến nguyên n và được khai báo như sau:

void nhapsl(int n);

Hàm do_dai dùng để tính độ dài đoạn thẳng đi qua 2 điểm có chỉ số là i và j,

nó được khai báo như sau:

float do_dai(int i, int j);

Chương trình C cho bài toán trên được viết như sau:

Trang 9

printf("\nDoan thang lon nhat co do dai bang: %0.2f",dmax);

printf("\n Di qua 2 diem co chi so la %d va %d",imax,jmax);

1.1.2 Lập trình hướng đối tượng.

Khái niệm trọng tâm của lập trình hướng đối tượng là lớp (class) Có thể xem lớp

là sự kết hợp các thành phần dữ liệu và các hàm Cũng có thể xem lớp là sự mở rộngcủa cấu trúc trong C (struct) bằng cách đưa thêm vào các phương thức (method) haycòn gọi là hàm thành viên (member function) Một lớp được định nghĩa như sau:

class Tên_Lớp

{

// Khai báo các thành phần dữ liệu

// Khai báo các phương thức

};

Các phương thức có thể được viết (xây dựng) bên trong hoặc bên ngoài (phíadưới) phần định nghĩa lớp Cấu trúc (cách viết) phương thức tương tự như hàm ngoạitrừ quy tắc sau: khi xây dựng một phương thức bên ngoài định nghĩa lớp thì trước tênphương thức cần có tên lớp và 2 dấu : để chỉ rõ phương thức thuộc lớp nào (xem ví dụbên dưới)

- Sử dụng các thành phần dữ liệu trong phương thức: Vì phương thức và các

9

Trang 10

thành phần dữ liệu thuộc cùng một lớp nên trong thân của phương thức có quyền truynhập đến các thành phần dữ liệu (của cùng lớp).

- Biến lớp: Sau khi định nghĩa một lớp, có thể dùng tên lớp để khai báo các biếnkiểu lớp hay còn gọi là đối tượng Mỗi đối tượng sẽ có các thành phần dữ liệu và cácphương thức Lời gọi một phương thức cần chứa tên đối tượng để xác định phươngthức thực hiện từ đối tượng nào

- Một chương trình hướng đối tượng sẽ bao gồm các lớp có quan hệ với nhau

- Việc phân tích, thiết kế chương trình theo phương pháp hướng đối tượng nhằmthiết kế, xây dựng các lớp

- Từ khái niệm lớp nảy sinh hàng loạt khái niệm khác như: thành phần dữ liệu,phương thức, phạm vi, sự đóng gói, hàm tạo, hàm huỷ, sự thừa kế, lớp cơ sở, lớp dẫnxuất, tương ứng bội, phương thức ảo,

+Đối tượng (object) là sự biểu diễn một thực thể phần mềm gồm các thuộc tính

và các phương thức liên quan.

Một đối tượng cụ thể được gọi là một thể hiện (instance)

Một đối tượng là sự đóng gói 2 thành phần:

 Trạng thái (state) hay dữ liệu

 Các ứng xử (behavior) hay hành vi, thao tác

+Lớp (class) là tập hợp các đối tượng có cùng thuộc tính và hành vi

Lớp là bản thiết kế hoặc bản mẫu mô tả một cấu trúc dữ liệu gồm:

 Các thành phần dữ liệu

 Các phương thức

Lớp được sử dụng như kiểu dữ liệu người dùng định nghĩa

+Thuộc tính (attribute) là dữ liệu trình bày các đặc điểm về một đối tượng.

Thuộc tính bao gồm:

 Hằng, biến

 Tham số nội tại

Thuộc tính được xác định kiểu, gồm:

 Kiểu cơ bản

 Kiểu do người dùng định nghĩa

+Phương thức (method) có liên quan tới những thứ mà đối tượng có thể làm.

Một phương thức đáp ứng một chức năng tác động lên dữ liệu của đối tượng (thuộc tính).

10

Trang 11

Phương thức là:

 Các hàm nội tại của đối tượng

 Có kiểu trả về

 Tên gọi khác: hàm thành viên

+Thông điệp (message) là một lời yêu cầu một hoạt động Một thông điệp được

truyền khi một đối tượng triệu 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.

Một thông điệp bao gồm:

 Đối tượng nhận thông điệp

 Tên phương thức cần thực hiện

 Các tham số mà phương thức cần

Hệ thống yêu cầu đối tượng thực hiện phương thức như sau:

 Gửi thông báo và tham số cho đối tượng

 Kiểm tra tính hợp lệ của thông báo

 Gọi thực hiện hàm tương ứng phương thức

+Sự trừu tượng hoá dữ liệu: là biểu thị những đặc tả thiết yếu của đối tượng để

phân biệt ranh giới rõ ràng giữa các đối tượng và những tính chất đặc thù của chúng

Các loại trừu tượng hoá:

 Trừu tượng hoá dữ liệu: không quan tâm các chi tiết không quan trọng bên trong

 Trừu tượng hoá chức năng: không quan tâm làm thế nào để thực hiện công việc

Ví dụ: Mô tả hoạt động của một ngăn xếp trong cấu trúc dữ liệu bằng mảng

Các dữ liệu cần thiết cho ngăn xếp:

- Kích thước của phần tử dữ liệu

Trang 12

typedef struct CStashTag

void inflate(CStash* s, int increase);

Lập trình hướng đối tượng

int add(const void* element);

void *fetch(int index);

 Bao gói: người dùng giao tiếp với hệ thống qua giao diện

 Che dấu: ngăn chặn các thao tác không được phép từ bên ngoài

Có ưu điểm:

 Quản lý sự thay đổi

 Bảo vệ dữ liệu

+Kế thừa (inheritance): Khả năng cho phép xây dựng lớp mới được thừa hưởng

các thuộc tính và phương thức của lớp đã có

Đặc điểm:

 Lớp nhận được có thể bổ sung các thành phần

 Hoặc định nghĩa lại các thuộc tính của lớp cha

Có các loại kế thừa: Đơn kế thừa và đa kế thừa

+Tính đa hình(polymorphime): Khả năng đưa một phương thức có cùng tên

trong các lớp con

12

Trang 13

Đa hình thực hiện bởi:

- Ưu điểm của việc thiết kế hướng đối tượng là:

+Tập trung xác định các lớp để mô tả các thực thể được gọi là các đối tượng củabài toán và sau đó xây dựng các dữ liệu cùng các hàm xung quanh các đối tượng

đó Các thực thể tác động, trao đổi thông tin với nhau qua cơ chế thông báo(message) Như vậy việc thiết kế chương trình xuất phát từ các nội dung, cácvấn đề của bài toán

+Thông qua nguyên lý kế thừa, có thể loại bỏ được những đoạn chương trình lặplại trong quá trình mô tả các lớp và có thể mở rộng khả năng sử dụng của các lớp đã xâydựng mà không cần phải viết lại

+Chương trình được xây dựng từ những đơn thể (đối tượng) trao đổi với nhaunên việc thiết kế và lập trình sẽ được thực hiện theo quy trình nhất định chứ không phảidựa vào kinh nghiệm và kỹ thuật như trước nữa Điều này đảm bảo rút ngắn được thờigian xây dựng hệ thống và tăng năng suất lao động

+Nguyên lý đóng gói hay che giấu thông tin giúp người lập trình tạo ra đượcnhững chương trình an toàn không bị thay đổi bởi những đoạn chương trìnhkhác

+Có thể xây dựng được ánh xạ các đối tượng của bài toán vào đối tượng chươngtrình

+Cách tiếp cận thiết kế đặt trọng tâm vào dữ liệu, giúp chúng ta xây dựng được

mô hình chi tiết và dễ dàng cài đặt hơn

+Các hệ thống hướng đối tượng dễ mở rộng, nâng cấp thành những hệ lớn hơn.+Kỹ thuật truyền thông báo trong việc trao đổi thông tin giữa các đối tượng làmcho việc mô tả giao diện với các hệ thống bên ngoài trở nên đơn giản hơn.+Có thể quản lý được độ phức tạp của những sản phẩm phần mềm

- Các ngôn ngữ thuần tuý hướng đối tượng (như Smalltalk, Java, VB.net, VisualC++, C# ) chỉ hỗ trợ các khái niệm về lớp, không có các khái niệm hàm

- C++ là ngôn ngữ hỗ trợ hướng đối tượng, nó cho phép sử dụng cả các công cụ của lớp và hàm

Ví dụ: xét bài toán tìm độ dài lớn nhất đi qua 2 điểm Trong bài toán này ta gặp một

thực thể là dãy điểm Các thành phần dữ liệu của lớp dãy điểm gồm:

- Biến nguyên n là số điểm của dãy

- Con trỏ x kiểu thực trỏ đến vùng nhớ chứa dãy hoành độ

- Con trỏ y kiểu thực trỏ đến vùng nhớ chứa dãy tung độ

Các phương thức cần đưa vào theo yêu cầu bài toán gồm:

13

Trang 14

- Nhập toạ độ một điểm

- Tính độ dài đoạn thẳng đi qua 2 điểm

Dưới đây là chương trình viết theo thiết kế hướng đối tượng Để thực hiện chương trình này đặt tên tệp có đuôi CPP Một điều mới trong C++ là các khai báo biến, mảng

có thể viết bất kỳ chỗ nào trong chương trình (nhưng lưu ý phải trước khi sử dụngbiến, mảng)

Trang 15

printf("\nDoan thang lon nhat co do dai bang: %0.2f",dmax);

printf("\n Di qua 2 diem co chi so la %d va %d",imax,jmax);

getch();

}

1.2 Đặc điểm của lập trình hướng đối tượng.

- Tập trung vào dữ liệu thay cho các hàm

- Chương trình được chia thành các đối tượng

- Các cấu trúc dữ liệu được thiết kế sao cho đặc tả được đối tượng

- Các hàm thao tác trên các vùng dữ liệu của đối tượng được gắn với cấu trúc dữ liệu đó

- Dữ liệu được đóng gói lại, được che giấu và không cho phép các hàm ngoại lai truy nhập tự do

- Các đối tượng tác động và trao đổi thông tin với nhau qua các hàm

- Có thể dễ dàng bổ sung dữ liệu và các hầm mới vào đối tượng nào đó khi cầnthiết

- Chương trình được thiết kế theo cách tiếp cận từ dưới lên (bottom-up)

1.3 Xây dựng lớp đối tượng.

Các bước chính để xây dựng lớp đối tượng

- Xác định các dạng đối tượng (lớp) của bài toán

- Tìm kiếm các đặc tính chung

- Xác định lớp cơ sở dựa trên cơ sở các đặc tính chung

- Xây dựng lớp dẫn xuất từ lớp cơ sở

15

Trang 16

16

Trang 17

CHƯƠNG 2 CÁC THÀNH PHẦN CỦA LỚP

Mã chương: MH13_CH02 Giới thiệu:

Bài này giúp học sinh tìm hiểu về các thành phần của lớp.

Mục tiêu:

- Trình bày được các thành phần có trong một lớp;

- Cài đặt được một lớp đối tượng trên ngôn ngữ trình hướng đối tượng C++;

- Cài đặt được các hàm khởi tạo và hàm hủy bỏ;

- Khai báo được hàm friend ;

- Thực hiện các thao tác an toàn với máy tính.

Nội dung:

Chương 2 CÁC THÀNH PHẦN CỦA LỚP

2.1 Khai báo một lớp cơ sở.

Một lớp cơ sở được khai báo như sau:

Trang 18

void move(int dx, int dy);

void display();

};

/*định nghĩa các hàm thành phần bên ngoài khai báo lớp*/

void point::init(int ox, int oy) {

cout<<"Ham thanh phan init\n";

x = ox; y = oy; /*x,y là các thành phần của đối tượng gọi hàm thành phần*/

}

void point::move(int dx, int dy) {

cout<<"Ham thanh phan move\n";

x += dx; y += dy;

}

void point::display() {

cout<<"Ham thanh phan display\n";

cout<<"Toa do: "<<x<<" "<<y<<"\n";

2.2.1 Công dụng của hàm Constructor.

- Hàm tạo là một hàm thành phần đặc biệt không thể thiếu được trong một lớp

Nó được gọi tự động mỗi khi có một đối tượng được khai báo Chức năng của hàm tạo

là khởi tạo các giá trị thành phần dữ liệu của đối tượng, xin cấp phát bộ nhớ cho các thành phần dữ liệu động

18

Trang 19

- Hàm tạo tạo định nghĩa và khởi tạo các đối tượng của một lớp.

point(int ox,int oy) {x=ox;y=oy;} /*hàm tạo*/

void move(int dx, int dy);

void display();

};

/*Định nghĩa các hàm thành phần bên ngoài khai báo lớp*/

void point::move(int dx, int dy) {

Trang 20

Kết quả thực hiện chương trình như sau:

Toa do : 5 2

Toa do : 3 6

Toa do : 1 -1

2.2.2 Quy tắc viết hàm Constructor.

- Hàm tạo có cùng tên với tên của lớp

- Hàm tạo phải có thuộc tính public.

- Hàm tạo không có giá trị trả về và không cần khai báo void

- Có thể có nhiều hàm tạo trong cùng lớp (chồng các hàm tạo)

- Khi một lớp có nhiều hàm tạo, việc tạo các đối tượng phải kèm theo các tham

số phù hợp với một trong các hàm tạo đã khai báo

point a(1); /* Lỗi vì tham số không phù hợp với hàm tạo */

point b; /*Đúng, tham số phù hợp với hàm tạo không tham số*/

point c(2,3); /*Đúng, tham số phù hợp với hàm thiếtlập thứ hai, có hai tham số*/

- Định nghĩa hàm tạo không tham số

point(int ox,int oy) {x=ox;y=oy;}

/*định nghĩa thêm hàm tạo không tham số*/

point() {x = 0; y = 0;}

void move(int dx,int dy) ;

20

Trang 21

point(int ox, int oy = 0) {x=ox;y=oy;}

/*hàm tạo có hai tham số*/

Trang 22

+ Cách viết thứ hai hàm ý rằng đã có chuyển kiểu ngầm định từ số nguyên 1thành đối tượng kiểu point

- Như là các hàm toàn cục, một hàm thành viên của một lớp có thể có các đối sốmặc định, đối số có thể là một biểu thức gồm nhiều đối tượng được định nghĩa bêntrong phạm vi mà lớp xuất hiện

Ví dụ 6: một hàm tạo dựng cho lớp Point có thể sử dụng các đối số mặc định để cung

cấp nhiều cách thức khác nhau cho việc định nghĩa một đối tượng Point :

Point (int x = 0, int y = 0);

Point (float x = 0, float y = 0); // tọa độ cực//

};

thì định nghĩa sau được xem như là tối nghĩa bởi vì nó so khớp với cả hai hàm tạo dựng:

Point p; // tối nghĩa hay không rõ ràng

2.2.3 Dùng hàm tạo trong khai báo.

- Khi đã xây dựng các hàm tạo, ta có thể dùng chúng trong khai báo để tạo ra mộtđối tượng đồng thời khởi gán cho các thuộc tính của đối tượng được tạo Dựa vào các tham số trong khai báo mà trình biên dịch sẽ biết cần gọi đến hàm tạo nào

- Khi khai báo một biến đối tượng có thể sử dụng các tham số để khởi gán cho các thuộc tính của biến đối tượng

- Khi khai báo mảng đối tượng không cho phép dùng các tham số để khởi gán

- Câu lệnh khai báo một biến đối tượng sẽ gọi tới hàm tạo 1 lần

- Câu lệnh khai báo một mảng n đối tượng sẽ gọi tới hàm tạo n lần

Ví dụ:

22

Trang 23

point d; // Gọi tới hàm tạo không đối.

// Kết quả d.x=0, d.y=0point u(200,100,4); // Gọi tới hàm tạo có đối

// Kết quả u.x=200, u.y=100point v(300,250); // Gọi tới hàm tạo có đối

// Kết quả v.x=300, v.y=250point p[10] ; // Gọi tới hàm tạo không đối 10 lần

Chú ý: Với các hàm có đối kiểu lớp, thì đối chỉ xem là các tham số hình thức, vì

vậy khai báo đối (trong dòng đầu của hàm) sẽ không tạo ra đối tượng mới và do đókhông gọi tới các hàm tạo

- Khi đối tượng là nội dung một biến có kiểu lớp, ta có thể gán cho nó các “bídanh”; nghĩa là có thể khai báo các tham chiếu đến chúng Một tham chiếu đối tượngchỉ có ý nghĩa khi tham chiếu tới một đối tượng nào đó đã được khai báo trước đó

point(int ox = 1,int oy =0) {x=ox;y=oy;}

void move(int dx,int dy) ;

Trang 24

Kết quả in ra : Toa do : 2 5

Toa do : 2 5Toa do : 4 8

- Khi dùng toán tử new cấp phát một đối tượng động, hàm tạo cũng được gọi, do

vậy cần cung cấp danh sách các tham số

Cú pháp:

<tên con trỏ>=new <kiểu của con trỏ>(<Danh sách các tham số của hàm tạo>);

Ví dụ: giả sử trong lớp point có một hàm tạo hai tham số, khi đó câu lệnh sau:

Ví dụ 9: Chương trình sau đây minh hoạ cách xây dựng hàm tạo và cách sử dùng hàm

tạo trong khai báo, trong cấp phát bộ nhớ và trong việc biểu diễn các hằng đối tượng

#include <conio.h>

#include <iostream.h>

#include <iomanip.h>

24

Trang 25

// Hàm bạn dùng để in đối tượng DIEM_DH

friend void in(DIEM_DH d)

DIEM_DH d1; // Gọi tới hàm tạo không đối

DIEM_DH d2(200,200,10); // Gọi tới hàm tạo có đối

DIEM_DH *d;

d= new DIEM_DH(300,300); // Gọi tới hàm tạo có đối

clrscr();

in(d1); //Gọi hàm bạn in()

d2.in();//Gọi phương thức in() in(*d); //Gọi hàm

bạn in() DIEM_DH(2,2,2).in();//Gọi phương

thức in() DIEM_DH t[3]; // 3 lần gọi hàm tạo

không đối DIEM_DH *q; // Gọi hàm tạo không

25

Trang 26

int n;

cout << "\nN= ";

cin >> n;

q=new DIEM_DH[n+1]; // (n+1) lần gọi hàm tạo không đối

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

q[i]=DIEM_DH(300+i,200+i,8);//(n+1) lần gọi hàm tạo có đối

có tính “dọn dẹp” trước khi đối tượng được huỷ bỏ, ví dụ như giải phóng một vùngnhớ mà đối tượng đang quản lý, xoá đối tượng khỏi màn hình nếu như nó đang hiểnthị,

Việc huỷ bỏ một đối tượng thường xẩy ra trong 2 trường hợp sau:

+ Trong các toán tử và các hàm giải phóng bộ nhớ, như delete, free,

+ Giải phóng các biến, mảng cục bộ khi thoát khỏi hàm, phương thức

Trang 27

ra một cặp dòng thông báo, tương ứng với lời gọi hàm tạo, hàm huỷ bỏ (cácdòng thông báo 2, 3, 4, 5 tương ứng).

 Cuối cùng, khi hàm main() kết thúc thực hiện, đối tượng a được giải phóng, hàm huỷ bỏ đối với a sẽ cho ra dòng thông báo thứ 6

Kết quả thực hiện chương trình như sau:

1 ++ Goi ham thiet lap voi num = 1

2 ++ Goi ham thiet lap voi num = 2

3 Goi ham huy bo voi num = 2

4 ++ Goi ham thiet lap num = 4

5 Goi ham huy bo voi num = 4

6 Goi ham huy bo voi num = 1

2.3.2 Hàm huỷ mặc định.

Nếu trong lớp không định nghĩa hàm huỷ, thì một hàm huỷ mặc định không làm

gì cả được phát sinh Đối với nhiều lớp thì hàm huỷ mặc định là đủ, và không cần đưa vào một hàm huỷ mới

2.3.3 Quy tắc viết hàm huỷ.

- Tên của hàm huỷ bỏ bắt đầu bằng dấu ~ theo sau là tên của lớp tương ứng Ví

dụ lớp test thì sẽ hàm huỷ bỏ tên là ~test

- Hàm huỷ bỏ phải có thuộc tính public

- Nói chung hàm huỷ bỏ không có tham số, mỗi lớp chỉ có một hàm huỷ bỏ

27

Trang 28

(Trong khi đó có thể có nhiều các hàm tạo).

- Khi không định nghĩa hàm huỷ bỏ, chương trình dịch tự động sản sinh một hàmnhư vậy (hàm huỷ bỏ ngầm định), hàm này không làm gì ngòai việc “lấp chỗ trống”.Đối với các lớp không có khai báo các thành phần bộ nhớ động, có thể dùng hàm huỷ

bỏ ngầm định Trái lại, phải khai báo hàm huỷ bỏ tường minh để đảm bảo quản lý tốtviệc giải phóng bộ nhớ động do các đối tượng chiếm giữ chiếm giữ khi chúng hết thờigian làm việc

- Giống như hàm tạo, hàm huỷ bỏ không có giá trị trả về

Ví dụ 1:

class Set {

public:

Set (const int size);

~Set (void) {delete elems;} // destructor//

private:

int *elems; // cac phan tu tap hopint maxCard; // so phan tu toi daint card; // so phan tu cua tap hop};

Ví dụ 2: xây dựng hàm huỷ cho lớp DT (đa thức)

class DT

{

private:

int n; // Bac da thuc

double *a; // Tro toi vung nho chua cac he so da thuc

2.4 Hàm INLINE (Hàm nội tuyến).

2.4.1 Ưu nhược điểm của hàm Inline.

Việc tổ chức chương trình thành các hàm có 2 ưu điểm rõ rệt : Thứ nhất là chiachương trình thành các đơn vị độc lập, làm cho chương trình được tổ chức một cách khoa học dễ kiểm soát dễ phát hiện lỗi, dễ phát triển, mở rộng

28

Trang 29

Thứ hai là giảm được kích thước chương trình, vì mỗi đoạn chương trình thựchiện nhiệm vụ của hàm được thay bằng một lời gọi hàm.

Tuy nhiên hàm cũng có nhược điểm là làm chậm tốc độ chương trình do phải thựchiện một số thao tác có tính thủ tục mỗi khi gọi hàm như: Cấp phát vùng nhớ cho cácđối và biến cục bộ, truyền dữ liệu của các tham số cho các đối, giải phóng vùng nhớtrước khi thoát khỏi hàm

Các hàm trực tuyến trong C++ cho khả năng khắc phục được nhược điểm nói trên

2.4.2 Quy tắc viết hàm Inline.

C++ cho khả năng khắc phục nhược điểm này bằng cách dùng hàm nội tuyến

Một hàm thành viên được định nghĩa là nội tuyến bằng cách chèn từ khóa inline vào

trước định nghĩa của hàm

Chú ý: Trong mọi trường hợp, từ khoá inline phải viết trước các lời gọi hàm thì trình

biên dịch mới biết cần xử lý hàm theo kiểu inline

inline <kiểu giá trị> <tên lớp>::<tên hàm>(<danh sách tham số>){

<các lệnh>;

}

Có thể định nghĩa các hàm thành viên là nội tuyến bằng cách chèn định nghĩa

của các hàm này vào bên trong lớp.

Trang 30

- Thân hàm được chèn vào trong lớp nên không cần dấu chấm phẩy sau khai báo hàm.

- Các tham số của hàm phải được đặt tên

+Chương trình dịch các hàm inline như tương tự như các macro, nghĩa là nó sẽthay đổi lời gọi hàm bằng một đoạn chương trình thực hiện nhiệm vụ hàm Cách làmnày sẽ tăng tốc độ chương trình do không phải thực hiện các thao tác có tính thủ tục khigọi hàm nhưng lại làm tăng khối lượng bộ nhớ chương trình (nhất là đối với các hàmnội tuyến có nhiều câu lệnh) Vì vậy chỉ nên dùng hàm inline đối với các hàm cónội dung đơn giản không chứa các câu lệnh phức tạp (như chu trình, goto, switch, đệquy)

30

Trang 31

+Không phải khi gặp từ khoá inline là chương trình dịch nhất thiết phải xử lý hàm theo kiểu nội tuyến Từ khoá inline chỉ là một từ khoá gợi ý cho chươngtrình dịch chứ không phải là một mệnh lệnh bắt buộc.

Ví dụ 2: Chương trình sau sử dụng hàm inline tính chu vi và diện tích của hình chữ

cout << "\nNhap 2 canh cua hinh chu nhat thu " <<i<< ": ";

cin >> a[i] >> b[i] ;

cout << "\n Hinh chu nhat thu " << i << " : ";

cout << "\nDo dai 2 canh= " << a[i] << " va " << b[i] ;

cout << "\nDien tich= " << dt[i] ;

cout << "\nChu vi= " << cv[i] ;

}

getch();

}

31

Trang 32

Phương án 2: Sử dụng khai báo nguyên mẫu Khi đó từ khoá inline đặt trước

cout << "\nNhap 2 canh cua hinh chu nhat thu " <<i<< ": ";

cin >> a[i] >> b[i] ;

cout << "\n Hinh chu nhat thu " << i << " : ";

cout << "\nDo dai 2 canh= " << a[i] << " va " << b[i] ;

cout << "\nDien tich= " << dt[i] ;

cout << "\nChu vi= " << cv[i] ;

Chú ý: Không được đặt inline trước định nghĩa hàm Trong chương trình trên đây

nếu đặt inline trước định nghĩa hàm thì hậu quả như sau: Chương trình vẫn dịch thông,nhưng khi chạy thì chương trình bị quẩn, không thoát được

32

Trang 33

2.5 Thành phần tĩnh của lớp.

2.5.1 Thành phần dữ liệu tĩnh.

Thành phần tĩnh dữ liệu được khai báo bằng từ khoá static gọi là tĩnh, được cấpphát một vùng nhớ cố định và tồn tại ngay cả khi lớp chưa có một đối tượng nào cả.Thành phần dữ liệu tĩnh là chung cho cả lớp, không phải là riêng của mỗi đối tượngnào

A u,v ; // Khai báo 2 đối tượng

thì giữa các thành phần x và ts có sự khác nhau như sau:

int A::ts ; // Khởi gán cho ts giá trị 0

int A::ts = 1234; // Khởi gán cho ts giá trị 1234

Chú ý: Khi chưa khai báo thì thành phần tĩnh chưa tồn tại.

Trang 34

Có thể sửa chương trình trên bằng cách đưa vào các lệnh khai báo các thànhphần tĩnh tshd và tstienban như sau:

Trang 35

Phương thức tĩnh được viết theo một trong hai cách:

- Dùng từ khoá static đặt trước định nghĩa phương thức viết bên trong định nghĩalớp

- Nếu phương thức xây dựng bên ngoài định nghĩa lớp, thì dùng từ khoá static đặttrước khai báo phương thức bên trong định nghĩa lớp Không cho phép dùng từ khoástatic đặt trước định nghĩa phương thức viết bên ngoài định nghĩa lớp

Các đặc tính của phương thức tĩnh:

- Phương thức tĩnh là chung cho toàn bộ lớp và không lệ thuộc vào một đối tượng

cụ thể, nó tồn tại ngay khi lớp chưa có đối tượng nào

- Lời gọi phương thức tĩnh như sau:

Tên lớp :: Tên phương thức tĩnh(các tham số thực sự)

- Phương thức tĩnh là độc lập với các đối tượng, nên không thể dùng hàm thànhphần tĩnh để xử lý dữ liệu của các đối tượng trong lời gọi phương thức tĩnh Không cho phép truy nhập các thuộc tính (trừ thuộc tính tĩnh) trong thân hàm thành phần tĩnh

Trang 36

void set_m(void) { m= ++n;}

void show_m(void){

cout << "\n Doi tuong thu:" << m << endl;

}static void show_n(void){

cout << " m = " << n << endl;

}};

int A::n=1; //khoi gan gia tri ban dau 1 cho bien tinh n

Doi tuong thu : 2

Doi tuong thu : 3

Doi tuong thu : 4

2.6 Hàm FRIEND (hàm bạn).

2.6.1 Quy tắc viết hàm bạn.

Để một hàm trở thành bạn của một lớp, có 2 cách viết:

 Cách 1: Dùng từ khóa friend để khai báo hàm trong lớp và xây dựng hàm

bên ngoài như các hàm thông thường (không dùng từ khóa friend) Mẫu viết như sau:

class A

36

Trang 37

private :// Khai báo các thuộc tínhpublic :

// Khai báo các hàm bạn của lớp Afriend void f1 ( ) ;

friend double f2 ( ) ;

} ;// Xây dựng các hàm f1,f2,f3void f1 ( )

{}double f2 ( )

{}

 Cách 2: Dùng từ khóa friend để xây dựng hàm trong định nghĩa lớp Mẫu

{

}} ;

Có nhiều kiểu bạn bè:

- Hàm tự do là bạn của một lớp

37

Trang 38

int coincide (point p); };

Có thể định nghĩa hàm coincide như một hàm tự do bạn của lớp point như sau:friend int coincide(point , point);

};

int coincide (point p, point q) {

if ((p.x == q.x) && (p.y == q.y)) return 1;

else return 0;

}

void main() {

point a(1,0),b(1),c;

if (coincide (a,b)) cout <<"a trung voi b\n";

else cout<<"a va b khac nhau\n";

if (coincide(a,c)) cout<<"a trung voi c\n";

else cout<<"a va c khac nhau\n";

}

38

Trang 39

 Trong hàm bạn, không còn tham số ngầm định this như trong hàm thành

phần

 Giống như các hàm thành phần khác danh sách “tham số ” của hàm bạn gắn

vớiđịnh nghĩa chồng các toán tử Hàm bạn của một lớp có thể có một hay nhiềutham số, hoặc có giá trị trả về thuộc kiểu lớp đó Tuy rằng điều này không bắt buộc

 Có thể có các hàm truy xuất đến các thành phần riêng của các đối tượng cục

bộtrong hàm Khi hàm bạn của một lớp trả giá trị thuộc lớp này, thường đó là giátrị dữ liệu của đối tượng cục bộ bên trong hàm, việc truyền tham số phải thực hiện bằng tham trị, bởi truyền bằng tham chiếu (hoặc bằng địa chỉ) hàm gọi sẽnhận địa chỉ của một vùng nhớ bị giải phóng khi hàm kết thúc

int f(char , A);

Nếu f có nhu cầu truy xuất vào các thành phần riêng của A thì f cần phải được khai báo

là bạn của A ở trong lớp A bằng câu lệnh:

friend int B::f(char , A);

Sơ đồ để khai báo và định nghĩa như sau:

Trang 40

Chú ý:

 Để biên dịch được các khai báo của lớp A có chứa khai báo bạn bè

friend int B::f(char, A);

40

Ngày đăng: 28/12/2021, 19:30

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
1. G.S Phạm Văn Ất, C++ và lập trình hướng đối tượng, NXB Khoa học và kỹ thuật, Hà Nội, 2000 Khác
2. G.S Phạm Văn Ất, Giáo trình cơ sở và nâng cao với kỹ thuật lập trình hướng đối tượng, NXB Khoa học và kỹ thuật, Hà Nội, 1999 Khác
3. Claude Delannoy, Programmer en langage C++, EYROLLES Khác
4. Scott Robert Ladd, Turbo C++ Techniques and Applications, M&amp;T Books Khác
1. H.M. Deitel &amp; P.J. Deitel, C How to program Khác

HÌNH ẢNH LIÊN QUAN

Hình 5.4- Sơ đồ kế thừa - Giáo trình Lập trình hướng đối tượng (Nghề Lập trình máy tính)
Hình 5.4 Sơ đồ kế thừa (Trang 130)

TỪ KHÓA LIÊN QUAN

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

w