NGUYEN TUAN ANH
GIAO TRINH
Kf THUAT LAP TRINH RUN OI TVW BAG C++
TRUONG CAO DENG
CONG NGHE & KINH TE HA NOI |
THU VIEN
Trang 3
MUC LUC
Trang
lo Ðoii›\WECáãẳảảÝŸẢŸ3äẳŸẢäỶŸ3äẳäẳễäÝŸÝÃÝỶ 7
Chuong 1
KHÁI NIỆM VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
1.1 Ý TƯỞNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 0c srre 9
1.2
1.3 1.4
PHÂN BIỆT PHƯƠNG PHÁP LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
VỚI PHƯƠNG PHAP LẬP TRÌNH THEO KIỂU CẤU TRÚC
1.2.1 Phương pháp lập trình hướng thủ tục - POP
1.2.2 Phương pháp lập trình hướng đối tượng - OOP
1.2.3 Mục tiêu của lập trình hướng đối tượng
TƯ DUY HƯỚNG ĐỐI TƯỢNG
ĐẶC BIEM CUA LAP TRINH HUONG ĐỐI TƯỢNG 1.4.1 Tính đĩng kín 1.4.2 Tính kế thừa 1.4.3 Tính đa hình CÂU HỎI VÀ BÀI TẬP Ặ 2022 12.2212 HH mg ri 2.1 242 2.43 24 2.5 2.6 27 2.8 Chương 2 LẬP TRÌNH C VA C++ 0e eo me 00 19 NHẬP, XUẤT DỮ LIỆU : MOT SO PHUONG THUC - HAM NHAP, XUAT 2.2.1 Phương thức getline () 2.2.2 Định dạng khí in lên màn hình e9) 2/1 0/0 -.-.a DIA CHÍ CỦA BIẾN VÀ CON TRỎ
2.5.1 Địa chỉ của biến
2.5.2 Con trỏ sẻ
2.6021 9›e can
CƠ CHẾ HOẠT ĐỘNG KHI GỌI HÀM TRONG C€ VÀ C++ THAM CHIẾU
Trang 42.9 2.10 2.11 3.1 3.2 3.3 34 3.4.2 Đặc điểm của hàm tạo 3.5 3.6 3.7 3.8 3.9 3.10 3.11 CAU HOI VA BAI TAP 4 HÀM TRONG C++
2.9.1 Khai báo nguyên mẫu hàm trong C++
2.9.2 Hàm cĩ đối tham chiếu và hàm trả về tham chiếu
2.9.3 Hàm cĩ đối với giá trị ngầm định NẠP CHỒNG HÀM 2.10.1 Khải niệm về nạp chồng hàm 2.10.2 Sử dụng nạp chồng hàm khi nào? 2.10.3 Lay dia chỉ của các hàm trùng tên HÀM inlin@ HH HH HH Hee Chương 3 LỚP VÀ ĐỐI TƯỢNG
LỚP VÀ ĐỐI TƯỢNG 0Q 201201122 eerree XÂY DỰNG LỚP VÀ KHAI BÁO BIẾN LÀ ĐỐI TƯỢNG
CÁC THUỘC TÍNH private VÀ pub1ie CỦA LỚP HAM TAO VA HAM HUY 3.4.1 Ham tao 3.4.3 Sự khác nhau giữa hàm tạo và các phương thức của lớp 3.4.4 Hàm huỷ
3.4.5 Nhận xét chung giữa hàm tạo và hàm huỷ
CON TRO this ve DOI TUONG LA THAM S6 CUA PHUONG THUG oeecccccscsccsccsceseesscesesees NAP CHONG HAM TAO
3.7.1 Tạo tính linh hoạt khi khai báo biến đối tượng
3.7.2 Xây dựng hàm tạo sao chép để thực hiện khởi tạo và gán giá trị
cho đối tượng là giá trị của đối tượng khác 3.7.3 Hỗ trợ khởi tạo đối tượng là một mảng các giá trị NẠP CHỒNG PHƯƠNG THỨC CỦA LỚP CÁC THÀNH PHẦN TĨNH 3.9.1 Khái niệm về thành phần tĩnh 3.9.2 Khai báo và khởi tạo giá trị cho thành phần tĩnh 3.9.3 Phương thức fĩnh của lớp HÀM BẠN VÀ LỚP BẠN 3.10.1 Hàm tự do là bạn của một lớp 3.10.2 Hàm tự do là bạn của nhiều lớp
3.10.3 Phương thức của một lớp là bạn của một lớp khác
3.10.4 Tất cả các phương thức của một lớp là bạn của một lớp khác
Trang 54.1 42 4.3 44 45 46 47 CÂU 5.1 5.2 5.3 5.4 5.5 5.6 5.7 CÂU HỎI VÀ BÀI TẬP 6.1 6.2 Chương 4 NẠP CHỒNG TỐN TỬ TRÊN LỚP,
THAM CHIẾU VÀ CON TRỎ ĐẾN ĐỐI TƯỢNG
NẠP CHỒNG TỐN TỬ TRÊN LỚP c con 119
LỚP XÂU KÝ TỰ VÀ NẠP CHỒNG PHÉP TỐN "+" ĐỂ GHÉP HAI XÂU 128 NẠP CHỒNG TỐN TỬ NHẬP, XUẤT DU LIỆU CHO MỘT ĐỐI TƯỢNG 130
CON TRO DEN DOI TUONG seston 132 KHAI BAO THAM CHIEU ĐẾN ĐỐI TƯỢNG
TRUYỀN THAM CHIEU CHO HAM oo ccccccceeeeseereneressteseseeneaneenenes
DANH SÁCH LIÊN KẾT CÁC ĐỐI TƯỢNG HOLVA BAL TAP Chương 5 KỸ THUẬT KẾ THỪA LỢI ÍCH CỦA VIỆC KẾ THỪA 22.22nhrrerdrrrrrrree 146 TÍNH KẾ THỪA 5.2.1 Lớp kế thừa 5.2.2 Cách xây dựng lớp kế thừa “
5.2.3 Kế thừa private, pub1ic và thuệc tính protected 148
ĐƠN KẾ THỪA .ìcceerree
HÀM TẠO LỚP KẾ THỪA VÀ HÀM TẠO LỚP CƠ SỞ
THỨ TỰ GỌI HÀM TẠO CỦA LỚP CƠ SỞ VÀ LỚP KẾ THỪA 157 HAM TẠO SAO CHÉP CỦA LỚP CƠ SỞ
ĐA KẾ THỪA ri
Chương 6
TÍNH ĐA HÌNH
PHƯƠNG THỨC ẢO VÀ TÍNH ĐA HÌNH
LIEN KET MUON (Late binding) HAY LIEN KET DONG
(DyNAMic DINING) «0 cee ee eee rete cette terete eee 183 183
Trang 67.1 7.2 743 74 7.5 Chuong 7 KHUƠN MẪU VÀ XỬ LÝ NGOẠI LỆ KHUƠN MẪU HÀM
7.1.1 Khái niệm về khuơn mẫu 7.1.2 Tạo khuơn mẫu hàm 7.1.3 Sử dụng khuơn mẫu hàm 7.1.4 Khuơn mẫu hàm sắp xếp 7.1.5 Ví dụ về sự tìm kiếm
7.1.8 Các tham số kiểu của khuơn mẫu hàm 7.1.7 Khởi tạo các biến cĩ kiểu chuẩn 7.1.8 Nạp chồng các khuơn mẫu hàm
KHUƠN MẪU LỚP
7.2.1 Khái niệm khuơn mẫu 7.2.2 Sử dụng khuơn mẫu lớp
7.2.3 Các tham số trong khuơn mẫu lới
7.2.4 Các tham số biểu thức trong khuơn mẫu lớp
KHUƠN MẪU LỚP CHO DANH SÁCH CÁC PHẦN TỪ CĨ KIỂU CẤU TRÚC ›.220 KHUƠN MẪU VÀ CÁC KIỂU BAN BE
7.4.1 Khai bao cac lớp bạn, hàm bạn
7.4.2 Khai báo bạn của một khuơn mẫu lớp
7.4.3 Khai báo bạn bè của khuơn mẫu hàm và khuơn mẫu lớp
XỬ LÝ NGOẠI LỆ - EXCEPTION 22.222 221211222115E 22t 225 CÂU HỎI VÀ BÀI TẬP L0 2e 227 8.1 8.2 8.3 84 8.5 8.6 87 8.8 8.9 CÂU HỎI VÀ BÀI TẬP Chương 8 TEP TIN TRONG C++
DOC DU LIEU TU TEP DUNG LOP ifstream BOC VA GHi DU LIEU DONG THỜI LÊN TEP
DI CHUYEN CON TRO TEP
NHAP, XUAT KIEU NHI PHAN NHẬP, XUẤT KIỂU VĂN BAN
Trang 7Loi noi aa
Phương pháp lập trình cấu trúc là phương pháp tổ chức và phân chia
chương Irình thành các hàm, thủ tục đơn giản và thực hiện làm mịn dân theo hướng từ trên xuống (Top-down), chúng được dùng để xử lý dữ liệu nhằm giải quyết mộ( số cơng việc cụ thể Người lập trình cĩ thể sử dụng các ngơn ngữ
lập trình nhụ Pascal hoặc C để viết chương trình Với phương thức truyền thống này đã khơng đáp ứng được các bài tốn lớn, các chương trình phức tạp với dữ liệu lớn; chính vì thế phương pháp lập trình hướng đối tượng ra đời
Lập trình hướng đối tượng (Object Orienmed Programming ~ OOP) là một phương pháp mới trên bước đường tiến hố của việc lập trình máy tính,
làm cho chương trình trở nên linh hoạt, tin cậy và dễ phát triển Bước đầu
tiên trong OOP là xác định tất cả các đối tượng muốn thao tác và làm thế
nào để xác định được các yếu tố liên quan giữa chúng Phương pháp OOP tập trung chủ yếu vào dữ liệu Các khái niệm và quy tắc được sử dụng trong
lập trình hướng đối tượng cung cấp những lợi ích quan trọng là các tính chất đĩng gĩi đữ liệu — Encapsulation (dữ liệu được bảo vệ), tính kế thừa — Inheritance (xây dựng các lớp mới từ các lớp đã cĩ sẵn) và tính đa hình —
Polymorphism
Lập trình hướng đối tượng là cánh của mở cho tất cả những ai muốn làm phân mêm bằng những ngơn ngữ lập trình theo hướng đối tượng, cĩ mã lệnh mở rộng của C và C++ như ngơn ngữ lập trình Visual C++6.0,
Visual C++.Net, Visual C#.Net va Java
Giáo trình được biên soạn dựa trên kinh nghiệm giảng dạy mơn "Kỹ thuật
lập trình hướng đối tượng bằng C++" của tác giả trong nhiều năm tại một số
trường Cao đẳng và Đại học Trong giáo trình tác giả đã cố gắng trình bày một cách tỷ mỷ, cĩ dẫn dắt người đọc đi sâu tùm hiểu mục đích của từng chủ dé, sau đĩ thực hiện viết chương trình trên máy tính để kiểm tra và đánh giá
Trang 8Giáo trình được biên soạn về Kỹ thuật lập trình hướng đối tượng căn bản bằng C++ cho sinh viên ngành Cơng nghệ thơng tin và cho những di quan tâm đến phương pháp lập trình hướng đối tượng để phát triển những ứng dụng độc lập với mơi trường, hay để xây dựng các ứng dụng thực tế
Tác giả bày tỏ lịng biết ơn chân thành tới PGS TS Nguyễn Trường Xuân,
Ths GVC Hồng Kim Bảng (Đại học Mỏ ~ địa chất), PGS TS Đặng Văn Đức (Viện Cơng nghệ Thơng tin), GS Phạm Văn At (Khoa Cơng nghệ thơng tin — Đại học Giao thơng vận tải) và các bạn đồng nghiệp đã nhiệt tình dìu đắt,
chỉ bảo, động viên và đĩng gĩp ý kiến quý báu để tác giả hồn thành giáo
trình này
Mặc dù cố gắng rất nhiều, nhưng khĩ tránh khối những thiếu sĩt, chúng tơi mong nhận được những ý kiến đĩng gĩp của bạn đọc để giáo trình ngày càng
tốt hơn Thư gĩp ý xin gửi về Cơng ty Cổ phần Sách Đại học — Dạy nghề,
Nhà xuất bản Giáo dục Việt Nam, 25 Hàn Thuyên, Hà Nội
Xin chân thành cảm ơn!
Trang 9Chuong 1
KHAI NIEM VE LAP TRINH HUONG DOI TUONG
1.1 Ý TƯỞNG LẬP TRÌNH HƯỚNG ĐỐI TUONG
Lần đầu tiên ý tưởng lập trình theo hướng đối tượng được đưa ra trong
một ngơn ngữ lập trình và đồng thời là một mơi trường lập trình đo Xerox PARC phat trién vào năm 1968, đĩ là ngơn ngữ lập trình Smalltalk Song,
cho tới phiên bản Smalltalk-8.0 thì khái mệm lập trình hướng đối tượng mới
được hình thành rõ rệt và hỗ trợ hồn tồn Bên canh Smalltalk, các ngơn
ngữ hướng đối tượng khác như EIffel, Pascal, C++, Delphi, Java và C# cũng lần lượt ra đời, hoặc được phát triển từ đầu, hoặc tiến hố từ một ngơn ngữ cĩ sẵn
Hình 1.1 là mơ hình tiến hố của các ngơn ngữ lập trình từ ngơn ngữ lập trình khơng hướng đối tượng (được ghi tên trong hình chữ nhật cĩ viên đơn) đến các ngơn ngữ lập trình hướng đối tượng (được ghi tên trong hình
chữ nhật cĩ nét viền kép và gĩc trịn)
Khái niệm hướng đối tượng được xây đựng trên nền tảng của khái niệm
lập trình cĩ cấu trúc và sự trừu tượng hố đữ liệu: sự thay đối căn bản ở chỗ, một chương trình hướng đối tượng được thiết kế xoay quanh dữ liệu mà chúng ta cĩ thể làm việc trên đĩ, hơn là theo bản thân chức năng của chương trình Điều này nĩi lên rằng, trong lập trình hướng đối tượng sẽ cĩ khai báo các lớp thay vì khai báo các kiểu dữ liệu cĩ cấu trúc, trong lớp cĩ các thuộc tính như là các trường của kiểu dữ liệu cĩ cấu trúc và cĩ thêm các phương
thức hay cịn gọi là hành vi của đối tượng thuộc lớp được khai báo
'Trừu tượng hố (hay cịn gọi là trừu xuất) là một nguyên lý của sự nhận
thức; tức là khi nhận thức mội sự vật hiện tượng nào đĩ, ta hãy tạm thời quên
hay lờ đi các chỉ tiết cĩ tác dụng rất ít hoặc khơng cĩ tác dụng gì đến sự vật hiện tượng này, nhờ đĩ hình thành một sự diễn tả đơn giản hố và dễ hiểu Với cách nhận thức như vậy cho phép chúng ta hiểu được những sự vật hiện tượng đang xét theo đúng bản chất của nĩ Ví dụ, động vật sống trên cạn
thường là những con vật cĩ chân, đầu, mắt, mũi nhưng khi nĩi đến lồi voi
ta tạm thời lờ đi các yêu tố mà các con vật khác cĩ, mà tập trung vào những
đặc điểm nổi bật để phân biệt voi với các con vật khác như là đầu to, cĩ vịi,
Trang 10Cobo! 1960 Smalltalk-72 Simula 1970 Smalltalk-76 Smalltalk-78 Smaiitalk-80 1980 1990 ObjectCobol Visual C++ Visual C#,Net Visual basic Ngơn ngữ lập trình hướng đối tượng ` ———— `————————— Y Ngơn ngữ lập trình khơng hướng đối tượng
Hình 1.1 Mơ hình tiến hố của ngơn ngữ lập trình
Lập trình hướng đối tượng (Object Oriented Programming - OOPF)
hay chỉ tiết hơn là lập trình định hướng đối tượng chính là phương pháp lập
Trang 111.2 PHAN BIET PHUONG PHAP LAP TRINH HƯỚNG ĐỐI TƯỢNG VỚI PHƯƠNG PHÁP LẬP TRÌNH THEO KIỂU CẤU TRÚC
1.2.1 Phương pháp lập trình hướng thủ tục - POP
Phương pháp lập trình theo kiểu cấu trúc trước đây ta quen gọi là phương pháp lập trình hướng thủ tục (Procedure-Oriented Programming - POP)
Phương pháp lập trình hướng thú tục là người lập trình phân tích một
nhiệm vụ lớn thành nhiều cơng việc nhỏ hơn, sau đĩ dần dần chỉ tiết, cụ thể
hố để được các vấn đề đơn giản hơn Cách thức phân tích và thiết kế như vậy gọi là nguyên lý lập trình từ trên xuống (Top-down) để thể hiện quá trình suy diễn từ cái chung cho đến cái cụ thể Hình 1.3 cho thấy sự phân
Trang 121.2.2 Phương pháp lập trình hướng đối tượng - OOP
Phương pháp lập trình hướng đối tượng là phương pháp phân tích, trong đĩ lấy đối tượng làm vai trị trung tâm của việc lập trình, cơng việc thiết kế từ dưới lên, do đĩ gọi là nguyên lý lập trình từ dưới lên (Bottom-up} Một
chương trình hướng đối tượng sẽ xác định đặc điểm và hành vi cụ thể của
các kiểu dữ liệu (các nhĩm đối tượng) Chúng 1a cĩ thể tạo ra các quan hệ giữa các kiểu dữ liệu trong một chương trình hướng đối tượng Hình 1.4 dưới đây nĩi lên mối quan hệ giữa các đối tượng trong thế giới thực, con người sở hữu đối tượng ơtơ và đọc sách, con người cũng là một đối tượng, cho nên các
» Thế giới thực
| Ơtơ 4 Lãm chủ Con người |_ Đọc } | Sách
đối tượng này cĩ quan hệ với nhau Mơ hình
Hình 1.4 Quan hệ giữa các đối tượng
— Lập trình hướng đối tượng cho phép tổ chức đữ liệu trong chương
trình theo một cách tương tự như các nhà sinh học phân loại các lồi thực vật
khác nhau Theo cách nĩi của lập trình đối tượng, thì các xe hơi, các cây cối, các số phức, các quyển sách đều được gọi là các lớp (C1ass)
— Một lớp là một khung kiến trúc mơ tả các thơng tin cấu trúc dữ liệu,
lẫn các thao tác hợp lệ của các phần tử đữ liệu Khi một phần tử dữ liệu được
khai báo là phần tử của một lớp thì nĩ được gọi là một đối tượng (Ob3ect)
Các hàm được định nghĩa trong một lớp được gọi là các phương thức
(Method) va chiing 1a cdc hàm duy nhất cĩ thể xử lý đữ liệu của các đối
` tượng của lớp đĩ Một thực thé (Instance) IA mot vật thể cĩ thực bên trong
bộ nhớ, thực chất đĩ là một đối tượng (nghĩa là một đối tượng được cấp phát
vùng nhớ)
— Mỗi một đối tượng cĩ riêng cho mình một bản sao các phần tử dữ liệu của lớp, cịn gọi là các biến thực thể (Tnstance variable), các phương
Trang 13thức định nghĩa trong một lớp cĩ thể được gọi bởi các đối tượng của lớp đĩ
Các đối tượng đều độc lập với nhau, vì vậy các thay đổi trên các biến thể hiện của đối tượng này khơng làm ảnh hưởng gì đến các biến thể hiện của các đối tượng khác, và việc gửi thơng điệp cho một đối tượng này cũng khơng làm ảnh hưởng gì đến các đối tượng khác Hình 1.5 cho biết lớp
Người cĩ hai đối tượng là anh Hùng và anh Trung Lớp Người Anh Hùng Ngày sinh Nghề nghiệp Hoc tap Lâm việc Hiển thị théng tin Hình 1.5 Lớp là gì? Các thành phần riêng của một đối tượng Thuộc tính Tên :Hùng Ngày smh:14/02/1985 { Nghề nghiệp: Trấo địa
Hình 1.6 Mỗi đối tượng là một thể hiện của lớp
Trang 14Lớp Ơtơ Đối tượng 1 ve Đổi tượng 3 | ` Đối tượng
Hình 1.7 Các đối tượng ơtơ khơng làm ảnh hưởng lẫn nhau
Hình 1.7 cho biết lớp Ơtơ là một cái khung kiến trúc, bao gồm các thành phần chung như: cĩ khung, cĩ bốn bánh và màu sơn, lớp này được dùng để tạo ra các đối tượng ơtơ cĩ bốn bánh và khung cùng với màu sơn của nĩ Các đối tượng ơtơ được tạo ra trong bộ nhớ là độc lập, nghĩa là các đối tượng này khơng cĩ quan hệ gì với nhau, khơng làm ảnh hưởng lẫn nhau
Như vậy, đối tượng được hiểu theo nghĩa là một thực thể mà trong đĩ
các đữ liệu và phương thức tác động lên dữ liệu đã được "đĩng gĩi" với nhau, hay đối tượng được đặc trưng bởi một số thao tác và các thơng tin ghi nhớ sự tác động của các thao tác này
Các thao tác trong đối tượng được gọi là các phương thức hay hành vì
của đối tượng đĩ Phương thức và dữ liệu của đối tượng luơn tác động lẫn
nhau Phương thức của đối tượng được quy định bởi dữ liệu; ngược lại, đữ liệu của đối tượng được đặc trưng bởi các phương thức của đối tượng Chính
nhờ sự gắn bĩ đĩ, ta cĩ thể gửi cùng một thơng điệp đến những đối tượng
khác nhau
Lập trình hướng đối tượng phải được thực hiện thơng qua một ngơn ngữ
lập trình hướng đối tượng Để đạt được các mục tiêu trên, mọi ngơn ngữ lập
trình hướng đối tượng đều hỗ trợ thể hiện ba nguyên tắc: đĩng gĩi dữ liệu
Trang 151.2.3 Mục tiêu của lập trình hướng đối tượng
~ Don giản hố việc xây dựng và sử dụng các thư viện
— Cho phép sử dụng lại phần mềm một cách triệt để
— Nếu một thư viện cĩ sẵn khơng phù hợp với yêu cầu thì người lập trình cĩ khả năng sửa đổi hoặc mở rộng một cách để dàng, khơng cần phải can thiệp tới mã nguồn của thư viện
— Nâng cao độ tin cậy và tính bền vững của phần mềm
~ Hỗ trợ mạnh các dự án phát triển phần mềm quy mơ lớn, đồi hỏi nhiều người tham gia
— Cải thiện khả năng bảo trì của mã, nâng cao tính mềm dẻo và linh hoạt của phần mềm
1.3 TƯ DUY HƯỚNG ĐỐI TƯỢNG
Mỗi hệ thống thực của chúng ta được cấu thành bởi các đối tượng và sự liên hệ giữa chúng với nhau, với bên ngồi Cách mà chúng ta nhận thức, tư duy, ra quyết định và hành động cũng là dựa trên cơ sở các đối tượng ta đang
quan tâm Tuy nhiên, từ khi máy tính ra đời thì các khái niệm dữ liệu, hàm,
thủ tục và giải thuật đã trở nên thơng dụng, thực tế các khái niệm trên đều
gắn với cơ chế làm việc của máy tính Ví dụ: đữ liệu là một đạng biểu diễn
thơng tin mà máy tính cĩ thể lưu trữ và xử lý; hàm là một trình tự các câu
lệnh mà máy tính cĩ thể hiểu và diễn giải để thực hiện một nhiệm vụ nào đĩ; giải thuật là cách biểu diễn cụ thể phương pháp giải quyết một bài tốn để cĩ
thể lập trình và thực thi trên máy tính
1.4 ĐẶC ĐIỂM CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
1.4.1 Tính đĩng kín
Tính đĩng kín là cơ chế liên mã lệnh và đữ liệu mà nĩ thao tác, và giữ cho cả hai được an tồn khỏi sự can thiệp từ bên ngồi, do sử dụng sai Trong ngơn ngữ hướng đối tượng, mã lệnh và dữ liệu liên kết với nhau để tạo
thành một hộp kín độc lập Khi mã lệnh và đữ liệu liên kết với nhau như vậy
Trang 16cĩ các thuộc tính là các thành phần dữ liệu riêng của mình, nếu một ai đĩ muốn sử dụng thì phải gửi thơng điệp hay yêu cầu đối tượng này thực hiện hành vi lấy dữ liệu của mình cho người khác, chẳng hạn gọi phương thức
hiển thị thơng tin
_Bứ tường bảo vẻ dữ liệu cho đối tượng ' OCH EEC GÀ ÚC ` YY Ten :Hùng linh Pe Ngày sinh: 1402/1985 yf : : Nghề nghiệp: Trắc địa là Ne [Hiển thị thơng th] Hiến bị tên g tin È LK ma Z goi phương thức Tuy BỊ Khơng được phép cập HH từ ÊH Đối tượng ngồi Dt Hinh 1.8 Tinh đĩng kín
Trong một đối tượng, mã lệnh, dữ liệu hay cả hai cĩ thể là của riêng đối tượng đĩ hoặc là của chung Mã lệnh và dữ liệu là của riêng đối tượng nào thì chỉ cĩ đối tượng đĩ mới được phép truy cập: cĩ nghĩa là, chúng khơng cho phép các thành phần khác của chương trình truy cập đến Khi mã lệnh, dữ liệu là chung thì chúng cho tất cả các thành phần khác của chương trình truy cập chúng Các đối tượng cũng cĩ các thành phần chung và riêng trong nĩ
1.4.2 Tính kế thừa
Tính kế thửa là quá trình mà một đối tượng cĩ thể cĩ được một tính chất
của một đối tượng khác Cụ thể hơn, một đối tượng cĩ thể kế thừa một số đặc điểm của một hay một số đối tượng khác Trong mỗi trường hợp, lớp đối
tượng cịn kế thừa đặc điểm của lớp đối tượng cha, nĩ bổ sung thêm vào các
đặc điểm của nĩ Tuy nhiên, nhờ tính kế thừa cĩ thể mơ tả một đối tượng bằng cách chí rõ lớp tổng quát nào thuộc về đối tượng cùng với những đặc
Trang 17Nự mờ? Họ tên Địa chỉ Điện thoại Thay đổi địa chỉ Ỉ là một Nhan ven Mã nhân viện Quảng cáo Ban hang, là một Khach hang Ma khach Mua hàng Thay đổi địa chỉ TS Thitong gin Lãi suất Lấy phiếu Trả tiền Hình 1.9 Tinh kế thừa
Theo hình 1.9 thì đối tượng thuộc lớp Nhân viên sẽ kế thừa các thuộc
tính: Họ tên, Địa chỉ, Điện thoại và phương thức Thay đổi địa chỉ của lớp Người Đối tượng thuộc lớp Thương gia được kế thừa các thuộc tính từ hai lớp Khách hàng và Người
1.4.3 Tính đa hình
Tính ẩa hình là một tính chất cho phép một tên được dùng cho nhiều
mục đích khác nhau và cĩ quan hệ với nhau về phương diện kỹ thuật Mục
đích của tính đa hình là áp dụng cho lập trình hướng đối tượng, cho phép một tên được dùng để chỉ rõ một lớp tác động tổng quát Tính đa hình là "một giao diện nhiều phương pháp"; điều này cĩ nghĩa là, cĩ thể thiết kế một
giao điện chung cho một nhĩm các tác động cĩ liên quan; tuy nhiên, tác
động cụ thể được thi hành lại phụ thuộc vào dữ liệu
Trang 18lớp này tạo ra các đối tượng; các đối tượng này thực hiện các chức năng cho người dùng biết thời gian Cùng một chức năng là hiển thị thời gian thì đồng hồ kim hiển thị thời gian với kim giờ và kim phút, cho biết bây giờ là 11 giờ sáng; trong khi đĩ, đồng hồ số thì hiển thị lên màn hình của nĩ là 11:00AM, cĩ ý nghĩa là II giờ sáng Với hai cách hiển thị thơng tin khác nhau nhưng
cho cùng một ý nghĩa như thế gọi là /ính đa hình; tính đa hình dùng nhiều
cách thức khác nhau để mơ tả một tính chất hay một đối tượng nào đĩ Dong ho Đặt giờ Đặt giờ báo thức() Hiện thời gian ¡ Đĩng hỏ kim Đặt gi20 Đặt giờ báo thức() Hiện thời gian | “Ƒ Dong ho so Đặt giờ() Biện thời gian ¡ ˆ Hình 1.10 Tính đa hình CÂU HỎI VÀ BÀI TẬP 11:00 a Đặt giờ báo thức()| „
1 Cho biết sự khác nhau cơ bản của phương pháp lập trình cĩ cấu trúc và
phương pháp lập trình hướng đối tượng
2 Những đặc điểm và lợi ích chính của phương pháp lập trình theo hướng
đối tượng là gì?
Tính đĩng gĩi là gì?
Bạn hiểu như thế nào là tính đa hình?
Hãy cho biết những ngơn ngữ lập trình nào hỗ trợ lập trình theo hướng
Trang 19Chuong 2
LAP TRINH C VA C++
2.1 LAM VIEC VOI TC++3.0
Tất cả các chương trình ví dụ của giáo trình này đều được viết bằng
ngơn ngữ lập trình TC++3.0 Sau khi cai dat TC++3.0 sẽ cĩ thư mục chính là
TC và trong thư mục TC cĩ các thư mục con sau:
~ BGI: Thư mục chứa các tệp tin liên quan đến đồ hoa và font chữ - BIN: Thư mục chứa các tệp tin chương trình khả thi của trình biên
dịch Turbo C++3.0 như TC exe, Tlink.exe
— INCLUDE: Thư mục chứa các tệp tin tiêu dé cĩ phân mở rộng là h
— LIB: Thy muc chita cac tép tin Lib va Obj
Dưới đây là các bước cơ bản để thực hiện được một chương trình bằng
ngơn ngữ lập trình C++
Để chạy trình biên dịch của TC ta vào thư mục BIN và chọn chương
Trang 20Kinh nghiệm cho thấy, nên viết một chương trình đơn giản như chương trình trên hình 2.2 và chạy thử, sau đĩ viết mã lệnh theo yêu cầu của chương trình Hình 2.2 là một ví du về một chương trình đơn giẩn trong C++ (iy Turbo C++ IDE ~oOx Mine lude<conio h> HWvoid main<> clrscr€2; cout<< , igetch >; AW 13:34 tơng 5 Fi Help F2 Save F3 Open jake F19 Menu
Hình 2.2 Chương trình đơn giản trong C++
Sau khi soạn thảo hoặc sửa đổi chương trình, để lưu chương trình lại nhấn phím F2; để kiểm tra lỗi và biên dịch nhấn phím F9; để chạy chương trình giữ phím Ctrl rồi nhấn phím F9
Chương trình viết trong C++ được phân làm bốn phần:
— Phần thứ nhất là các dịng khai báo inc1ude, để báo cho trình biên
dịch của C++ biết các thư viện các hàm sẽ được sử dụng, trong chương trình trước tiên bao giờ cũng cĩ dịng #in1ude<iostream h>, sau đĩ là các thư viện khác nếu cĩ Thư viện 1ostream h chứa các hàm vào, ra chuẩn của C++
— Phần thứ hai sau các dịng khai báo là nơi khai báo nguyên mẫu hàm,
nguyên mẫu lớp, định nghĩa các kiểu dữ liệu, định nghĩa các hàm của chương trình
— Phần thứ ba là hàm main (), nơi bắt đầu của chương trình Trong hàm
main () sẽ là các câu lệnh nhằm thực hiện những cơng việc cụ thể
— Phân thứ tư đứng sau hàm main () là phần dùng để định nghĩa các hàm đã khai báo nguyên mẫu (các hàm đã khai báo nguyên mẫu chưa được
Trang 21f#include<iostream.h> Phần thứ nhất #include<conio.h> † Phần thứ hai void main () { elrser(); “ cout<<"\nXin chao ngon ngu lap trinh C+t"; Phần thứ ba getch(); } Phần thứ tư
Hình 2.3 Phân vùng viết mã lệnh trong chương trình
Để thực hiện chương trình trên, nhấn phím F9 để kiểm tra lỗi, khi đĩ
xuất hiện cửa số thơng báo như hình 2.4 BlÏtee C«+ DE - | Ỉ =_ File Edit Search Run Compile Debug 5U HàU-CPP Projlcct Options Window H Litas cĩ HẾn BI EXE file : UIDU_MAU.EXE Linking : \TC\LIB\CS.LIB Total Link Lines compiled: 1631 PASS 2 Warnings: @ 8 Errors: @ 9 Available omnia + 1978K = i Fi Help Alc-PB Next Msg R1t-F? Prey Msq Alt-F9 Compile 9 Make FL He ef _ _ - | +
Hình 2.4 Kiểm tra lỗi cú pháp
Như vậy, chương trình khơng cĩ lỗi và trình biên dịch đã dịch chương trình ra file khả thi là vi dumau exe và thơng báo Success cĩ nghĩa là đã thành cơng Bây giờ nhấn tổ hợp phím Cưi + F9 hoặc mở thư mục BIN chạy
trực tiếp file vidumau exe để thực hiện chương trình vừa lập Kết quả khí
Trang 22GY Turbo c++ DE {Bj x| rela ire ngon ngu Tap trinh CH Hình 2.5 Kết quả chạy chương trình 2.2 NHẬP, XUẤT DỮ LIỆU
Trong C++ vẫn cĩ thể thực hiện nhập, xuất dữ liệu bằng lệnh scanf () và
Print£ (), ngồi ra nĩ cịn cung cấp thêm lệnh nhập dữ liệu cĩ dạng:
cin>>tham so 1>>tham so 2>> >>tham so k;
Trong đĩ, các tham số cĩ thể là biến thực nguyên, con trỏ, ký tự Dịng cin là một đối tượng của lớp ¡stream, đĩ là đồng vào chuẩn gắn với bàn phím, các thao tác nhập trên đồng cin đồng nghĩa là nhập từ bàn phím Do cin là đối tượng của lớp istream nên cĩ sử dụng tốn tử nhập ">>",
Để xuất đữ liệu lên màn hình ta dùng lệnh cĩ dạng:
Cout<<tham so 1<<tham so 2<< <<tham so k;
Trong đĩ, các tham số là các giá trị cần xuất, các giá trị đĩ được biến đổi thành xâu ký tự trước khi đưa ra dịng xuất Tham số thứ ¡ cĩ thể là kiểu
Số nguyên, số thực, con trỏ, ký tự (xuất xâu ký tự) Dịng cout là một đối
tượng của lớp ostream, đĩ là dịng xuất chuẩn gắn với màn hình Do cout
là đối tượng của ostream nên ta cĩ thể đùng tốn tử xuất " <<",
Trang 23
2.3 MOT SO PHUONG THUC - HAM NHAP, XUAT
2.2.1 Phuong thifc getline ()
Khi muốn nhập một xâu cĩ độ dài khơng quá n ký tự và chứa vào mảng chaz s[ ] ta sử dụng lệnh:
cin.getline(s vn) ;
Lệnh:
cin >> s;
sẽ để lại ký tự xuống dịng trong bộ đệm bàn phím (*\n"), cho nên cần phải
loại bỏ ký tự này để nhập được dữ liệu cho lần nhập tiếp theo, để làm điều
đĩ ta sử dụng lệnh:
cin.ignore (1) ;
Muốn sử dụng được các tốn tử nhập, xuất cần phải khai báo chỉ thị #ineclude <iostream.h> ở đầu tệp chương trình nguồn Lớp iostream
Trang 24int tuoi; char gioitinh,hotenf{ 25] ;
/hmếu gioi tỉnh là 'E' hoặc '£' tương ứng là nữ; 'M' hoặc 'mì tương ứng là nam cout<<"\nNhap ho ten:"; cin.getline (hoten, 25); cin.ignore (1); cout<<"\nNhap tuoi:"; cin>>tuoi; , cin ignore (1) ;// khử trơi đồng khí nhập cout<<"\nNhap gioi tỉnh:"; cin>>gioitinh;
/ƒ hiển thị thơng tin -
cout<<"\n THONG TIN VUA NHAP"; cout<<"\nHo ten:"<<hoten; cout<<"\ nTuoi:"<<tuoi; if (gioitinh=='f'||gioitinh=='F') cout<<"\nGioi tinh:NU"; if (gioitinh=='m' | |gioitinh=='M') cout<<"\nGioi tinh:NAM"; getch(); : } Két qua: Nhap ho ten: Nguyen Tuan Anh Nhap tuoi :33 Nhap gioi (tinh:im
THONG TIN VUA NHAP Ho ten: Nguyen Tuan Anh Tuoi: 33 Gioi tinh:NAM 2.2.2 Định dạng khi in lên màn hình
Quy định số thực £1oat, doubLe cĩ đúng p số lẻ:
cout<<setiosflags (ios: : showpoint) <<setprecision (p);
Câu lệnh này cĩ tác dụng đối với tất cả các tốn tử xuất tiếp theo cho
Trang 25Quy định độ rộng tối thiểu w vị trí cho các giá trị (nguyên, thực, xâu ký tự) được in ra trong tốn tử xuất ta dùng hàm setw (w) Hàm này cần cài đặt
trong tốn tử xuất và nĩ chỉ cĩ hiệu lực cho một giá trị được ¡n gần nhất, các
giá trị in ra tiếp theo sẽ cĩ độ rộng tối thiểu ngầm định là 0 Muốn sử dụng
các hàm trên, đầu chương trình phải cĩ lệnh:
#include<iomanip.h>
Trong tệp iostream.h cĩ các cờ ios: :left, ios::right,
Câu lệnh cout setf (ios: :1eft)} cĩ tác dụng canh trái dữ liệu in ra,
câu lệnh cout set£ (ios: :right) cĩ tác dụng canh phải dữ liệu In ra Ví dụ 2.3 Chương trình nhập một mảng cĩ cấu trúc gồm các sinh viên #include<iostream.h> #include<conio,h> #inc1ude<string.h> #inc1ude<iomanip.h> typedef struct sv { char hoten[ 25], lopf 30]; float diemthi; MG sv a[ 20] ; void main() { int n,i; cout<<"\nVao so sinh vien can nhap:"; cin>>n; cin.ignore (1);
// Loại bỗ ký tự xuống hàng để phục vụ lần nhập tiếp theo
| for(i=l; i<=n; i++)
` { cout<<"\nHo va ten: "7
cin.getline(a{ i] -hoten, 25); cout<<"\nLop : ";
cin.getline (al i] lop, 30);
Trang 26cin>>a[ i] diemthi; cin.ignore(1);
}
// Xuất dữ liệu
cout<<"\n DANH SACH SINH VIEN\n";
cout<<setiosflags (ios: :showpoint)<<setprecision (4); for (i=l;i<=n; i++)
{
cout.setf(ios::left);
Cout<<" |"<<setw (25)<<a[ i] hoten;
cout<<" |"<<setw (30)<<a[ i] lop; cout.setf(ios::right); cout<<" |"<<setw(3)<<al i] diemthi<<" |"<<setw(8) <<" ["<<endl; } getch(); } Kế quả:
Vao so sinh vien can nhap: 2 Ho va ten: Nguyen Ngoc Anh Lop: THTDK48 Diem thi: 8 Ho va ten: Tran Van Tranh Lop: THTDK48 Diem thi: 9
DANH SACH SINH VIEN
|Nguyen Ngoc Anh |THTDK48 [8.0000] {Tran Van Tranh (TRTDK48 |9.0000]
2.4 TOAN TU PHAM VI
Trang 27Bên trong hàm muốn truy cập biến tồn cục ta thêm tốn tử phạm vị ”: :”
vào trước tên biến thì chương trình dịch sẽ xác định biến đĩ là biến tồn cục
Trong những trường hợp cần thiết, muốn truy xuất đến biến tồn cục ta sử
dụng tốn tử ":: ” trước tên biến
Ví dụ 2.4 Biến tồn cục cùng tên #include <iostream.h> int x = 15; main () { int x = 20; cout<<"x = "<<x<<"\n"; Ur) / Biến cục bộ được sử dụng nhưng biến tồn cục thì khơng được sử dụng } Két qua: x = 20 Như vậy, ở ví dụ trên muốn in giá trị biến tồn cục x ta chỉ cần thay câu lệnh (*) bằng câu lệnh: cout<<"x = "<<;;x <<"\n¿ / x là biến tồn cục Kết quả sẽ là: x= 15 Nếu thực hiện ::x=25; thì cout<<"\n”<< "x = "<<;;:x<<"\n; cho kết quả sẽ là: x = 25
2.5 DIA CHI CUA BIEN VA CON TRO
2.5.1 Dia chi cua bién
Nhu đã biết, mỗi biến được khai báo thì nĩ cũng được cấp phát một vùng nhớ cĩ kích thước tương ứng với kích thước của kiểu đữ liệu mà nĩ được khai báo Ví dụ, biến nguyên (int) sẽ được cấp phát một vùng nhớ
Trang 28Vi du 2.5 Dia chi cha bién #include<idstream.h> #include<conio.h> void main (} { clrscr(); int a; a=6;
cout<<"\nDia chi cua a:"<<é&a;
/ƒ &a cho ta địa chỉ của biến a getch(); } Kết quả: Dia chi cua a: 0xBfc7fff4
Kết qua này cĩ nghĩa là, biến a chiếm giữa một vùng nhé 2 byte; byte
đầu tiên cĩ địa chỉ 0x8fc7fff4, byte thứ hai cĩ địa chỉ 0x8fc7fff6 như sau: 0000/1000 0|0|0|0|0|0)1|1)10 0x8fc7Fff4 0x8fc7fff6 Dãy số 0000000000000110 là dãy số nhị phân biểu điễn số 6 ở hệ nhị phân, tức là 6= 00000000000001 10,, 2.5.2 Con trỏ
Trong ngơn ngữ lập trình C và C++, con trỏ được khai báo cĩ cú pháp
như nhau Biến được khai báo cĩ kiểu đữ liệu là int, float, double va
kiểu cĩ cấu trúc Con trỏ cũng như vậy, để khai báo con trổ ta chỉ cần thêm
dấu * đứng trước tên biến là được, ví dụ: int *p; câu lệnh này thực hiện khai báo biến con trỏ p cĩ kiểu là số nguyên, tức là nĩ sẽ lưu địa chỉ của
biến kiểu nguyên trong chương trình Để con trỏ trỗ đến một biến ta chỉ cần
thực hiện câu lệnh cĩ dạng:
Trang 296 0x8fb0ffi4 0x8fb0fff4 | 0x8fb0fff2 Ì P Hình 2.6 Con trỏ và biến
‘Hinh 2.6 cho thay 6 nhớ của biến a cĩ giá trị là 6, khi ta thực hiện cho
biến p trỏ đến biến a thì nội dung ơ nhớ của biến p sẽ là 0x8fb0£fff4 (là địa chỉ của biến a)
Chương trình sau sẽ thực hiện khai báo biến a và biến con trỏ p cĩ cùng
kiểu đữ liệu Ta thực hiện gán địa chỉ biến a cho biến p, in địa chỉ của biến a thơng qua biến con trỏ p, in nội dung của biến a thơng qua con trỏ p bằng cách đưa dấu * lên trước con trỏ p thì sẽ in ra được nội dung của biến a, và
cũng thực hiện thay đổi nội dung của biến a thơng qua con trỏ p như chương trình trong ví dụ 2.6 Ví dụ 2.6 Con trỏ và địa chỉ #include<iostream.h> #include<conio.h> void main () { clrscr(); int a; a=6; cout<<"\nDia chi cua a:"<<&a; int *p;
cout<<"\nDia chi cua p:"<<é&p;
p=éa; // gán địa chỉ của a cho con trỏ p lưu trữ
cout<<"\nNoi dung cua con tro p:"<<p; cout<<"\nNoi dung cua bien a:"<<*p;
*p= *pti; /*ký hiệu *p tương đương là giá trị biến a, vay * p=* p+1 cũng cĩ ý nghĩa như phép tốn a = at+1*/
cout<<"\nNoi dung cua bien a:"<<a;
i getch();
Trang 30Kế quả:
Dia chi cua a: 0xBfb0fff4 Dia chi cua p: Ox8fb0fff2
Noi dung cua con tro p: 0x8fb0fff4 Noi dung cua bien a: 6
Noi dung cua bien a: 7
Kết quả trên cho thấy, sau khi biến a được tăng giá trị lên một đơn vị thì nội dung của ơ nhớ mà biến a đang chiếm giữ cũng sẽ thay đổi theo 7 0xBfb0fff4 oxerborta 0x8fbOfff2 f a E——————————ÿp
Hình 2.7 Sơ đồ mình hoạ địa chỉ của biến và cách gán địa chỉ cho con trỏ
Con trỏ cũng cĩ thể lưu địa chỉ phần tử đầu tiên của mảng như khai báo sau:
int x[5]; :
int *p;
p=x; /*câu lệnh này cho p trỏ đến phần tử đầu tiên của mảng x, hay p lưu địa chỉ của phần tử x[ 0] là &x{ 0] */
Sau khi gán p = x; thì biến p sẽ quản lý vùng nhớ gồm dãy các ơ nhớ của các phần tử của mảng x Ví dụ, ta gán x[ 0] =10; thì câu lệnh bí 0] =10; là như nhau Mang x: x0 x1 x2 x3 x4 p
Hinh 2.8 Con tro va mang
Trong C++ cũng sử dụng và định nghĩa đữ liệu kiểu cấu trúc, và tất
nhiên cĩ thể khai báo biến con trỏ kiểu cấu trúc Giả sử cĩ cấu trúc Sinh viên —
Trang 31typedef struct Sinhvien
{
char hotenf[ 30];
int masv;
Me
Sinhvien *p, x; //p la biéncon trd, x 1a biến thường
Câu lệnh p=sx; cho biết biến trỏ p trỏ đến biến x cĩ cùng kiểu dữ liệu là Sinhvien
Để truy cập vào các thành phần của biến con trỏ ta dùng tốn tử "=>" Ví
dụ, câu lệnh p->masv=10; sé truy cập vào thành phần masv của biến con
trỏ p, gán masv của biến con trỏ p giá trị 10, trong khi đĩ muốn thay đổi giá
trị masv của x ta thực hiện x.masv=12;
Như đã biết, mảng là kiểu dữ liệu cĩ cấu trúc và thường được khai báo trong chương trình, chẳng hạn khai báo mảng các số nguyên kiểu ¡nt như sau:
int a[10];
Dịng lệnh trên khai báo mảng a cĩ kiểu int, kích thước 10 phần tử,
mỗi phần tử chiếm giữ một vùng nhớ 2 byte, mỗi vùng nhớ này lại lưu một giá trị nào đĩ nằm trong phạm vi của kiểu int
Trong phần trên đã khai báo con trổ đùng để trỏ (lưu địa chỉ của biến hay của một ơ nhớ nào đĩ) và khai báo mảng (tập hợp các biến cĩ cùng
kiểu) cũng như khai báo nhiều biến cĩ cùng kiểu Đơi khi muốn lưu tất cả các biến này thành một tập hợp để quản lý bởi các con trỏ, ý tưởng dùng
mảng để quản lý các biến này thì mảng này phải là mảng các con trỏ mới quản lý gián tiếp các biến đĩ thơng qua con trỏ được
Ta cĩ thể viết các lệnh:
int x, y, z;¡ x=2; y=3; z=6; int *a[ 3];
a[ 0] =&x; a[ 1] =&y; a{[ 2] =&Z;
Việc gán địa chỉ của các biến cho các phần tử của mảng a tương đương
Trang 322 3 6 0x8fb0fff2 f 0x8fbOfff4 | 0x8fb0fff6 | x y z 0x8fbOfff2 0xợb0fff4 0x8fb0fff6 a[0] alt] al2] Hình 2.9 Sử dụng mang các con trỏ
Cĩ thể hiển thị nội dung của mảng con trỏ bằng câu lệnh:
for(int i=0; i<3; i++) cout<<” “<<*a[i]; Ta cĩ *a[ 0], *a[ 1) và *a[ 2) là nội dung ơ nhớ của biến x, y va z tương ứng Kế quả: 236
Con trỏ luơn được cấp phát vùng nhớ trên bộ nhớ Heap, do đĩ việc sử dụng con trỏ một cách linh hoạt sẽ khai thác hiệu quả tài nguyên bộ nhớ khi chạy chương trình
2.6 CAP PHAT DONG
Trong C++ c6 thé ding hàm malloc() dé cap phat ving nhé cho con trỏ và sử dụng hàm free() để giải phĩng vùng nhớ đĩ mà con trỏ đang
chiếm giữ nhờ sử dụng hàm ma11oc () Ngồi ra, C++ cịn đưa thêm tốn tử new và delete tiện dụng hơn Hai câu lệnh sau sẽ cấp phát bộ nhớ cho một
phần tử cĩ kiểu là Kiểu đữ liêu: Kiểu dữ liệu *p;
p = new Kiểu đữ liệu;
Câu lệnh sau cấp phát một vùng nhớ gồm cĩ n ơ nhớ cĩ kiểu là
Kiểu dữ liệu: ,
Pp = new Kiểu đữ liệu [n];
Trong d6, Kiéu_dit_1iéucé thé lA int, long, float, double, char
Trang 33địa chỉ ơ nhớ đầu tiên của mảng n phần tử Nếu khơng thành cơng thì p cho giá trị NULL Dùng tốn tử đeLete để giải phĩng vùng nhớ được cấp phát
Trang 34char *pc; pc=new char{ 30]; : strcpv (pc," Nguyen Tuan Anh"); cout<<"\n\n"<<pc; delete pc; getch(); } Két qua: n=77 *p2=173 *p1=173 *p1,*p2=999 20/11/1976 Nguyen Tuan Anh
2.7 CƠ CHẾ HOẠT ĐỘNG KHI GỌI HÀM TRONG C VÀ C++
Khi một chương trình được chạy thì máy tính sẽ cấp phát cho chương trình 5 vùng nhớ theo sơ đồ như hình 2.10 Địa chỉ cao Vùng ngăn xếp (phát triển từ trên xuống dưới): chứa các đối tượng cục bộ Vùng nhớ Heap cịn tự do
Vùng Heap đã cĩ dữ liệu (phát triển lên); chứa các đối tượng như biến, mảng, cấu trúc được cấp phát bởi hàm malloc hoặc tốn tử new Vùng cấp phát tĩnh (cố định): chứa các đối tượng ngồi và static Vùng mã lệnh của chương trình và các hằng Địa chỉ thấp
Hình 2.10 Các vùng nhớ được cấp phát của khi chạy chương trình
Trong mục này sẽ thảo luận về cơ chế gọi hàm trong ngơn ngữ lập trình
Trang 35Ví dụ 2.8 Chương trình tính tổng hai số nguyên cĩ xây dựng hàm tính tổng #include<iostream h> #include<conio.h> long int tong(int.x, int y) { long int z=0; Z=X†V/? ‘return (z); } 1 void main () { , clrscr(); // Lệnh 1 int a, b; : // Lệnh 2 ˆ a=5; b=6; // Lệnh 3
long int sum=tong(a,b); // Lénh 4 cout<<"\n" <<ac<" 4" <<b<<"="<<sum; //Lệnh 5 getch(); „ /j Lệnh.6 be Kết qua: 5+6=11 Khi chạy chương trình được cấp phát 5 vùng nhớ như được minh hoạ trong hình 2 II Vùng ngăn xếp Vùng nhớ Heap cịn tự do Vùng Heap đã cĩ dữ liệu : lưu ba biến là a, b và sum Vùng cấp phát tĩnh Vùng mã lệnh của chương trình và các hằng Hình 2.11 Chương trình được cấp phát 5 vùng nhớ
Chương trình chạy bắt đầu từ hàm main (), sau khi chạy hết các lệnh từ
Trang 36chương trình sẽ cấp phát cho hàm tong () một vùng nhớ ngăn xếp là s như hình 2.12 Hàm tính tổng cĩ hai tham số là x và y, vì đây là vùng nhớ ngăn xếp nên biến nào được khai báo trước sẽ được đưa vào ngăn xếp trước Khi chương trình chạy đến lệnh long int z=0; thì z sẽ được đưa lên đỉnh của
ngăn xếp và gán cho giá tri 0 Vùng ngăn xếp Ss Vùng nhớ Heap cịn tự do zz0 Vùng Heap đã cĩ dữ liệu (lưu ba biến là a, b và sum) y=6 x=5 Vùng cấp phát tĩnh Vùng nhớ ngăn xếp S Vùng mã lệnh của chương trình và các hằng
Hình 2.12 Sơ để hoạt động của chương trình khi hàm được gọi
Khi hàm tong () chạy đến câu lệnh z=x+y; thì z được gắn giá trị mới là 11 như hình 2.13 Vùng ngăn xếp s đ Vùng nhớ Heap cịn tự do \ z=11 Vùng Heap đã cĩ dữ liệu : lưu ba biến là a, b và sum y=6 x=5 Vùng cấp phát tĩnh Vùng nhớ ngăn xếp S Vùng mã lệnh của chương trình và các hằng
Hình 2.13 Hoạt động của hàm khi được gọi
Khi gặp câu lệnh return () thì hàm tong () sẽ kết thúc và trước khi kết thúc nĩ phải làm nhiệm vụ giải phĩng vùng nhớ S đã được cấp phát Như
vậy, các biến sẽ lần lượt được xố khỏi vùng nhớ S là z, y, x; cuối cùng là
Trang 37Vùng ngăn xếp Vùng nhớ Heap cịn tự do Vùng Heap đã cĩ dữ liệu (lưu ba biến là a, b va sum) Vùng cấp phát tĩnh Vùng mã lệnh của chương trình và các hằng
Hình 2.14 Vùng nhớ ngăn xếp của hàm được giải phĩng
Sau khi hàm kết thúc thì giá trị 11 được gán cho biến sum Lệnh 5 được
thực hiện và in kết quả lên màn hình Qua ví dụ này ta đã hiểu phần nào cơ
chế hoạt động khi một hàm được gọi trong ngơn ngữ C/C++
2.8 THAM CHIẾU
2.8.1 Định nghĩa tham chiếu
Ta đã biết về con trỏ, sử dụng con trổ để xử lý các đối tượng trên vùng
nhớ heap và cách truy cập đến các đối tượng thơng qua con trỏ Tham chiếu
(Reference) cung cấp cho ta hầu hết các tinh nang của con trỏ, dễ sử dụng
Tham chiếu được xem như là một bí danh (Alias) của biến Khi tạo một tham chiếu và gán cho nĩ một cái tên của một đối tượng khác, gọi là đối tượng đích; từ lúc đĩ tham chiếu hoạt động như là chính đối tượng vừa mới được gán tên cho tham chiếu Nĩi cách khác, tham chiếu chính là cái tên thứ
hai của đối tượng Cĩ ba cách sử dụng tham chiếu: ~ Một tham chiếu cĩ thể được truyền cho hàm; - Một tham chiếu cĩ thể được trả về bởi một hàm; — Một tham chiếu độc lập cĩ thể được tạo ra 2.8.2 Khai báo tham chiếu
Khai báo tham chiếu cĩ dạng:
Trang 38Vi du: int a;
int Gra =a;
Khi đĩ biến a cĩ tên thứ hai là r_a, a là đối tượng đích, r_a là tham chiếu của a Ví dụ 2.9 Tham chiếu #include<conio.h> #include<iostream.h> void main() { int a=90; int &r_a=a; Cout<<"\n a="<<a<<", r a= "<<r a; // tác động lên tham chiếu r_a = r a + 1Ơ; cout<<"\nSau khi r_a + 10"; cout<<"\na = "<<a<<", ra = "<<r a; a=a+10; cout<<"\n Sau khi a + 10"; cout<<"\na = "<<a<<", r a = "<<r a; getch(); } Két qua: a= 90, r_a = 90 ‘Sau khi r_a + 10 a = 100, ra = 100 Sau khi a + 10 a = 110, r a = 110
2.8.3 Địa chỉ và đối tượng tham chiếu,
Như đã biết, mọi thao tác trên tham chiếu cũng như trên biến, bởi vì tham chiếu là cái tên thứ hai của biến, nên địa chỉ của nĩ cũng là địa chỉ của biến Ta cĩ thể tham chiếu đến tất cả các đối tượng, nhưng phải tạo ra một
tham chiếu đến một đối tượng cụ thể chứ khơng phải đến một kiểu dữ liệu
nào đĩ Hai câu lệnh sau giúp ta hiểu hơn vẻ vấn đề này:
Trang 392.8.4 Truyền tham chiếu cho ham
Khi khai báo nguyên mẫu hay định nghĩa hàm mà khai báo tham số là
tham chiếu thì khi gọi hàm chỉ cần truyền vào cho hàm tên của một biến nào đĩ, khi đĩ tham số của hàm sẽ là tên thứ hai của biến truyền vào, và mọi tác
động lên tham chiếu cũng như lên biến
Trong C++ tham chiếu được truyền vào cho hàm được gọi là tr ruyén theo tham biến Như vậy, muốn làm thay đổi giá trị của biến truyền vào ta dùng
tham biến là tham chiếu để truyền vào cho hàm Chẳng hạn, hốn vị hai giá
trị của hai biến trong ví dụ 2.10 dưới đây sẽ khai báo tham số của hàm là
tham chiếu wee
Vi du 2.10 Truyén tham chiéu cho ham #include<iostream.h> #include<conio.h> void hoanvi(int &r x, inté&r_y) { int Tg; Tg = rx; yx = ry; = Tg; void main() { clrscr(); int x, yi cout<<"\nNhap x va y:"7 cin>>x>>y; cout<<"\nTruoc khi hoan vi: x= "<<x<<" y="<<y; hoanvi (x,y)z l cout<<"\nSau khi hoan vi: x= "<<x<<" y="<<y; getch(); } Kế quả: Nhap x va y: 8 9
Truoc khi hoan vi: x= 8 y=9 Sau khi hoan vi: x= 9 y=8
Trang 40
Nhận xét:
~ Dùng tham chiếu để hơn dùng con trỏ là vì khơng cần phải truyền địa chỉ của biến cho hàm
— Khi xây dựng hàm chỉ cần thêm dấu ổ: trước tên tham biến, việc sử
sụng tham chiếu khơng phức tạp như với con trỏ
— Khi một đối tượng truyền cho hàm là tham chiếu thì một bản sao của đối tượng đĩ khơng được tạo ra
— Khơng được phép dùng con trỏ để trỏ đến một tham chiếu
2.9 HAM TRONG C++
2.9.1 Khai bao nguyén mau ham trong C++
Trong C cho phép khai báo nguyên mẫu hàm trước khi định nghĩa hàm
với đầy đủ các tham số hình thức trong cặp dấu ngoặc đơn "( )” sau tên
hàm; nhưng trong C++ cĩ thể khai báo nguyên mẫu hàm mà vắng mặt tên