L�P TRÌNH HƯ�NG Đ�I TƯ�NG BỘ TÀI CHÍNH HỌC VỆN TÀI CHÍNH 2018 LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG TS VŨ BÁ ANH Ths HÀ VĂN SANG sanghv@hvtc edu vn A C A D E M Y O F F I N A N C E LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Trang[.]
Trang 2Trang 2
Mục lục
MỞ ĐẦU 5
Chương 1 GIỚI THIỆU VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 6
1 Tổng quan về các kỹ thuật lập trình 6
1.1 Lập trình tuyến tính 6
1.2 Lập trình cấu trúc 6
1.3 Lập trình mô đun hoá 7
1.4 Nhược điểm của lập trình hướng thủ tục 8
1.5 Lập trình hướng đối tượng 9
2 Một số khái niệm cơ bản 11
2.1 Hệ thống hướng đối tượng 11
2.2 Đối tượng (Objects) 12
2.3 Thuộc tính (Attribute) và Phương thức (method) 12
2.4 Lớp (Class) và lớp con (SubClass) 12
2.5 Lớp trừu tượng 13
2.6 Truyền thông điệp 13
2.7 Sự trừu tượng hoá (abstraction) 14
2.8 Sự đóng gói (encapsulation) 14
2.9 Tính kế thừa 14
1.10 Tính đa hình 15
3 Các bước cần thiết để thiết kế chương trình theo hướng đối tượng 16
4 Các ưu điểm của lập trình hướng đối tượng 16
5 Một số ngôn ngữ lập trình hướng đối tượng 16
6 Một số ứng dụng của lập trình hướng đối tượng 18
Chương 2 GIỚI THIỆU VỀ C++ 19
1 Lịch sử của C++ 19
2 Các mở rộng của C++ 19
2.1 Lời chú thích 19
Trang 3Trang 3
2.2 Từ khoá mới 20
2.3 Kiểu dữ liệu char và int 20
2.4 Khai báo biến 20
2.5 Chuyển đổi và ép kiểu 21
2.6 Vào ra trong C++ 22
2.7 Cấp phát và giải phóng bộ nhớ 26
2.8 Biến tham chiếu 28
2.9 Hằng tham chiếu 29
2.10 Truyền tham số cho hàm theo tham chiếu 30
2.11 Hàm với tham số có giá trị mặc định 34
2.12 Các hàm nội tuyến 35
2.13 Hàm tải bội 36
Chương 3 LỚP VÀ ĐỐI TƯỢNG 39
1 Xây dựng lớp và đối tượng 39
1.1 Khai báo lớp 39
1.2 Khai báo đối tượng 42
1.3 Truy xuất các thành phần của đối tượng 43
2 Các phương thức 46
2.1 Hàm khởi tạo - Constructor 46
2.2 Hàm hủy – Destructor 49
3 Đa năng hóa tóan tử 51
4 Mảng và con trỏ của lớp 57
5 Các hàm bạn và lớp bạn 59
5.1 Hàm bạn (friend function) 59
5.2 Lớp bạn 61
6 Thành phần tĩnh 63
6.1 Các thành phần dữ liệu tĩnh 63
6.2 Các hàm thành viên tĩnh 64
7 Thành phần hằng 67
7.1 Dữ liệu hằng 67
Trang 4Trang 4
7.2 hàm thành phần (phương thức hằng) 69
8 Thành phần là đối tượng 69
Chương 4 TÍNH KẾ THỪA 72
1 Khái niệm 72
2 Khai báo lớp dẫn xuất 73
3 Các kiểu kế thừa 75
4 Định nghĩa lại quyền truy xuất 78
5 Hàm khởi tạo và hàm hủy của lớp cơ sở 81
6 Đa kế thừa 84
7 Lớp cơ sở ảo và nhập nhằng trong đa kế thừa 86
Chương 5 TÍNH ĐA HÌNH 90
1 Phương thức ảo 90
2 Phương thức ảo thuần túy và lớp trừu tượng 97
Chương 6 KHUÔN HÌNH MẪU 101
1 Template 101
a Khuôn hình hàm 101
b Khuôn hình lớp 105
Trang 5Trang 5
MỞ ĐẦU
Cơ sở lập trình học phần 2 (CSLT) là một trong hai môn học quan trọng nhất của sinh viên chuyên ngành Tin học Tài chính Kế toán, ngành Hệ thống thông tin quản lý thuộc Học viện Tài chính; môn học này giúp cho sinh viên nắm bắt được những lý thuyết chung về các khái niệm, phương pháp lập trình hướng đối tượng, sau đó, giúp sinh viên thực hành cài đặt chương trình cho các bài toán trong lĩnh vực Tài chính Kê toán trong Hệ thống thông tin kế toán của mỗi đơn vị
Môn học “Cơ sở lập trình” dành cho sinh viên chuyên ngành Tin học Tài chính
Kế toán được chia thành 3 học phần sau đây:
- CSLT HP1: Nhập môn Cơ sở lập trình học phần 1 Học phần nhập môn sẽ trình bày những lý thuyết chung về CSLT, đặc biệt tập trung giới thiệu kỹ thuật lập trình hướng cấu trúc được sử dụng phổ biến nhất hiện nay
- CSLT HP2: Lập trình hướng đối tượng với C++ Học phần này sẽ trang bị cho sinh viên những nội dung cần thiết để xây dựng một chương trình hướng đối tượng trong lĩnh vực tài chính kế toán
- CSLT HP3: Lập trình ứng dụng web Học phần này trong bị cho sinh viên những kiến thức cơ bản để lập trình trên môi trường web thông qua mạng máy tình; học phần cũng giúp cho sinh viên có khả năng tích hợp các hệ quản trị CSLT HP2 với các phần mềm khác (C#, VB, NET, Crystal Report) để quản trị một ứng dụng trên mạng máy tính
Bài giảng gốc “CSLT HP2” được biên soạn nhằm phục vụ cho nhu cầu học tập
và nghiên cứu của sinh viên chuyên ngành Tin học Tài chính Kế toán, khoa Hệ thống thông tin kinh tế, Học viện Tài chính
Trong quá trình biên soạn Bài giảng gốc “CSLT học phần 2”, ở chương 1, được
Tiến sĩ Vũ Bá Anh (chủ biên), trình bày những kiến thức cơ bản để làm nền tảng cho
lập trình cấu trúc và lập trình hướng đối tượng Trong các chương từ chương 2 đến chương 6, Thạc sỹ Hà Văn Sang (đồng chủ biên) sẽ trình bày những kiến thức tổng
quan về lập trình hướng đối tượng, các điểm mới của ngôn ngữ lập trình C++, các khái niệm cơ bản về lớp, đối tượng, tính kế thừa, đa hình và khuôn hình mẫu Trong mỗi chương đó, sẽ giới thiệu lý thuyết chung về một thành phần trong hướng đối tượng, sau đó lấy các ví dụ minh họa cho việc xây dựng thành phần tương ứng trong quá trình xây dựng phần mềm tài chính Kế toán
Trang 6Trang 6
Chương 1 GIỚI THIỆU VỀ LẬP TRÌNH HƯỚNG ĐỐI
TƯỢNG
Lập trình hướng đối tượng (Object-Oriented Programming-OOP), hay còn
gọi là lập trình định hướng đối tượng, là kỹ thuật lập trình hỗ trợ công nghệ đối
tượng OOP được xem là là cách tiếp cận mới, hiệu quả hơn trong việc giải quyết các vấn đề Nó giúp tăng năng suất, đơn giản hoá độ phức tạp khi bảo trì cũng như mở rộng phần mềm bằng cách cho phép lập trình viên tập trung vào các đối tượng phần mềm ở bậc cao hơn Mục đích của OOP là giúp người lập trình giảm nhẹ các thao tác viết mã, cho phép tạo ra các ứng dụng mà các yếu tố bên ngoài có thể tương tác với các ứng dụng đó như là tương tác với các đối tượng vật lý
Lập trình hướng đối tượng dễ học bởi nó dựa trên một vài khái niệm đơn giản nhưng hết sức mạnh Trước khi tìm hiểu về kỹ thuật lập trình hướng đối tượng là gì chúng ta hãy tìm hiểu về lịch sử của các kỹ thuật lập trình
1 Tổng quan về các kỹ thuật lập trình
1.1 Lập trình tuyến tính
Lập trình tuyến tính thường dùng để viết các chương trình nhỏ và đơn giản trong đó chỉ gồm một chương trình chính Chương trình chính gồm một dãy tuần tự các câu lệnh dùng để thay đổi dữ liệu Các ngôn ngữ lập trình thời kỳ này được thiết
kế để giải các bài tính toán tương đối đơn giản Phần lớn các chương trình này ngắn, ít hơn 100 dòng Cũng theo thời gian các ngôn ngữ này không đáp ứng được việc triển khai phần mềm do các khuyết điểm của lập trình tuyến tính:
- Các ngôn ngữ này không có khả năng sử dụng lại các đoạn mã
- Không có khả năng kiểm soát phạm vi truy xuất của dữ liệu
- Mọi dữ liệu trong chương trình đều là toàn cục (global)
Hình 1.1 Lập trình tuyến tính
1.2 Lập trình cấu trúc
Lập trình cấu trúc ra đời vào những cuối năm 1970 Các chương trình cấu trúc thường được tổ chức theo công việc mà chúng thường thực hiện Chương trình được chia nhỏ thành các chương trình con riêng rẽ, mỗi chương trình con thực hiện một
Trang 7Trang 7
nhiệm vụ Các chương trình con này thường được gọi là hàm hoặc thủ tục Các hàm thường độc lập với nhau, mỗi hàm có dữ liệu riêng Thông tin được chuyển giao giữa các hàm thông qua các tham số và các biến toàn cục Các biến cục bộ trong hàm thì không thể truy xuất bởi hàm khác Ở lập trình cấu trúc đã bắt đẫu xuất hiện khái niệm trừu tượng hoá (Abstraction) Sự trừu tượng hoá có thể xem như khả năng quan sát các
sự vật mà không quan tâm tới chi tiết bên trong nó Trong một chương trình có cấu trúc ta chỉ quan tâm xem hàm hoặc thủ tục đó là được gì, cần tham số gì chứ không quan tâm tới việc hàm đó thực hiện các lệnh gì Các ngôn ngữ hiện nay đều hỗ trợ kỹ thuật lập trình có cấu trúc bởi các chương trình có cấu trúc dễ viết, dễ bảo dưỡng hơn
so với chương trình không có cấu trúc Một số ngôn ngữ cấu trúc điển hình là C, Pascal, Foxpro…
Hình 1.2 Lập trình cấu trúc
1.3 Lập trình mô đun hoá
Với lập trình mô đun, các thủ tục có chung một chức năng được nhóm lại với nhau thành các môđun riêng lẻ Lúc này một chương trình không chỉ là một phần đơn
mà bây giờ nó được chia thành một số phần nhỏ hơn Các phần này tương tác với nhau thông qua việc gọi thủ tục
Trang 8Trang 8
Hình 1.3 Lập trình mô đun hóa
Mỗi môđun có thể có dữ liệu của riêng nó Điều này cho phép mỗi môđun quản lý một dữ liệu trong nó, dữ liệu này được sửa đổi bởi việc gọi các thủ tục
1.4 Nhược điểm của lập trình hướng thủ tục
Một hệ thống phần mềm theo cách tiếp cận lập trình truyền thống được xem như là dãy các công việc cần thực hiện như đọc dữ liệu, tính toán, xử lý, lập báo cáo
và in ấn kết quả … Mỗi công việc đó sẽ được thực hiện bằng một hàm hoặc thủ tục nhất định Đó chính là các tiếp cận lập trình hướng thủ tục Ta có thể thấy trọng tâm của cách tiếp cận này là các hàm chức năng Lập trình hướng thủ tục sử dụng kỹ thuật phân ra hàm chức năng theo cách tiếp cận từ trên xuống để tạo ra cấu trúc phân cấp Các ngôn ngữ lập trình bậc cao như COBOL, FORTRAN, PASCAL, C là những ngôn ngữ lập trình hướng thủ tục Những nhược điểm chính của lập trình hướng thủ tục là:
Chương trình khó kiểm soát và khó khăn trong việc bổ sung, nâng cấp Chương trình được xây dựng theo cách tiếp cận hướng thủ tục thực chất là danh sách các câu lệnh mà theo đó máy tính cần thực hiện Danh sách các lệnh đó được tổ chức thành từng nhóm theo đơn vị cấu trúc của ngôn ngữ lập trình và được gọi là hàm/thủ tục Trong chương trình có nhiều hàm/thủ tục, thường thì có nhiều thành phần dữ liệu quan trọng sẽ được khai báo là toàn cục (global) để các hàm có thể truy nhập, đọc và làm thay đổi giá trị của biến toàn cục Điều này làm cho chương trình khó kiểm soát, nhất
là đối với các chương trình lớn, phức tạp thì vấn đề càng trở nên khó khăn hơn Khi ta
Trang 9Trang 9
muốn thay đổi, bổ sung cấu trúc dữ liệu dùng chung cho một số hàm/thủ tục thì phải thay đổi hầu như tất cả các hàm/thủ tục liên quan tới dữ liệu đó
Chương trình chưa loại bỏ được các đoạn mã lặp lại
Mô hình được xây dựng theo cách hướng thủ tục không mô tả đầy đủ, trung thực hệ thống trong thực tế
Phương pháp tổ chức hướng thủ tục đặt trọng tâm vào hàm là hướng tới hoạt động sẽ không thực sự tương ứng với các thực thể trong hệ thống của thế giới thực
1.5 Lập trình hướng đối tượng
Tiếp cận hướng đối tượng
Trong thế giới thực xung quanh chúng ta là những đối tượng, đó là những thực thể có mối quan hệ với nhau Ví dụ các phòng trong một công ty kinh doanh được xem như những đối tượng Các phòng ở đây có thể là: phòng quản ký, phòng bán hàng, phòng kế toán, phòng tiếp thị… Mỗi phòng ngoài những cán bộ đảm nhiệm công việc
cụ thể, còn có những dữ liệu riêng về thông tin nhân viên, doanh số bán hàng, hoặc các
dữ liệu khác có liên quan tới bộ phận đó Việc phân chia các phòng chức năng trong công ty sẽ tạo điều kiện dễ dàng cho việc quản lý Mỗi nhân viên trong phòng sẽ điều khiển và xử lý dữ liệu của phòng đó Ví dụ phòng kế toán phụ trách về lương bổng của nhân viên trong công ty Nếu bạn đang ở bộ phận tiếp thị và cần thông tin chi tiết về lương của đơn vị mình thì bạn gửi yêu cầu về phòng kế toán Với cách làm việc này bạn đảm bảo là chỉ có nhân viên của bộ phận kế toán được quyền truy cập dữ liệu và cung cấp thông tin cho bạn Điều này cũng cho thấy rằng, không có người nào thuộc
bộ phận khác có thể truy cập và thay đổi dữ liệu của bộ phận kế toán Khái niệm như thế về đối tượng hầu như có thể được mở rộng trong mọi lĩnh vực đời sống xã hội và hơn thế nữa – đối với việc tổ chức chương trình Mọi ứng dụng có thể được định nghĩa như một tập các thực thể hoặc các đối tượng, sao cho quá trình tái tạo những suy nghĩ của chúng ta là gần sát với thế giới thực
Lập trình hướng đối tượng là phương pháp lập trình lấy đối tượng làm nền tảng
để xây dựng thuật giải, xây dựng chương trình Đối tượng được xây dựng trên cơ sở gắn cấu trúc dữ liệu với các phương thức (hàm/thủ tục) sẽ thể hiện được đúng cách mà chúng ta suy nghĩ, bao quát về thế giới thực Lập trình hướng đối tượng cho phép ta kết hợp những tri thức bao quát về các quá trình với những khái niệm trừu tượng được
Trang 10Trang 10
Lập trình hướng đối tượng không cho phép dữ liệu chuyển động tự do trong hệ thống Dữ liệu được gắn chặt với từng phương thức thành các vùng riêng mà các phương thức đó tác động lên và nó được bảo vệ cấm việc truy nhập tuỳ tiện từ bên ngoài Lập trình hướng đối tượng cho phép phân tính bài toán thành lập các thực thể được gọi là các đối tượng và sau đó xây dựng các dữ liệu cũng với các phương thức xung quanh các đối tượng đó
Lập trình OOP cho phép bạn tạo đối tượng, các đối tượng này được lưu trữ trong các thư viện và được sử dụng lại trong một công việc khác Nó tiết kiệm thời gian cho người lập trình, nhiều công ty phần mềm xây dựng các thư viện này và bán ra thị trường, từ đó giúp cho người lập trình dễ dàng tạo ra các ngôn ngữ lập trình hướng đối tượng sử dụng "OPC" (Other People's Code)
OOP cho phép bạn định nghĩa đối tượng trong đó bao gồm cấu trúc dữ liệu và các phương thức xử lý dữ liệu
Một phương thức có thể được định nghĩa như là một chương trình có cấu trúc nhỏ bên trong đối tượng Các phương thức này xác định đối tượng sẽ hoạt động ra sao Một lớp lại định nghĩa một đối tượng, khái niệm đóng kín dữ liệu và phương thức trong một đối tượng được gọi là sự đóng kín hay đóng gói
Lập trình hướng đối tượng bao gồm kỹ thuật lập trình cấu trúc và cấu trúc dữ liệu nâng cao Nó giúp cho người phát triển có thể kết hợp dữ liệu và các phương thức vào một thành phần gọi là đối tượng Nói cách khác, một đối tượng bao gồm mọi thứ cần thiết cho việc thực thi một tập hợp các hàm, bao gồm cả dữ liệu
Hình 1.4 Lập trình hướng đối tượng
Lập trình hướng đối tượng là kỹ thuật lập trình mới Nó được thiết kế nhằm tiết kiệm thời gian và tiền bạc thông qua việc cho phép người lập trình sử dụng lại các đoạn mã chương trình Khả năng tái sử dụng này được hoàn thiện qua tính kế thừa Có
Trang 11mã và sửa lại theo mục đích của bạn
Tóm lại lập trình hướng đối tượng có những đặc tính sau:
1 Tập trung vào dữ liệu thay cho các phương thức
2 Chương trình được chia thành các lớp đối tượng
3 Các cấu trúc dữ liệu được thiết kế sao cho đặc tả được các đối tượng
4 Các phương thức xác định trên các vùng dữ liệu của đối tượng được gắn với nhau trên cấu trúc dữ liệu đó
5 Dữ liệu được bao đóng, che giấu và không cho phép các thành phần bên ngoài truy nhập tự do
6 Các đối tượng trao đổi với nhau thông qua các phương thức
7 Dữ liệu và các phương thức mới có thế dễ dàng bổ sung vào đối tượng nào đó khi cần thiết
8 Các chương trình được thiết kế theo cách tiếp cận từ dưới lên (bottom-up)
2 Một số khái niệm cơ bản
Câu hỏi đầu tiên mà chúng ta sẽ tìm hiểu là: Lập trình hướng đối tượng là gì? Câu trả lời rất đơn giản: Đó là lập trình mà trong đó có sự mô tả chính xác các đối tượng trong thế giới thực, bằng cách sử dụng các đối tượng trong mã nguồn Lập trình hướng đối tượng đơn giản là mô hình hoá chính xác thế giới thực trong chương trình
Nó cho phép sử dụng lại mã nguồn Cốt yếu của lập trình hướng đối tượng là tạo ra một đối tượng, chứa các thuộc tính và phương thức Ví dụ chiếc ô tô là một đối tượng,
nó có các thuộc tính như màu, số cánh cửa, nó cũng có các phương thức như đi, dừng Bạn có thể sử dụng đối tượng bằng cách thực thi một hoặc các phương thức của nó Một đối tượng trong lập trình cũng tương tự như vậy Nó có các thuộc tính được mô tả
và tất nhiên thức bạn có thể sử dụng các phương của nó
Có bốn khái niệm cơ bản trong lý thuyết lập trình hướng đối tượng Đó là các khái niệm: sự trừu tượng hoá, sự đóng gói, kế thừa và đa hình Nhưng trước khi tìm hiểu các khái niệm này chúng ta hãy tìm hiểu các khái niệm trong một hệ thống hướng đối tượng:
2.1 Hệ thống hướng đối tượng
Hệ thống hướng đối tượng là một hệ thống có các đặc điểm sau:
- Gồm tập hợp các đối tượng (objects) Đối tượng là sự bao gói của hai loại thành phần là dữ liệu và các thao tác trên chính dữ liệu đó
Trang 122.2 Đối tượng (Objects)
Đối tượng mô tả sự vật tồn tại hoặc khái niệm trong đời sống thực tế Ví dụ, một đối tượng có thể mô tả một khái niệm vật lý như nhân viên, công ty, hoặc ô tô, nó cũng mô
tả một cái gì đó trừu tượng như hình tròn, điểm, …Về phương diện lập trình đối tượng được định nghĩa là một sự thể hiện của một lớp Nó còn được định nghĩa là phiên bản trong khi thi hành của lớp Đối tượng chính là các thực thể cơ bản trong hệ thống hướng đối tượng Mỗi đối tượng được bao hàm bởi tên và trạng thái (dữ liệu của nó) Các biến trong đối tượng chỉ rõ mọi thông tin về trạng thái của đối tượng (state) còn các phương thức thì xác định nó có thể sử dụng như thế nào (behavior) Ví dụ, một cái xe đạp có một trạng thái (số bánh xe và bánh răng), và các thao tác (phanh, tăng tốc, giảm tốc, thay đổi bánh răng)
2.3 Thuộc tính (Attribute) và Phương thức (method)
Thuộc tính (Attribute)
Thuộc tính của một lớp bao gồm các biến, hằng hay tham số nội tại của nó Biến có vai trò quan trọng nhất bởi chúng có thể bị thay đổi trong suốt quá trình tồn tại, hoạt động của đối tượng Các thuộc tính có thể được xác định kiểu và kiểu của chúng có thể là các kiểu dữ liệu cổ điển hay đó là một lớp đã định nghĩa từ trước Các thuộc tính còn được gọi là dữ liệu thành viên
Phương thức (method)
Là các hàm nội tại của đối tượng (hay lớp).Tuỳ theo đặc tính mà người lập trình gán cho, một phương thức có thể chỉ được gọi bên trong các hàm khác của lớp đó, có thể cho phép các câu lệnh bên ngoài lớp gọi tới nó, hay chỉ cho phép các lớp có quan
hệ đặc biệt như là quan hệ lớp con, và quan hệ bạn bè (friend) được phép gọi tới nó Mỗi phương thức đều có thể có kiểu trả về, chúng có thể trả các kiểu dữ liệu cổ điển hay trả về một kiểu là một lớp đã được định nghĩa từ trước Một tên gọi khác của
phương thức của một lớp là hàm thành viên
2.4 Lớp (Class) và lớp con (SubClass)
Lớp (Class)
Một lớp là một bản thiết kế hoặc bản mẫu dùng để định nghĩa các biến (dữ liệu)
và phương thức (lệnh) cho tất cả các đối tượng cùng loại Lớp sử dụng như là một kiểu
do người dùng định nghĩa Do đó một lớp định nghĩa kiểu dữ liệu giống như kiểu dữ
Trang 13"hinh_phang" được định nghĩa không có dữ liệu nội tại và chỉ có các phương pháp (hàm nội tại) "tinh_chu_vi", "tinh_dien_tich" Nhưng vì lớp hình_phẳng này chưa xác định được đầy đủ các đặc tính của nó (cụ thể các biến nội tại là toạ độ các đỉnh nếu là
đa giác, là đường bán kính và toạ độ tâm nếu là hình tròn, ) nên nó chỉ có thể được viết thành một lớp trừu tượng Sau đó, người lập trình có thể tạo ra các lớp con chẳng hạn như là lớp "tam_giac", lớp "hinh_tron", lớp "tu_giac", Và trong các lớp con này người viết mã sẽ cung cấp các dữ liệu nội tại (như là biến nội tại r làm bán kính và hằng số nội tại Pi cho lớp "hinh_tron" và sau đó viết mã cụ thể cho các phương pháp
"tinh_chu_vi" và "tinh_dien_tich")
2.6 Truyền thông điệp
Thông điệp: là phương tiện để đối tượng này chuyển tới đối tượng khác, yêu cầu đối tượng thực hiện một trong số các phương thức Một thông điệp bao gồm 3 phần:
- Handle của đối tượng đích (đối tượng chủ)
- Tên phương thức cần thực hiện
- Các thông tin cần thiết khác (các đối số)
Khi hệ thống yêu cầu một đối tượng nào đó thực hiện một phương thức thì hệ thống sẽ gửi thông báo và các tham số cần thiết cho đối tượng đó Sau khi kiểm tra thông báo đó là hợp lệ hàm tương ứng với phương thức đó sẽ được gọi thực hiện
Trang 14Trang 14
2.7 Sự trừu tượng hoá (abstraction)
Sự trừu tượng hoá đã có trong lập trình cấu trúc khi chuyển sang hướng đối tượng nó trở thành một khái niệm rất quan trọng
Đây là khả năng của chương trình bỏ qua hay không chú ý đến một số khía cạnh của thông tin mà nó đang trực tiếp làm việc lên, nghĩa là nó có khả năng tập trung vào những cốt lõi cần thiết Nói cách khác sự trừu tượng hoá được xem như việc quan sát một sự vật hiện tượng mà không cần biết các chi tiết không quan trọng bên trong
nó (trừu tượng hoá dữ liệu) và không quan tâm tới nó làm thế nào để thực hiện công việc (sự trừu tượng hoá chức năng – Functional Abstraction) Người ta thường phân nhóm sự vật, hiện tượng theo thuộc tính và hành vi, chỉ quan tâm tới những đặc điểm quan trọng và bỏ qua các chi tiết không liên quan
2.8 Sự đóng gói (encapsulation)
Sự đóng gói (Encapsulation) bao gồm hai khái niệm là sự bao đóng và che giấu thông tin Nó là cơ chế ràng buộc dữ liệu và các thao tác trên dữ liệu thành một thể thống nhất gọi là lớp Tính chất này không cho phép người sử dụng các đối tượng thay đổi trạng thái nội tại của một đối tượng Chỉ có các thao tác nội tại của đối tượng cho phép thay đổi trạng thái của nó Việc cho phép môi trường bên ngoài tác động lên các
dữ liệu nội tại của một đối tượng theo cách nào là hoàn toàn tuỳ thuộc vào người lập trình Đây là tính chất đảm bảo sự toàn vẹn của đối tượng
Sự đóng gói cho phép người lập trình quyết định cái gì sẽ được che giấu, cái gì sẽ được xuất hiện Các ưu điểm của sự đóng kín là:
2.9 Tính kế thừa
Lớp bao gồm các khái niệm có quan hệ chặt chẽ với nhau Lớp có thể được sử dụng để tạo ra các lớp khác thông qua việc kế thừa
Kế thừa là một kỹ thuật cho phép người lập trình có được các lớp từ các lớp sẵn
có Lớp nhận được hay còn gọi là lớp dẫn xuất (derived class) sẽ kế thừa các phương thức và dữ liệu của lớp cha (lớp cơ sở - base class), sau đó lớp này có thể bố sung các phương thức hoặc định nghĩa lại các phương thức mà nó kế thừa Các phương thức cha sẽ không bị ảnh hưởng bởi những sự sửa đổi này
Trang 15Trang 15
Ví dụ, sự khác nhau của các loại xe đạp như xe đạp leo núi, xe đua, …là chúng
kế thừa các thuộc tính cơ bản của một chiếc xe đạp nhưng có những sự thay đổi về cấu tạo để thích ứng với mục đích sử dụng Ví dụ, xe đạp leo núi sẽ có thêm các bánh răng Hình sau thể hiện sự kế thừa
Xe đạp
Xe leo núi Xe đua Xe 2 người đạp
Hình 1.5 Lập trình hướng đối tượng
1.10 Tính đa hình
Khái niệm đa hình thường được chỉ ra thông qua từ khoá “Một giao diện nhiều phương thức” “one interface, multiple methods” Nó đơn giản là khả năng đưa một phương thức có cùng tên trong các lớp con Các phương thức riêng lẻ có thể được thực thi các nhiệm vụ giống nhau nhưng cũng có thể khác khi kiểu của các đối số hoặc số lượng đối số đưa vào khác nhau Hay nói cách khác đó là khả năng một thông điệp có thể thay đổi cách thực hiện của nó theo lớp cụ thể của đối tượng nhận thông điệp
Ví dụ như việc in tất cả các thuộc tính của một chiếc xe đạp Thì với những loại
xe khác nhau việc in các thuộc tính cũng sẽ khác Bằng việc sử dụng tính đa hình, các phương thức khác nhau có thể đặt cùng tên nhưng chỉ cần khác đối số
Bản chất của tính đa hình là dựa trên sự kết nối (binding), đó chính là quá trình gắn một phương thức với một hàm cụ thể Khi sử dụng tính đa hình cho các phương thức thì trình biên dịch chưa thể xác định hàm nào sẽ tương ứng với phương thức nào sẽ được gọi Khi một đối tượng nhận một thông điệp cần xác định thông điệp đó tương ứng với hàm thành phần nào sẽ thực thi hàm thành phần đó Có hai loại kết nối là kết nối sớm và kết nối muộn Kết nối muộn hay còn gọi là kết nối lúc chạy (runtime binding) là việc kết nối khi chạy chương trình, tức là lúc chạy chương trình hàm cụ thể mới được xác định và gọi thực hiện
Kết gán sớm là việc kết gán một thông báo với một hàm và thời điểm kết gán là lúc biên dịch
Trang 161 Xác định các dạng đối tượng (lớp) của bài toán
2 Tìm kiếm các đặc tính chung (dữ liệu chung) trong các dạng đối tượng này, những gì chúng cùng nhau chia sẻ
3 Xác định lớp cơ sở dựa trên cơ sở các đặc tính chung của các dạng đối tượng
4 Từ lớp cơ sở xây dựng các lớp dẫn xuất chứa các thành phần, những đặc tính, những đặc tính không chung còn lại của các dạng đối tượng Ngoài ra, ta còn đưa ra các lớp có quan hệ với lớp cơ sở và lớp dẫn xuất
4 Các ưu điểm của lập trình hướng đối tượng
Cách tiếp cận hướng đối tượng giải quyết được nhiều vấn đề tồn tại trong quá trình phát triển phần mềm và tạo ra được những sản phẩm phần mềm có chất lượng cao Những ưu điểm chính của lập trình hướng đối tượng là:
1 Thông qua nguyên lý kế thừa, có thể loại bỏ những đoạn chương trình lặp lại trong quá trình mô tả và mở rộng khả năng sử dụng các lớp đã được xây dựng
2 Chương trình được xây dựng từ những đơn thể trao đổi với nhau nên việc thiết
kế và lập trình sẽ được thực hiện theo qui trình nhất định chứ không phải dựa vào kinh nghiệm và kỹ thuật như trước Điều này đảm bảo rút ngắn được thời gian xây dựng hệ thống và tăng năng suất lao động
3 Nguyên lý che giấu thông tin giúp người lập trình tạo ra được những đoạn
chương trình an toàn không bị thay đổi những đoạn chương trình khác
4 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 của chương trình
5 Cách tiếp cận thiết kế đặt trọng tâm vào đối tượng, giúp chúng ta xây dựng được mô hình chi tiết và gần với dạng cài đặt hơn
6 Những hệ thống hướng đối tượng dễ mở rộng, nâng cấp thành những hệ thống lớn hơn
7 Kỹ thuật truyền thông báo trong việc trao đổi thông tin giữa các đối tượng giúp cho 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
8 Có thể quản lý được độ phức tạp của những sản phẩm phần mềm
Không phải trong hệ thống hướng đối tượng nào cũng có tất cả các tính chất trên Khả năng có các tính chất đó còn phụ thuộc vào lĩnh vực ứng dụng của dự án tin học và vào phương pháp thực hiện của người phát triển phần mềm
5 Một số ngôn ngữ lập trình hướng đối tượng
Ngôn ngữ OOP đầu tiên là ngôn ngữ Smalltalk, sau đó các ngôn ngữ như Object Pascal, Oject C, C++, Delphi, Java được ra đời
Trang 17Trang 17
Lập trình hướng đối tượng không là đặc quyền của một ngôn ngữ nào đặc biệt Cũng giống như lập trình có cấu trúc, những khái niệm trong lập trình hướng đối tượng có thể cài đặt trong những ngôn ngữ lập trình như C hoặc Pascal, Tuy nhiên, đối với những chương trình lớn thì vấn đề lập trình sẽ trở nên phức tạp Những ngôn ngữ được thiết kế đặc biệt, hỗ trợ cho việc mô tả, cài đặt các khái niệm của phương pháp hướng đối tượng được gọi chung là ngôn ngữ đối tượng Dựa vào khả năng đáp ứng các khái niệm về hướng đối tượng, ta có chia ra làm hai loại:
1 Ngôn ngữ lập trình dựa trên hướng đối tượng
2 Ngôn ngữ lập trình hướng đối tượng
Lập trình dựa trên đối tượng là kiểu lập trình hỗ trợ chính cho việc bao gói, che giấu thông tin và định danh các đối tượng Lập trình dựa trên đối tượng có các đặc tính sau:
Bao gói dữ liệu
Cơ chế che giấu và truy nhập dữ liệu
Tự động tạo lập và xoá bỏ đối tượng
Phép toán tải bội
Ngôn ngữ hỗ trợ cho kiểu lập trình trên được gọi là ngôn ngữ lập trình trên đối tượng Ngôn ngữ lớp này không hỗ trợ cho việc thực hiện kế thừa và liên kết động chẳng hạn như Ada là ngôn ngữ dựa trên đối tượng
Lập trình hướng đối tượng là kiểu lập trình dựa trên đối tượng và bổ sung thêm nhiều cấu trúc để cài đặt những quan hệ về kế thừa và liên kết động Vì vậy đặc tính của lập trình hướng đối tượng có thể viết ngắn gọn như sau:
Các đặc tính dựa trên đối tượng + kế thừa + liên kết động
Ngôn ngữ hỗ trợ cho những đặc tính trên được gọi là ngôn ngữ lập trình hướng đối tượng, ví dụ như C++, Smalltalk, Object Pascal
Việc chọn ngôn ngữ để cài đặt phần mềm phụ thuộc nhiều vào các đặc tính và yêu cầu của bài toán ứng dụng, vào khả năng sử dụng lại của những chương trình đã
có và vào tổ chức của nhóm tham gia xây dựng phần mềm
Tóm lại, khi lựa chọn một ngôn ngữ lập trình hướng đối tượng bạn cần xem xét các yếu tố sau:
Trang 18Trang 18
- Tốc độ thực thi
- Quản lý bộ nhớ
- Truy cập tới các thư viện có sẵn
- Khả năng tạo ra những ứng dụng độc lập, có khả năng phân phối
6 Một số ứng dụng của lập trình hướng đối tượng
Lập trình hướng đối tượng đang được ứng dụng để phát triển phần mềm trong nhiều lĩnh vực khác nhau Trong số đó, có ứng dụng quan trọng và nổi tiếng nhất hiện nay là hệ điều hành Windows của hãng Microsoft được phát triển dựa trên kỹ thuật lập trình hướng đối tượng Một số lĩnh vực ứng dụng chính của kỹ thuật lập trình hướng đối tượng bao gồm:
- Những hệ thống làm việc theo thời gian thực
- Trong lĩnh vực mô hình hoá hoặc mô phỏng các quá trình
- Các cơ sở dữ liệu hướng đối tượng
- Những hệ siêu văn bản, multimedia
- Lĩnh vực trí tuệ nhân tạo và các hệ chuyên gia
- Lập trình song song và mạng nơron
- Những hệ tự động hoá văn phòng và trợ giúp quyết định
Trang 19có một số thành phần là được viết bằng ngôn ngữ BCPL
Ngôn ngữ lập trình C++ được phát minh bởi Bjarne Stroustroup C++ bắt đầu năm 1979 với phiên bản đầu tiên gọi là "C with classes" - C có lớp, cái tên này có vẻ không hợp lý nên đã đổi thành C++ Phiên bản đầu tiên của C++ được sử dụng vào tháng 8 năm 1983 tại AT&T Phiên bản thương mại đầu tiên ra mắt năm 1985 Ngôn ngữ C++ chuẩn được nắm giữ bởi ANSI và ISO Đó là lý do tại sao bạn hay nghe thấy C++ chuẩn là ANSI C++ hoặc ISO C++
C++ là gì?
Bạn có thể thấy rằng ngôn ngữ lập trình C được phát triển đầu tiên sau đó C++ mới được phát triển Bạn có thể tự hỏi, C++ nó là cái gì? Nó có mối quan hệ thế nào với C Câu trả lời là: C++ cơ bản là C ở một mức độ mới Sự khác biệt quan trọng duy nhất là C++ hỗ trợ hướng đối tượng Các đoạn mã viết bằng C được dịch và chạy tốt với hầu hết các chương trình dịch của C++ nhưng điều ngược lại không đúng C++ hỗ trợ tất cả các lệnh của C và có mở rộng
2.1 Lời chú thích
Để chú thích trong C ta sử dụng /*…*/ khi đó trình biên dịch sẽ bỏ qua mọi thứ
có trong đó Trong nhiều trường hợp ta chỉ chú thích trên một dòng
Ví dụ:
/* Day la dong chu thich */
Ta thấy việc chú thích như vậy có vẻ mất thời gian, trong C++ đã bổ sung thêm một kiểu chú thích mới bằng cặp //
Trang 20Trang 20
Ví dụ:
// Day la 1 dong chu thich
Kiểu chú thích này thích hợp cho việc chú thích một dòng ngắn Còn để chú thích nhiều dòng ta nên dùng kiểu chú thích cũ /*…*/
2.2 Từ khoá mới
Một số từ khoá đã được bổ đưa vào C++ nhằm bổ sung thêm một số tính năng mới Các từ khoá mới đó là:
Bảng 2.1 Từ khóa mới
protected public template
virtual Trong đó từ khoá new và delete là hai toán tử dùng để quản lý bộ nhớ động thay cho các hàm cấp phát động malloc, free của C Hàm inline cho phép tăng tốc độ thực hiện chương trình Các từ khoá khác như class, public, virtual … bạn sẽ được tìm hiểu
ở các phần sau
Nếu trong chương trình bạn viết bằng C có sử dụng các tên trùng với các từ khoá trên thì bạn phải thay đổi trước khi dịch lại bằng C++ nếu không chương trình dịch sẽ báo lỗi
2.3 Kiểu dữ liệu char và int
Trong C một hằng kí tự được xem là nguyên nên nó có kích thước là 2 byte còn trong C++ hằng kí tự được xem là kiểu char và có kích thước là 1 byte
Ví dụ:
sizeof(‘A’)=sizeof(int)=2
sizeof(‘A’)=sizeof(char)=1
2.4 Khai báo biến
Khi viết chương trình trong C, trước khi sử dụng biến ta phải khai báo và phải đặt ở đầu khối hay đầu chương trình Vị trí biến khác nhau, vị trí sử dụng khác nhau
Trang 21Trang 21
dẫn tới việc kiểm soát chương trình khó khăn Để khắc phục khó khăn này C++ cho phép người lập trình khai báo biến ở bất kỳ nơi nào trước khi sử dụng Phạm vi hoạt động của các biến kiểu này là khối trong đó biến được khai báo
2.5 Chuyển đổi và ép kiểu
C++ cho phép người dùng đổi kiểu một cách rộng rãi, trình biên dịch tự động thực hiện việc chuyển kiểu này:
- Khi gán một giá trị kiểu số vào một biến kiểu khác
- Các kiểu số khác nhau có thể có mặt trong cùng một biểu thức, và đặc biệt là khi truyền đối số cho hàm
Trang 22Trang 22
Khi C++ tự động đổi từ các đối tượng nhỏ thành các đối tượng lớn thì không có vấn đề gì
Ví dụ chuyển từ kiểu short(16 bits) long(32 bits)
Nhưng khi chuyển ngược lại thì có thể có vấn đề:
Ví dụ: long (32bít) short(16bit): có thể mất dữ liệu
Trong trường hợp này trình biên dịch của C++ sẽ phát sinh thông báo đối với các chuyển đổi tự động gây mất dữ liệu
Nếu trong trường hợp không thể tự động chuyển kiểu người lập trình có thể ép kiểu một cách tường minh như sau:
Ép kiểu kiểu cũ (C): myInt = (int) myFloat
Ép kiểu kiểu mới (C++): myInt = int(myFloat)
Phép chuyển kiểu này có dạng như một hàm số chuyển kiểu đang được gọi Cách chuyển kiểu này thường được sử dụng trong thực tế
for (int i=1;i<=n;++i)
s+= float(1)/float(i); //chuyen kieu theo C++
Trang 23Chú ý:
Để nhập một chuỗi không quá n ký tự và lưu vào mảng một chiều a (kiểu char)
có thể dùng hàm cin.get như sau: cin.get(a,n);
Toán tử nhập cin>> sẽ để lại ký tự chuyển dòng’\n’ trong bộ đệm Ký tự này có thể làm trôi phương thước cin.get Để khắc phục tình trạng trên cần dùng phương thức cin.ignore(1) để bỏ qua một kí tự chuyển dòng
Để sử dụng các loại toán tử và phương thức nói trên ta cần khai báo tập tin dẫn hướng iostream.h
Trang 25for (j=0;j<n;++j)
{
if (j==0) cout<<"\n";
Trang 26Trang 26
cout << setw(6)<<a[i][j];
}
cout << "\n\n"<< "Phan tu max:"<< "\n";
cout << "co gia tri ="<<setw(6)<<smax;
cout<<"\nTai hang"<<imax<< " cot "<<jmax;
- Toán tử new để cấp phát bộ nhớ
Toán tử new thay cho hàm malloc() và calloc() của C có cú pháp như sau: new Tên kiểu ;
hoặc new (Tên kiểu);
Trong đó Tên kiểu là kiểu dữ liệu của biến con trỏ, nó có thể là: các kiểu dữ liệu chuẩn như int, float, double, char, hoặc các kiểu do người lập trình định nghĩa như mảng, cấu trúc, lớp, Chú ý: Để cấp phát bộ nhớ cho mảng một chiều, dùng cú pháp như sau:
Biến con trỏ = new kiểu[n];
Trong đó n là số nguyên dương xác định số phần tử của mảng
Ví dụ: float *p = new float; //cấp phát bộ nhớ cho biến con trỏ p có kiểu float
int *a = new int[100]; //cấp phát bộ nhớ để lưu trữ mảng một chiều a
// gồm 100 phần tử
Khi sử dụng toán tử new để cấp phát bộ nhớ, nếu không đủ bộ nhớ để cấp phát, new sẽ trả lại giá trị NULL cho con trỏ Đoạn chương trình sau minh họa cách kiểm tra lỗi cấp phát bộ nhớ:
Trang 282.8 Biến tham chiếu
Trong C có 2 loại biến là: Biến giá trị dùng để chứa dữ liệu (nguyên, thực, ký tự, ) và biến con trỏ dùng để chứa địa chỉ Các biến này đều được cung cấp bộ nhớ và
có địa chỉ C++ cho phép sử dụng loại biến thứ ba là biến tham chiếu C++ cho phép khai báo một biến tham chiếu dùng tham chiếu tới một biến tồn tại trong bộ nhớ Khi biến tham chiếu này được thay đổi thì lập tức biến được tham chiếu cũng thay đổi Đây là một mở rộng rất tiện bởi nó cho phép hàm thao tác trực tiếp trên biến được truyền Biến tham chiếu là một tên khác (bí danh) cho biến đã định nghĩa trước đó Cú pháp khai báo biến tham chiếu như sau:
Kiểu &Biến tham chiếu = Biến;
Biến tham chiếu có đặc điểm là nó được dùng làm bí danh cho một biến (kiểu giá trị) nào đó và sử dụng vùng nhớ của biến này
Trang 29Trang 29
Ví dụ: Với câu lệnh: int a, &tong=a; thì tong là bí danh của biến a và biến tong dùng chung vùng nhớ của biến a Lúc này, trong mọi câu lệnh, viết a hay viết tong đều có ý nghĩa như nhau, vì đều truy nhập đến cùng một vùng nhớ Mọi sự thay đổi đối với biến tong đều ảnh hưởng đối với biến a và ngược lại
Ví dụ: int a, &tong = a;
tong =1; //a=1
cout<< tong; //in ra số 1
tong++; //a=2 ++a; //a=3 cout<<tong; //in ra số 3 Chú ý:
Trong khai báo biến tham chiếu phải chỉ rõ tham chiếu đến biến nào
Biến tham chiếu có thể tham chiếu đến một phần tử mảng, nhưng không cho phép khai báo mảng tham chiếu
Biếu tham chiếu có thể tham gia chiếu đến một hằng Khi đó nó sử dụng vùng nhớ của hằng và có thể làm thay đổi giá trị chứa trong vùng nhớ này
Biến tham chiếu thường được sử dụng làm đối của hàm để cho phép hàm truy nhập đến các tham biến trong lời gọi hàm
2.9 Hằng tham chiếu
Cú pháp khai báo hằng tham chiếu như sau:
const kiểu dữ liệu &biến = biến/hằng
ví dụ:
int n=10;
const int &m=n;
const int &p=123;
hằng tham chiếu có thể tham chiếu đến một biến hoặc một hằng
Trang 30Trang 30
p=p+1; //sai biên dịch sẽ báo lỗi
Hằng tham chiếu cho phép sử dụng giá trị chứa trong một vùng nhớ, nhưng không cho phép thay đổi giá trị này
Hằng tham chiếu thường được sử dụng là tham số của hàm để cho phép sử dụng giá trị của các tham số trong lời gọi hàm, nhưng tránh làm thay đổi giá trị tham số
2.10 Truyền tham số cho hàm theo tham chiếu
Trong C chỉ có một cách truyền dữ liệu cho hàm là truyền theo theo giá trị Chương trình sẽ tạo ra các bản sao của các tham số thực sự trong lời gọi hàm và sẽ thao tác trên các bản sao này chứ không xử lý trực tiếp với các tham số thực sự Cơ chế này rất tốt nếu khi thực hiện hàm trong chương trình không cần làm thay đổi giá trị của biến gốc Tuy nhiên, nhiều khi ta lại muốn những tham số đó thay đổi khi thực hiện hàm trong chương trình C++ cung cấp thêm cách truyền dữ liệu cho hàm theo tham chiếu bằng cách dùng đối là tham chiếu Cách làm này có ưu diểm là không cần tạo ra các bản sao của các tham số, do dó tiết kiệm bộ nhớ và thời gian chạy máy Mặt khác, hàm này sẽ thao tác trực tiếp trên vùng nhớ của các tham số, do đó dễ dàng thay đổi giá trị các tham số khi cần
Trang 33bị mất đi khi kết thúc hàm Do vậy tham chiếu của hàm sẽ không còn ý nghĩa gì nữa
Khi giá trị trả về của hàm là tham chiếu, ta có thể gặp các câu lệnh gán hơi khác thường, trong đó vế trái là một lời gọi hàm chứ không phải là tên của một biến Điều này hoàn toàn hợp lý, bời vì bản thân hàm đó có giá trị trả về là một tham chiếu Nói cách khác, vế trái của lệnh gán có thể là lời gọi đến của một hàm có giá trị trả về là một tham chiếu
Trang 34Kết quả trên màn hình sẽ là : Max a,b : 10
Gia tri cua b va a : 11 7
Gia tri cua b va a va c : 11 7 5
2.11 Hàm với tham số có giá trị mặc định
C++ cho phép xây dựng hàm với các tham số được khởi gán giá trị mặc định Qui tắc xây dựng hàm với tham số mặc định như sau:
Các đối có giá trị mặc định cần là các tham số cuối cùng tính từ trái qua phải
Nếu chương trình sử dụng khái báo nguyên mẫu hàm thì các hàm số mặc định cần được khởi gán trong nguyên mẫu hàm, không được khởi gán lại cho các đối mặc định trong dòng đầu của địng nghĩa hàm
Void f(int a, float x, char *st=”trung tam”,int b=1,double y=1.234);
Void f(int a,float x, char *st=”trung tam”,int b=1, double y=1.234)
{
//Các câu lệnh
}
Trang 35void f(int a, float x, char *st=”TRUNG TAM”, int b=1, double y = 1.234);
thì các lời gọi hàm đúng:
f(3,3.4,”TIN HOC”,10,1.0);//Đầy đủ tham số
f(3,3.4,”ABC”); //Thiếu 2 tham số cuối
f(3,3.4); //Thiếu 3 tham số cuối
Các lời gọi hàm sai:
C++ cho khả năng khắc phục được nhược điểm nói trên bằng cách dùng hàm nội tuyến Để biến một hàm thành hàm nội tuyến ta viết thêm từ khóa inline vào trước khai báo nguyên mẫu hàm
Chú ý: Trong mọi trường hợp, từ khóa inline phải xuất hiện 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 Ví dụ hàm f() trong chương trình sau sẽ không phải là hàm nội tuyến vì inline viết sau lời gọi hàm
Ví dụ:
Trang 36Khô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ương trình dịch chứ không phải là một mệnh lệnh bắt buộc
2.13 Hàm tải bội
Các hàm tải bội là các hàm có cùng một tên và có tập đối khác nhau (về số lượng các đối hoặc kiểu) Khi gặp lời gọi các hàm tải bội thì trình biên dịch sẽ căn cứ vào số lượng và kiểu các tham số để gọi hàm có đúng tên và đúng các tham số tương ứng
Ví dụ:
Chương trình tìm max của một dãy số nguyên và max của một dẫy số thực Trong chương trình có 6 hàm: hai hàm dùng để nhập dãy số nguyên và dãy số thực có tên chung là nhapds, bốn hàm: tính max 2 số nguyên, tính max 2 số thực, tính max của dẫy số nguyên, tính max của dẫy số thực được đặt chung một tên là max
#include <iostream.h>
#include <conio.h>
#include <iomanip.h>
void nhapds(int *x,int n);
void nhapds(double *x,int n);
Trang 37Trang 37
int max(int x,int y);
double max(double x,double y);
void nhapds(int *x,int n)
{
for(int i=0;i<n;++i)
{
cout<<"Phan tu "<<i<<" = "; cin>>x[i];
Trang 38Trang 38
maxd=max(x,nd);
cout<<"\n Max day so nguyen ="<<maxi;
cout<<"\n Max day so thuc="<<maxd;
Ví dụ:
#include <iostream.h>
#include <conio.h>
int f(int a);
void f(int a);
Trang 39Trang 39
Chương 3 LỚP VÀ ĐỐI TƯỢNG
1 Xây dựng lớp và đối tượng
Như chúng ta đã biết lớp là một mô tả trừu tượng của nhóm các đối tượng cùng bản chất, cùng loại, ngược lại mỗi đối tượng lại là một thể hiện cụ thể của một lớp Xét
về phương diện cấu trúc dữ liệu ta có thể xem lớp như là một kiểu dữ liệu mới do người dùng định nghĩa, kiểu dữ liệu này tiên tiến hơn kiểu dữ liệu cấu trúc ở chỗ nó không chỉ có dữ liệu mà còn bao gói cả các thao tác trên dữ liệu đó Lúc này đối tượng chính là các biến thể hiện cho kiểu dữ liệu
Trong C++ ta khai báo lớp với cú pháp như sau:
1.1 Khai báo lớp
class <tên lớp>
{
[ quyền truy xuất:]
<khai báo các thành phần riêng của lớp>
[quyền truy xuất:]
<khai báo cá c thành phần dùng chung>
};
Trong đó:
Tên lớp: do người lập trình đặt và phải tuân theo các qui tắc về tên
Các thành phần của lớp có thể là các dữ liệu, thuộc tính và phương thức
Quyền truy xuất: là khả năng truy xuất thành phần dữ liệu của các hàm thành phần:
o private: chỉ quyền truy xuất trong phạm vi lớp đó (bởi các hàm thành phần trong lớp)
o public: được truy xuất ở mọi nơi nếu đối tượng đó tồn tại
o protected: chỉ được truy xuất trong phạm vi lớp đó và các lớp con kế thừa từ
Trang 40Trang 40
khắc phục nhược điểm này bằng cách cho quyền truy xuất mặc định các thành phần dữ liệu là private, chỉ có các hàm trong lớp mới có quyền truy xuất các thành phần dữ liệu này
Khai báo các thành phần:
- Dữ liệu: tương tự khai báo biến
<kiểu dữ liệu> <tên thành phần>
Chú ý: khi khai báo thành phần dữ liệu không gán giá trị ban đầu, không được khai báo từ khóa extern, register
- Các hàm thành phần:
Có hai cách để khai báo hàm thành phần:
+ Chỉ khai báo nguyên mẫu trong lớp và định nghĩa ngoài lớp
+ Định nghĩa hàm thành phần ngay trong khai báo lớp
Khai báo:
<kiểu hàm> <tên hàm>([khai báo tham số])
Khi khai báo hàm thành phần ngoài khai báo lớp ta dùng cú pháp sau:
<kiểu hàm> <tên lớp>::<tên hàm>([khai báo tham số])
Ví dụ:
Xây dựng cấu trúc dữ liệu mô tả các sinh viên
- Thuộc tính: họ tên, ngày sinh, giới tính, lớp, dtb