1. Trang chủ
  2. » Giáo án - Bài giảng

Giáo trình kỹ thuật lập trình hướng đối tượng bằng c++ phần 1

143 3 0
Tài liệu được quét OCR, nội dung có thể không chính xác

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

Trang 2

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 4

2.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 5

4.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 6

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

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

Giá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 9

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

Cobo! 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 11

1.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 12

1.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 13

thứ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 14

Lớ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 15

1.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 16

cĩ 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 17

Nự 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 18

lớ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 19

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

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

f#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 22

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

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

Quy đị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 26

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

Bê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 28

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

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

Kế 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 31

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

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

char *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 35

Ví 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 36

chươ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 37

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

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

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

Ngày đăng: 24/01/2022, 10:54

w