Tải bản đầy đủ (.doc) (183 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (857.55 KB, 183 trang )

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


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


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 Khn hình hàm........................................................................................125
8.2 Khn hình lớp..........................................................................................130

BÀI TẬP CHƯƠNG 7......................................................................................133
Phụ lục 1..............................................................................................................135
Phụ lục 2..............................................................................................................137
3


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.
Chương 2: Các thành phần của lớp.
Chương 3: Lớp.
Chương 4: Toán tử định nghĩa chồng.
Chương 5: Thừa kế.
Chương 6: Hảm ảo và tí nh t ươ ng ứng bội .
Chương 7:Hàm, lớp template.
Phụ lục 1 trình bầy các phép tốn trong C++ và thứ tự ưu của chúng.
4


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


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:
- Về kiến thức:
+ Trình bày được các đặc trưng cơ bản: tính đóng gói, tính kế thừa, tính
tương ứng bội của phương pháp lập trình hướng đối tượng;
+ Tiếp cận được phương pháp lập trình hướng đối tượng.
- Về kỹ năng:
+ Phân tích, cài đặt và xây dựng được chương trình theo phương pháp hướng
đối tượng trên một ngơn ngữ lập trình cụ thể;
+ Viết chương trình và thực hiện chương trình trong máy tính.
- Về năng lực tự chủ và trách nhiệm:

+ Bố trí làm việc khoa học đảm bảo an toàn cho người và phương tiện học
tập.
Nội dung của môn học:
Chương 1: Phương pháp hướng đối tượng.
Chương 2: Các thành phần của lớp.
Chương 3: Lớp.
Chương 4: Toán tử định nghĩa chồng.
Chương 5: Thừa kế.
Chương 6: Hảm ảo và tí nh t ươ ng ứng bội .
Chương 7:Hàm, lớp template.

6


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 tồn với máy tính.
Nội dung:

Chương 1: PHƯƠNG PHÁP HƯỚNG ĐỐI TƯỢNG
1.1 Các phương pháp lập trình.
1.1.1 Lập trình cấu trúc.
Tư tưởng chính của lập trình cấu trúc là tổ chức chương trình thành các chương
trình con. Mỗi chương trình con đảm nhận xử lý một công việc nhỏ trong tồn bộ hệ
thống. Mỗi chương trình con này lại có thể chia nhỏ thành các chương trình con nhỏ
hơn. Quá trình phân chia như vậy tiếp tục diễn ra cho đến các chương trình con nhỏ
nhận được đủ đơn giản, đó là q trình làm mịn dần. Các chương trình con tương đối
độc lập với nhau. Ngơn ngữ lập trình thể hiện rõ nét nhất phương pháp lập trình cấu
trúc là ngơn ngữ lập trình Pascal. Trong ngơn ngữ lập trình C chỉ có một loại chương
trình con là hàm.
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 tốn. Hàm cần có đối và các
biế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 tồn bộ Các
ngôn ngữ như C, PASCAL, FOXPRO là các ngôn ngữ cho phép triển khai.
phương pháp lập trình cấu trúc.
Một chương trình cấu trúc gồm các cấu trúc dữ liệu (như biến, mảng, bản ghi) và
các hàm, thủ tục.
Nhiệm vụ chính của việc tổ chức thiết kế chương trình hướng cấu trúc là tổ chức

7


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 tốn trên được viết như sau:
#include <stdio.h>
#include <conio.h>
#include <math.h>
float x[100],y[100];
float do_dai(int i, int j)
{
return sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2));
}
void nhapsl(int n)
{
int i;
for (i=1;i<=n;++i)
{
printf("\nNhap toa do x, y cua diem thu %d : ",i);
scanf("%f%f",&x[i],&y[i]);
}
}
void main()
{
int n,i,j,imax,jmax; float
d,dmax; printf("\nSo
diem N= ");
scanf("%d",&n);

nhapsl(n);
dmax=do_dai(1,2); imax=1;jmax=2;
for (i=1;i<=n-1;++i)

8


for (j=i+1;j<=n;++j)
{
d=do_dai(i,j);
if (d>dmax)
{
dmax=d;
imax=i;
jmax=j;
}
}
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();
}
Tuy nhiên khi sử dụng phương pháp lập trình cấu trúc thì Chương trình=Cấu
trúc dữ liệu+Giải thuật. Điều này địi hỏi người lập trình phải có kiến thức vững về
cấu trúc dữ liệu. Khó khăn gặp phải trong lập trình cấu trúc là giải thuật của chương
trình phụ thuộc rất chặt chẽ vào cấu trúc dữ liệu, do đó chỉ cần có một thay đổi nhỏ ở
cấu trúc dữ liệu cũng có thể làm thay đổi giải thuật và như vậy phải viết lại chương
trình. Điều này khơng thể thích hợp khi phải xây dựng một dự án phần mềm lớn.
Phương pháp lập trình hướng đối tượng ra đời khắc phục được nhược điểm này của lập
trình cấu trúc.
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ộng
của cấu trúc trong C (struct) bằng cách đưa thêm vào các phương thức (method) hay
cò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 ngồi (phía
dướ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ại
trừ quy tắc sau: khi xây dựng một phương thức bên ngồi định nghĩa lớp thì trước tên
phươ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


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 truy
nhậ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ến
kiể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ác
phươ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ương
thứ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ằm
thiế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ẫn

xuấ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


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 hố 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 hố 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
Số lượng các dữ liệu
Chỉ số phần tử tiếp theo
Các hoạt động với các ngăn xếp
Khởi tạo
Thêm một phần tử vào ngăn xếp
Đếm số phần tử của ngăn xếp
Xóa phần tử trong ngăn xếp

Lập trình cấu trúc
Khai báo cấu trúc thích hợp

Khai báo các thao tác thích hợp

11


typedef struct CStashTag
{
int m_nSize;
int m_nQuantity;
int m_nNext;
} CStash;

void initialize(CStash* s, int size);
void cleanup(CStash* s);
int add(CStash* s, const void* element);
void* fetch(CStash* s,int index);
int count(CStash* s);
void inflate(CStash* s, int increase);

Lập trình hướng đối tượng
struct CStash {
//dữ liệu
int m_nSize;
Int m_nQuantity;
int m_nNext;
// Hàm
void initialize(int size);

void cleanup();
int add(const void* element);
void *fetch(int index);
int count();
void inflate(int increase);
};
+Bao gói thông tin: Là cơ chế ràng buộc dữ liệu và các thao tác trên dữ liệu
thành thể thống nhất.
Bao gói gồm:
 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 ngồ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


Đa hình thực hiện bởi:
 Định nghĩa lại
 Nạp chồng
Cơ chế dựa trên sự kết gán:

 Kết gán sớm
 Kết gán muộn
-

Ư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ủa
bà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ác
vấn đề của bài tố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ặp
lại trong q 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ây
dự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 nhau
nê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ải
dự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ời
gian xây dựng hệ thống và tăng năng suất lao động.
+Ngun lý đóng gói hay che giấu thơng tin giúp người lập trình tạo ra được
những chương trình an tồn khơng bị thay đổi bởi những đoạn chương trình
khác.
+Có thể xây dựng được ánh xạ các đối tượng của bài tốn vào đối tượng chương
trì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àm
cho việc mô tả giao diện với các hệ thống bên ngồ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, Visual
C++, 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 tố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


- 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ó đ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ụng
biến, mảng).
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <alloc.h>
class daydiem
{
public:
int n;
float *x,*y;
float do_dai(int i, int j)
{
return sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2));

}
void nhapsl(void);
};
void daydiem::nhapsl(void)
{
int i;
printf("\nSo diem N= ");
scanf("%d",&n);
x=(float*)malloc((n+1)*sizeof(float));
y=(float*)malloc((n+1)*sizeof(float));
for (i=1;i<=n;++i)
{
printf("\nNhap toa do x, y cua diem thu %d : ",i);
scanf("%f%f",&x[i],&y[i]);
}
}
void main()
{
daydiem p;
p.nhapsl();
int n,i,j,imax,jmax;
float d,dmax; n=p.n;

14


dmax=p.do_dai(1,2); imax=1;jmax=2;
for (i=1;i<=n-1;++i)
for (j=i+1;j<=n;++j)
{

d=p.do_dai(i,j);
if (d>dmax)
{
dmax=d;
imax=i;
jmax=j;
}
}
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ần
thiế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 tố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


BÀI TẬP CHƯƠNG 1
1. Viết chương trình in ra màn hình 2 chữ cái đầu của tên bạn. Ví dụ tên Thủy  In ra
2 chữ TH:
TTTTTTTTT

HT
HT
HHHHHHHHH
T
H
H
T
H
H
2. Viết chương trình nhập hai số nguyên và hiển thị tổng, hiệu, tích và thương của số
nguyên vừa nhập.
3. Viết chương trình nhập tháng và năm từ bàn phím (chú ý có kiểm tra điều kiện cho
tháng và năm) . Sau đó đưa ra số ngày tương ứng của tháng thuộc năm đã nhập.
4. Viết chương trình nhập chiều cao h từ bàn phím, sau đó hiển thị các tam giác hình
sao có chiều cao h như dưới đây (trên DOS). Chú ý có kiểm tra điều kiện của h:
2<=h<=24. Nếu h nằm ngoài đoạn trên, yêu cầu người dùng nhập lại.
*

H
H


*

**
***

***
*****

****

*******

*****

*********

h

5. Viết chương trình nhập n số thực từ bàn phím. Sau đó hỏi người sử dụng muốn sắp
xếp theo chiều tăng dần hay giảm dần rồi đưa ra danh sách số thực của mảng đã sắp
xếp theo yêu cầu của người sử dụng.

16


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 tồ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:
class <tên lớp> {
private:
<khai báo các thành phần riêng trong từng đối tượng>
public:
<khai báo các thành phần công cộng của từng đối tượng>
};
<định nghĩa của các hàm thành phần chưa được định nghĩa bên trong khai báo
lớp>
...
Ví dụ:
/*point.cpp*/
#include <iostream.h>
#include <conio.h>
class point {
/*khai báo các thành phần dữ liệu riêng*/
private:
int x,y;
/*khai báo các hàm thành phần công cộng*/
public:
void init(int ox, int oy);


17


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: "<}
void main() {
clrscr();
point p;
p.init(2,4); /*gọi hàm thành phần từ đối tượng*/
p.display();
p.move(1,2);
p.display();
getch();
}
Chú ý:

- Có thể khai báo trực tiếp các hàm thành phần bên trong khai báo lớp. Tuy vậy
điều đó đơi khi làm mất mỹ quan của chương trình nguồn, do vậy người ta thường sử
dụng cách khai báo các hàm thành phần ở bên ngoài khai báo lớp. Khi đó ta sử dụng
cú pháp:
<tên kiểu giá trị trả lại> <tên lớp>::<tên hàm> (<danh sách tham số>) {
<nội dung >
}
2.2 Hàm CONSTRUCTOR (Hàm tạo).
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


- 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.
Một lớp có thể có nhiều hàm tạo.
Ví dụ 1:
class Point {
int a, b;
public:
Point (int x,int y) {a = x; b = y;} // constructor
void OffsetPt (int,int);
};
Ví dụ 2:
/*point.cpp*/
#include <iostream.h>
#include <conio.h>

class point {
/*khai báo các thành phần dữ liệu riêng*/
int x;
int y;
/*khai báo các hàm thành phần chung*/
public:
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) {
x += dx;
y += dy;
}
void point::display() {
cout<<"Toa do: "<}
void main() {
clrscr();
point a(5,2); /*Sử dụng hàm tạo*/
a.display();
a.move(-2,4); a.display();
point b.init(1,-1);b.display();
clrscr();
}

19



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.
Ví dụ 3 :
/*Định nghĩa lại lớp point*/
class point {
int x,y;
public:
point() {x=0;y=0;}
point(int ox, int oy) {x=ox;y=oy;} /*hàm tạo có hai tham số*/
void move(int,int);
void display();
};
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ố
Ví dụ 4:
/*point4.cpp*/
#include <iostream.h>
#include <conio.h>

class point {
/*khai báo các thành phần dữ liệu*/
int x;
int y;
public:
/*khai báo các hàm thành phần*/
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


void display();
};
/*phân biệt các thành phần hàm với các hàm thơng thường nhờ tên lớp và tốn tử ::*/
void point::move(int dx,int dy) {
x+=dx;
y+=dy;
}
void point::display() {
cout<<“Toa do : “<}
void main() {
clrscr();
point a(5,2); //OK
a.display();
a.move(-2,4); a.display();
point b[10]; /*Hết lỗi vì hàm tạo không tham số được gọi để tạo các đối

tượng thành phần của b*/
getch();
}
- Hàm tạo có thể được khai báo với các tham số có giá trị ngầm định
Ví dụ 5:
/*Định nghĩa lại lớp point*/
class point {
int x,y;
public:
point(int ox, int oy = 0) {x=ox;y=oy;}
/*hàm tạo có hai tham số*/
void move(int,int);
void display();
};
point a; /*Lỗi: khơng có hàm tạo ngầm định hoặc hàm tạo với các tham số có giá trị
ngầm định*/
point b(1); //Đối số thứ hai nhận giá trị 0
point c(2,3); //Đúng
Nhận xét:
+ Trong ví dụ 5, chỉ thị point b(1); có thể được thay thế bằng cách viết khác
như sau:
point b=1;

21


+ Cách viết thứ hai hàm ý rằng đã có chuyển kiểu ngầm định từ số nguyên 1
thà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ên

trong 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 :
class Point {
int xVal, yVal;
public:
Point (int x = 0, int y = 0);
//...
};
với hàm tạo dựng đã có này thì các định nghĩa sau là hoàn toàn hợp lệ:
Point p1; // như là: p1(0, 0)
Point p2(10); // như là: p2(10, 0)
Point p3(10, 20);
- Việc sử dụng không đúng các đối số mặc định có thể dẫn đến sự tối nghĩa
khơng mong muốn.
Ví dụ 7: với lớp đã cho
class Point {
int xVal, yVal;
public:
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


point d; // Gọi tới hàm tạo không đối.
// Kết quả d.x=0, d.y=0
point u(200,100,4); // Gọi tới hàm tạo có đối.
// Kết quả u.x=200, u.y=100
point v(300,250); // Gọi tới hàm tạo có đối.
// Kết quả v.x=300, v.y=250
point 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ượng
chỉ có ý nghĩa khi tham chiếu tới một đối tượng nào đó đã được khai báo trước đó.
Ví dụ 8:
/*point8.cpp*/
#include <iostream.h>
#include <conio.h>
class point {
/*khai báo các thành phần dữ liệu*/

int x;
int y;
public:
/*khai báo các hàm thành phần */
point(int ox = 1,int oy =0) {x=ox;y=oy;}
void move(int dx,int dy) ;
void display();
};
void point::move(int dx,int dy){
x+=dx;
y+=dy;
}
void point::display() {
cout<<“Toa do : “<}
void main() {
clrscr();
point a(2,5); //OK

23


point &ra=a;
a.display();
ra.display();
ra.move(2,3);
a.display();
point b[10];/*Trong trường hợp này các đối tượng thành phần của b được tạo ra
nhờ hàm thiết lập được gọi với hai tham số có giá trị ngầm định là 1 và 0.*/
getch();

}
Kết quả in ra :

Toa do : 2 5
Toa do : 2 5
Toa do : 4 8

2.2.4 Dùng hàm Constructor trong cấp phát bộ nhớ.
- Con trỏ đối tượng được khai báo như sau:
<kiểu dữ liệu> *ptr;
- Con trỏ đối tượng có thể nhận giá trị là địa chỉ của các đối tượng có cùng kiểu
lớp:
ptr = &a;
- Khi đó có thể gọi các hàm thành phần của lớp point thông qua con trỏ như sau:
ptr->display();
ptr->move(-2,3);
- 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:
ptr = new point(3,2);
sẽ xin cấp phát một đối tượng động với hai thành phần x và y nhận giá trị tương
ứng là 2 và 3. Kết quả này được minh chứng qua lời gọi hàm:
ptr->display();
Toa do : 3 2

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


class DIEM_DH
{
private:
int x,y,m;
public:
// Hàm bạn dùng để in đối tượng DIEM_DH
friend void in(DIEM_DH d)
{
cout <<"\n " << d.x << " "<< d.y<<" " << d.m ;
}
// Phương thức dùng để in đối tượng DIEM_DH
void in()
{
cout <<"\n " << x << " "<< y<<" " << m ;
;
}
//Hàm tạo không đối
DIEM_DH()
{
x=y=0;
m=1//Hàm tạo có đối, đối m1 có giá trị mặc định là 15 (mầu trắng)
DIEM_DH(int x1,int y1,int m1=15);
};
//Xây dựng hàm tạo

DIEM_DH::DIEM_DH(int x1,int y1,int m1)
{
x=x1; y=y1; m=m1;
}
void main()
{
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


×