Tải bản đầy đủ (.pdf) (185 trang)

Giáo trình Lập trình hướng đối tượng (Nghề: Lập trình máy tính) - CĐ Cơ Giới Ninh Bì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 (1.27 MB, 185 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, năm 2018
TUN 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 ngun 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 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à  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.
3


Chương 3: Lớp.
Chương 4: Tố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.
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 hồ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 2018
Tham gia biên soạn
                1. Chủ biên ­ Đồn Xn Luận
               2. Phạm Thị Thoa
              3. Nguyễn Anh Văn

4


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 tồ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: Tố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. 
5


Chương  7:Hàm, l ớ p template.

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.  Q  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.

6



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 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 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 tồ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 
ngun 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]);

7


}
}
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)
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ở 

8


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

9


+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).
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 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 để 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 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 hố 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 hố:

10


 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
typedef struct CStashTag
{
int m_nSize;
int m_nQuantity;
int m_nNext;
} CStash;

Khai báo các thao tác thích hợp
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);

11


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
Đ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 tố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 ngun 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 

12


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 t 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 tố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 ngun 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 hồ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 u cầu bài tốn gồm:
­ 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)
{


13


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;
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.

14


­     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ở.

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      H                    H T
 H                    H T
  HHHHHHHHH 
T
  H                     H 
T
H                     H
2. Viết chương trình nhập hai số ngun và hiển thị tổng, hiệu, tích và thương của 
số ngun 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.

15


*                           *
**                       ***

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 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 ngồ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 ngồ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.


18


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.
­     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 ngồ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(); 

19


point b.init(1,­1);b.display(); 
clrscr();
}
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:

20


/*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) ; 
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

21


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;
+ Cách viết thứ hai hàm ý rằng đã có chuyển kiểu ngầm định từ số ngun 
1
thành đối tượng kiểu point
­     Như là các hàm tồ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à hồn tồ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

22


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ụ:
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) ;

23


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 
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 tố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>);

24


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

25



×