Giáo trình Lập trình hướng đối tượng - Vũ Thanh Hiền

20 12 0
Giáo trình Lập trình hướng đối tượng - Vũ Thanh Hiền

Đ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

Nếu lập trình viên phải hiểu biết về tất cả các khía cạnh của vấn đề, ở mọi lúc và về tất cả các hàm của chương trình thì chỉ ít hàm mới được viết ra, may mắn thay trừu tượng hóa theo dữ[r]

(1)

GIÁO TRÌNH VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

(2)

GIÁO TRÌNH VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Biên tập bởi:

Các tác giả:

Thanh Hiền Vũ

Phiên trực tuyến:

(3)

MỤC LỤC

1 Thế lập trình hướng đối tượng (OPP)

2 Một số khái niệm lập trình hướng đối tượng Các ngôn ngữ vài ứng dụng OPP

4 Quá trình phát triển C++ Các mở rộng cử C++

6 Các mở rộng C++ - Toán tử new delete

7 Các mở rộng C++ - Các giá trị tham số mặc định Bài tâp

9 Lớp đối tượng-dẫn nhập

10 Lớp đối tượng-các hàm truy cập hàm tiện ích 11 Lớp đối tượng-trả tham chiếu

12 Lớp đối tượng-các hàm lớp friend 13 Bài tập chương

14 Đa hóa tốn tử-dẫn nhập 15 Đa hóa tốn tử ngơi

16 Đa hóa tốn tử-tốn tử dấu phẩy 17 Đa hóa tốn tử-các tốn tử chèn dịng 18 Bài tập chương

19 Tính kế thừa-Dẫn nhập 20 Tính kế thừa-2

21 Tính kế thừa-3 22 Tính kế thừa-4 23 Bài tập chương

24 Tính đa hình-Dẫn Nhập

25 Tính đa hình-các thành viên ảo lớp 26 Bài tập chương

27 Thiết kế chương trình theo hướng đối tượng

28 Thiết kế chương trình theo hướng đối tượng-các ví dụ 29 Bài tập chương

30 Các dạng nhập-xuất-Dẫn nhập

31 Các dạng nhập-xuất không định dạng

(4)

34 Template and Exception

35 Template and exception-xử lý Exception 36 Bài tập chương

(5)

Thế lập trình hướng đối tượng (OPP)

LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (oop) Là ?

Lập trình hướng đối tượng (Object-Oriented Programming, viết tắt OOP) phương pháp bước đường tiến hóa việc lập trình máy tính, nhằm làm cho chương trình trở nên linh hoạt, tin cậy dễ phát triển Tuy nhiên để hiểu OOP gì, lịch sử trình lập trình – xem xét OOP tiến hóa

Lập trình tuyến tính

Máy tính lập trình mã nhị phân, sử dụng cơng tắt khí để nạp chương trình Cùng với xuất thiết bị lưu trữ lớn nhớ máy tính có dung lượng lớn nên ngơn ngữ lập trình cấp cao đưa vào sử dụng Thay phải suy nghĩ dãy bit byte, lập trình viên viết loạt lệnh gần với tiếng Anh sau chương trình dịch thành ngơn ngữ máy

Các ngơn ngữ lập trình cấp cao thiết kế để lập chương trình làm cơng việc tương đối đơn giản tính tốn Các chương trình ban đầu chủ yếu liên quan đến tính tốn khơng địi hỏi nhiều ngơn ngữ lập trình Hơn phần lớn chương trình tương đối ngắn, thường 100 dòng

Khi khả máy tính tăng lên khả để triển khai chương trình phức tạp tăng lên Các ngơn ngữ lập trình ngày trước khơng cịn thích hợp việc lập trình địi hỏi cao Các phương tiện cần thiết để sử dụng lại phần mã chương trình viết khơng có ngơn ngữ lập trình tuyến tính Thật ra, đoạn lệnh thường phải chép lặp lại dùng nhiều chương trình chương trình dài dịng, logic chương trình khó hiểu Chương trình điều khiển để nhảy đến nhiều chỗ mà thường giải thích rõ ràng, làm để chương trình đến chỗ cần thiết

(6)

Lập trình cấu trúc:

Rõ ràng ngơn ngữ với tính cần phải phát triển để tạo ứng dụng tinh vi Vào cuối năm 1960 1970, ngơn ngữ lập trình có cấu trúc đời Các chương trình có cấu trúc tổ chức theo công việc mà chúng thực

Về chất, chương trình chia nhỏ thành chương trình riêng rẽ (cịn gọi hàm hay thủ tục) thực công việc rời rạc trình lớn hơn, phức tạp Các hàm giữ độc lập với nhiều tốt, hàm có liệu logic riêng.Thông tin chuyển giao hàm thông qua tham số, hàm có biến cục mà khơng nằm bên ngồi phạm vi hàm lại truy xuất chúng Như vậy, hàm xem chương trình đặt chung với để xây dựng nên ứng dụng

Mục tiêu cho việc triển khai phần mềm dễ dàng lập trình viên mà cải thiện tính tin cậy dễ bảo quản chương trình Một chương trình có cấu trúc hình thành cách bẻ gãy chức chương trình thành mảnh nhỏ mà sau trở thành hàm Bằng cách cô lập công việc vào hàm, chương trình có cấu trúc làm giảm khả hàm ảnh hưởng đến hàm khác Việc làm cho việc tách vấn đề trở nên dễ dàng Sự gói gọn cho phép viết chương trình sáng sủa giữ điều khiển hàm Các biến tồn cục khơng thay tham số biến cục có phạm vi nhỏ dễ kiểm soát Cách tổ chức tốt nói lên có khả quản lý logic cấu trúc chương trình, làm cho việc triển khai bảo dưỡng chương trình nhanh hữu hiệu

Một khái niệm lớn đưa lập trình có cấu trúc sự trừu tượng hóa

(Abstraction) Sự trừu tượng hóa xem khả quan sát việc mà không cần xem xét đến chi tiết bên Trong chương trình có cấu trúc, cần biết hàm cho làm cơng việc cụ thể đủ Cịn làm mà cơng việc lại thực khơng quan trọng, chừng hàm cịn tin cậy cịn dùng mà khơng cần phải biết thực đắn chức Điều gọi sự trừu tượng hóa theo chức năng(Functional abstraction) tảng lập trình có cấu trúc

(7)

thuộc vào kiểu liệu mà xử lý tăng theo Vấn đề trở rõ ràng cấu trúc liệu chương trình quan trọng chẳng phép tốn thực chúng Điều trở rõ ràng kích thước chương trình tăng Các kiểu liệu xử lý nhiều hàm khác bên chương trình có cấu trúc Khi có thay đổi liệu cần phải thực thay đổi nơi có thao tác tác động chúng Đây cơng việc tốn thời gian hiệu chương trình có hàng ngàn dịng lệnh hàng trăm hàm trở lên

Một yếu điểm việc lập trình có cấu trúc có nhiều lập trình viên làm việc theo nhóm ứng dụng Trong chương trình có cấu trúc, lập trình viên phân cơng viết tập hợp hàm kiểu liệu Vì có nhiều lập trình viên khác quản lý hàm riêng, có liên quan đến kiểu liệu dùng chung nên thay đổi mà lập trình viên tạo phần tử liệu làm ảnh hưởng đến cơng việc tất người cịn lại nhóm Mặc dù bối cảnh làm việc theo nhóm, việc viết chương trình có cấu trúc dễ dàng sai sót việc trao đổi thơng tin thành viên nhóm dẫn tới hậu nhiều thời gian để sửa chữa chương trình

Sự trừu tượng hóa liệu:

Sự trừu tượng hóa liệu(Data abstraction) tác động liệu tương tự trừu tượng hóa theo chức Khi có trừu tượng hóa liệu, cấu trúc liệu phần tử sử dụng mà không cần bận tâm đến chi tiết cụ thể Chẳng hạn số dấu chấm động trừu tượng hóa tất ngơn ngữ lập trình, Chúng ta khơng cần quan tâm cách biểu diễn nhị phân xác cho số dấu chấm động gán giá trị, khơng cần biết tính bất thường phép nhân nhị phân nhân giá trị dấu chấm động Điều quan trọng số dấu chấm động hoạt động đắn hiểu

Sự trừu tượng hóa liệu giúp bận tâm chi tiết không cần thiết Nếu lập trình viên phải hiểu biết tất khía cạnh vấn đề, lúc tất hàm chương trình hàm viết ra, may mắn thay trừu tượng hóa theo liệu tồn sẵn ngơn ngữ lập trình liệu phức tạp số dấu chấm động Tuy nhiên gần đây, người ta phát triển ngôn ngữ cho phép định nghĩa kiểu liệu trừu tượng riêng

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

(8)

ta hiểu mục tiêu chương trình xử lý liệu Suy cho cùng, cơng việc mà máy tính thực thường gọi xử lý liệu Dữ liệu thao tác liên kết với mức (cịn gọi mức thấp), thứ địi hỏi thứ có mục tiêu cụ thể, chương trình hướng đối tượng làm tường minh mối quan hệ Lập trình hướng đối tượng liên kết cấu trúc liệu với thao tác, theo cách mà tất thường nghĩ giới quanh Chúng ta thường gắn số hoạt động cụ thể với loại hoạt động đặt giả thiết quan hệ

Ví dụ1.1: Chúng ta biết xe có bánh xe, di chuyển đổi hướng cách quẹo tay lái Tương tự thế, một loại thực vật có thân gỗ Một xe cây, mà khơng phải xe, giả thiết mà làm với xe khơng thể làm với Chẳng hạn, thật vô nghĩa muốn lái cây, cịn xe lại chẳng lớn thêm tưới nước cho

Lập trình hướng đối tượng cho phép sử dụng trình suy nghĩ với khái niệm trừu tượng sử dụng chương trình máy tính Một mẫu tin (record) nhân đọc ra, thay đổi lưu trữ lại; cịn số phức dùng tính tốn Tuy khơng thể lại viết số phức vào tập tin làm mẫu tin nhân ngược lại hai mẫu tin nhân lại cộng với Một chương trình hướng đối tượng xác định đặc điểm hành vi cụ thể kiểu liệu, điều cho phép biết cách xác có kiểu liệu khác

Chúng ta tạo quan hệ kiểu liệu tương tự khác chương trình hướng đối tượng Người ta thường tự nhiên phân loại thứ, thường đặt mối liên hệ khái niệm với khái niệm có, thường thực suy diễn chúng quan hệ Hãy quan niệm giới theo kiểu cấu trúc cây, với mức xây dựng chi tiết cho hệ sau so với hệ trước Đây phương pháp hiệu để tổ chức giới quanh Các chương trình hướng đối tượng làm việc theo phương thức tương tự, chúng cho phép xây dựng các cấu liệu thao tác dựa cấu có sẵn, mang theo tính cấu mà chúng dựa đó, thêm vào tính

Lập trình hướng đối tượng cho phép tổ chức liệu chương trình theo cách tương tự nhà sinh học tổ chức loại thực vật khác Theo cách nói lập trình đối tượng, xe hơi, cối, số phức, sách gọi

lớp(Class)

(9)

nó gọi mộtđối tượng(Object) Các hàm định nghĩa hợp lệ lớp gọi cácphương thức(Method) chúng hàm xử lý liệu đối tượng lớp Mộtthực thể (Instance) vật thể có thực bên nhớ, thực chất đối tượng (nghĩa đối tượng cấp phát vùng nhớ)

Mỗi đối tượng có riêng cho phần tử liệu lớp gọi cácbiến thực thể(Instance variable) Các phương thức định nghĩa lớp gọi đối tượng lớp Điều gọi gửi thông điệp

(10)

Một số khái niệm lập trình hướng đối tượng

Trong phần này, tìm hiểu khái niệm đóng gói, tính kế thừa tính đa hình Đây khái niệm bản, tảng tư tưởng lập trình hướng đối tượng Hiểu khái niệm này, bước đầu tiếp cận với phong cách lập trình mới, phong cách lập trình dựa vào đối tượng làm tảng mà quan điểm che dấu thơng tin thơng qua sư đóng gói quan điểm trung tâm vấn đề

Sự đóng gói (Encapsulation)

Sự đóng gói chế ràng buộc liệu thao tác liệu thành thể thống nhất, tránh tác động bất ngờ từ bên Thể thống gọi đối tượng Trong đối tượng, liệu hay thao tác hay hai riêng (private)

chung(public) đối tượng Thao tác hay liệu riêng thuộc đối tượng truy cập thành phần đối tượng, điều nghĩa thao tác hay liệu riêng truy cập phần khác chương trình tồn ngồi đối tượng Khi thao tác hay liệu chung, phần khác chương trình truy cập nó định nghĩa đối tượng Các thành phần chung đối tượng dùng để cung cấp giao diện có điều khiển cho thành thành riêng đối tượng

Cơ chế đóng gói phương thức tốt để thực chế che dấu thông tin so với ngơn ngữ lập trình cấu trúc

Tính kế thừa (Inheritance)

Chúng ta xây dựng lớp từ lớp cũ thông qua kế thừa Một lớp gọi làlớp dẫn xuất(derived class), thừa hưởng liệu phương thức lớp sở (base class) ban đầu Trong lớp này, bổ sung thành phần liệu phương thức vào thành phần liệu phương thức mà thừa hưởng từ lớp sở Mỗi lớp (kể lớp dẫn xuất) có số lượng lớp dẫn xuất Qua cấu kế thừa này, dạng hình lớp hình thành Dạng lớp trông giống gia phả lớp sở cịn gọi làlớp cha(parent class) lớp dẫn xuất gọi lớp con(child class)

(11)

xuất bản, quyền nhà xuất Các ấn phẩm lấy ra, cất đọc Đó phương thức thực ấn phẩm Tiếp định nghĩa hai lớp dẫn xuất tên tạp chí sách Tạp chí có tên, số ký phát hành chứa nhiều tác giả khác Các thành phần liệu tương ứng với yếu tố đặt vào định nghĩa lớp tạp chí Tạp chí cần có phương thức đặt mua Các thành phần liệu xác định cho sách bao gồm tên (các) tác giả, loại bìa (cứng hay mềm) số hiệu ISBN Như thấy, sách tạp chí có chung đặc trưng ấn phẩm, có thuộc tính riêng chúng

Hình 1.1: Lớp ấn phẩm lớp dẫn xuất

Với tính kế thừa, công xây dựng lại từ đầu lớp mới, cần bổ sung để có lớp dẫn xuất đặc trưng cần thiết

Tính đa hình (Polymorphism)

(12)

đổi cách thực phương thức mà thừa hưởng từ lớp sở Một thông điệp gởi đến đối tượng lớp sở, dùng phương thức định nghĩa cho lớp sở Nếu lớp dẫn xuất định nghĩa lại phương thức thừa hưởng từ lớp sở thơng điệp có tên với phương thức này, gởi tới đối tượng lớp dẫn xuất gọi phương thức định nghĩa cho lớp dẫn xuất

Ví dụ 1.3: Xét lại ví dụ 1.2, thấy tạp chí và sách phải có khả lấy Tuy nhiên phương pháp lấy cho tạp chí có khác so với phương pháp lấy cho sách, kết cuối giống Khi phải lấy tạp chí, phải sử dụng phương pháp lấy riêng cho tạp chí (dựa tra cứu) lấy sách lại phải sử dụng phương pháp lấy riêng cho sách (dựa hệ thống phiếu lưu trữ) Tính đa hình cho phép xác định phương thức để lấy tạp chí hay sách Khi lấy tạp chí dùng phương thức lấy dành riêng cho tạp chí, cịn lấy sách sử dụng phương thức lấy tương ứng với sách Kết cần tên phương thức dùng cho hai công việc tiến hành hai lớp dẫn xuất có liên quan, việc thực phương thức thay đổi tùy theo lớp

(13)(14)

Các ngôn ngữ vài ứng dụng OPP

Xuất phát từ tư tưởng ngôn ngữ SIMULA67, trung tâm nghiên cứu Palo Alto (PARC) hãng XEROR tập trung 10 năm nghiên cứu để hồn thiện ngơn ngữ OOP với tên gọi Smalltalk Sau ngôn ngữ OOP đời Eiffel, Clos, Loops, Flavors, Object Pascal, Object C, C++, Delphi, Java…

(15)

Quá trình phát triển C++

LỊCH SỬ CỦA C++

Vào năm đầu thập niên 1980, người dùng biết C++ với tên gọi "C with Classes" mô tả hai báo Bjarne Stroustrup (thuộc AT&T Bell Laboratories) với nhan đề "Classes: An Abstract Data Type Facility for the C Language" "Adding Classes to C : AnExercise in Language Evolution" Trong cơng trình này, tác giả đề xuất khái niệm lớp, bổ sung việc kiểm tra kiểu tham số hàm, chuyển đổi kiểu số mở rộng khác vào ngôn ngữ C Bjarne Stroustrup nghiên cứu mở rộng ngôn ngữ C nhằm đạt đến ngôn ngữ mơ (simulation language) với tính hướng đối tượng

Trong năm 1983, 1984, ngôn ngữ "C with Classes" thiết kế lại, mở rộng trình biên dịch đời Và từ đó, xuất tên gọi "C++" Bjarne Stroustrup mô tả ngôn ngữ C++ lần báo có nhan đề "Data Abstraction in C" Sau vài hiệu chỉnh C++ công bố rộng rãi "The C++ Programming Language" Bjarne Stroustrup xuất đánh dấu diện thực C++, người lập tình chuyên nghiệp từ có ngơn ngữ đủ mạnh cho án thực tiễn

(16)

Các mở rộng cử C++

CÁC MỞ RỘNG CỦA C++

Các từ khóa C++

Để bổ sung tính vào C, số từ khóa (keyword) đưa vào C++ ngồi từ khóa có C Các chương trình C sử dụng tên trùng với từ khóa cần phải thay đổi trước chương trình dịch lại C++ Các từ khóa :

asm catch class delete friend inline new operator private protected public template this throw try virtual

Cách ghi thích

C++ chấp nhận hai kiểu thích Các lập trình viên C quen với cách thích /*…*/ Trình biên dịch bỏ qua thứ nằm /*…*/

Ví dụ 2.1: Trong chương trình sau :

CT2_1.CPP 1: /*2: Chương trình in số từ đến 9.3: */4: #include <iostream.h>5: int main()6: {7: int I;8: for(I = 0; I < 10 ; ++ I)// - 99:

cout<<I<<"\n"; // In - 910: return 0;11: }

(17)

Hình 2.1: Kết ví dụ 2.1

Nói chung, kiểu thích /*…*/ dùng cho khối thích lớn gồm nhiều dịng, cịn kiểu // dùng cho thích dịng

Dịng nhập/xuất chuẩn

Trong chương trình C, thường sử dụng hàm nhập/xuất liệu printf() scanf() Trong C++ dùng dòng nhập/xuất chuẩn (standard input/output stream) để nhập/xuất liệu thơng qua hai biến đối tượng dịng (stream object)

coutcin

Ví dụ 2.2:Chương trình nhập vào hai số Tính tổng hiệu hai số vừa nhập

CT2_2.CPP 1: #include <iostream.h>2: int main()3: {4: int X, Y;5: cout<< "Nhap vao mot so X:";6: cin>>X;7: cout<< "Nhap vao mot so Y:";8:

cin>>Y;9: cout<<"Tong cua chung:"<<X+Y<<"\n";10: cout<<"Hieu cua chung:"<<X-Y<<"\n";11: return 0;12: }

(18)

1 Chúng ta tìm hiểu kỹ dịng nhập/xuất chương Chúng tachạy ví dụ 2.2, kết hình 2.2

Hình 2.2: Kết ví dụ 2.2

Hình 2.3: Dịng nhập/xuất liệu

Cách chuyển đổi kiểu liệu

Hình thức chuyển đổi kiểu C tương đối tối nghĩa, C++ trang bị thêm cách chuyển đổi kiểu giống lệnh gọi hàm

Ví dụ 2.3:

(19)

ổi kiểu theo cách C++7: cout<< "X = "<<X<<"\n";8: cout<< "Y = "<<Y<<"\n";9: cout<< "Z = "<<Z<<"\n";10: return 0;11: }

Chúng tachạy ví dụ 2.3 , kết hình 2.4

Hình 2.4: Kết ví dụ 2.3

Vị trí khai báo biến

Trong chương trình C địi hỏi tất khai báo bên phạm vi cho trước phải đặt đầu phạm vi Điều có nghĩa tất khai báo toàn cục phải đặt trước tất hàm khai báo cục phải tiến hành trước tất lệnh thực Ngược lại C++ cho phép khai báo linh hoạt vị trí phạm vi cho trước (không thiết phải đầu phạm vi), xen kẽ việc khai báo liệu với câu lệnh thực

Ví dụ 2.4:Chương trình mơ máy tính đơn giản

CT2_4.CPP 1: #include <iostream.h>2: int main()3: {4: int X;5: cout<< "Nhap vao so thu nhat:";6: cin>>X;7: int Y;8: cout<< "Nhap vao so thu hai:";9: cin>>Y;10: char Op;11: cout<<"Nhap vao toan tu (+-*/):";12: cin>>Op;13: switch(Op)14: {15: case ‘+’:16: cout<<"Ket qua:"<<X+Y<<"\n";17: break;18: case ‘-’:19: cout<<"Ket qua:"<<X-Y<<"\n";20: break;21: case ‘*’:22: cout<<"Ket qua:"<<long(X)*Y<<"\n";23: break;24: case ‘/’:25: if (Y)26: cout<<"Ket qua:"<<float(X)/Y<<"\n";27:

(20)

Trong chương trình xen kẻ khai báo biến với lệnh thực dòng đến dòng 12 Chúng tachạy ví dụ 2.4, kết hình 2.5

Hình 2.5: Kết ví dụ 2.4

Khi khai báo biến chương trình, biến có hiệu lực phạm vi chương trình kể từ vị trí xuất Vì sử dụng biến khai báo bên

Các biến const

Trong ANSI C, muốn định nghĩa có kiểu định dùng biến

const(vì dùng#definethì tạo khơng có chứa thơng tin kiểu) Trong C++, biếnconstlinh hoạt cách đáng kể:

C++ xem const #define muốn dùng có tên chương trình Chính dùngconst để quy định kích thước mảng đoạn mã sau:

const int ArraySize = 100; int X[ArraySize];

Khi khai báo biếnconst C++ phải khởi tạo giá trị ban đầu ANSI C khơng thiết phải làm (vì trình biên dịch ANSI C tự động gán trị zero cho biếnconstnếu không khởi tạo giá trị ban đầu cho nó) Phạm vi biến const ANSI C C++ khác Trong ANSI C, biến

http://voer.edu.vn/c/36564990

Ngày đăng: 08/03/2021, 17:20

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan