Tài liệu BÀI GIẢNG MÔN Lập trình hướng đối tượng và C++ - Pdf 10

Bài giảng Lập trình hớng đối tợng v
C
++
iả: u Tu

1

BI GING MễN
Lp trỡnh hng ủi tng v C++

Phn A: Gii thiu

Chng 1: Lp trỡnh hng ủi tng v ngụn ng C++.(3 tit)
1. S phỏt trin ca cỏc k thut lp trỡnh
Phn ny trỡnh by v mt s k thut hay phng phỏp lp trỡnh ủc phỏt trin ủ
gii quyt cỏc vn ủ trong Tin hc k t khi mỏy tớnh ra ủi. S phỏt trin ca cỏc k
thut lp trỡnh liờn quan cht ch ti s phỏt trin phn cng ca mỏy vi tớnh cng nh
vic ng dng mỏy tớnh vo gii quyt cỏc vn ủ trong thc t. Chỳng ta cú th chia
cỏc phng phỏp lp trỡnh thnh cỏc kiu sau:
Lp trỡnh khụng cú cu trỳc
Lp trỡnh hng th tc
Lp trỡnh theo kiu module húa
Lp trỡnh hng ủi tng
Chỳng ta s ln lt xem xột cỏc k thut lp trỡnh ny.

1.1 Lp trỡnh khụng cú cu trỳc (hay lp trỡnh tuyn tớnh)
Thụng thng mi ngi bt ủu hc lp trỡnh bng cỏch vit cỏc chng trỡnh nh
v ủn gin ch cha mt chng trỡnh chớnh. ủõy mt chng trỡnh chớnh cú


21.2 Lập trình thủ tục hay lập trình có cấu trúc
Với lập trình thủ tục hay hướng thủ tục chúng ta có thể nhóm các câu lệnh thường
xuyên thực hiện trong chương trình chính lại một chỗ và ñặt tên ñoạn câu lệnh ñó
thành một thủ tục. Một lời gọi tới thủ tục sẽ ñược sử dụng ñể thực hiện ñoạn câu lệnh
ñó. Sau khi thủ tục thực hiện xong ñiều khiển trong chương trình ñược trả về ngay sau
vị trí lời gọi tới thủ tục trong chương trình chính. Với các cơ chế truyền tham số cho
thủ tục chúng ta có các chương trình con. Một chương trình chính bao gồm nhiều
chương trình con và các chương trình ñược viết mang tính cấu trúc cao hơn, ñồng thời
cũng ít lỗi hơn. Nếu một chương trình con là ñúng ñắn thì kết quả thực hiện trả về luôn
ñúng và chúng ta không cần phải quan tâm tới các chi tiết bên trong của thủ tục. Còn
nếu có lỗi chúng ta có thể thu hẹp phạm vi gỡ lỗi trong các chương trình con chưa
ñược chứng minh là ñúng ñắn, ñây ñược xem như trừu tượng hàm và là nền tảng cho
lập trình thủ tục.
Một chương trình chính với lập trình thủ tục có thể ñược xem là tập hợp các lời gọi
thủ tục.
Chương trình chính có nhiệm vụ truyền các dữ liệu cho các lời gọi cụ thể, dữ liệu
ñược xử lý cục bộ trong chương trình con sau ñó các kết quả thực hiện này ñược trả về
cho chương trình chính. Như vậy luồng dữ liệu có thể ñược minh họa như là một ñồ
thị phân cấp, một cây:


Trong lp trỡnh module cỏc th tc cú cựng mt chc nng chung s ủc nhúm li
vi nhau to thnh mt module riờng bit. Mt chng trỡnh s khụng ch bao gm
mt phn ủn l. Nú ủc chia thnh mt vi phn nh hn tng tỏc vi nhau qua
cỏc li gi th tc v to thnh ton b chng trỡnh.

Mi module cú d liu riờng ca nú. iu ny cho phộp cỏc module cú th kim
soỏt cỏc d liu riờng ca nú bng cỏc li gi ti cỏc th tc trong module ủú. Tuy
nhiờn mi module ch xut hin nhiu nht mt ln trong c chng trỡnh.
Yu ủim ca lp trỡnh th tc v lp trỡnh module húa:
Khi ủ phc tp ca chng trỡnh tng lờn s ph thuc ca nú vo cỏc kiu d
liu c bn m nú x lý cng tng theo. Vn ủ tr nờn rừ rng rng cu trỳc d
liu s dng trong chng trỡnh cng quan trng khụng kộm cỏc phộp toỏn thc
hin trờn chỳng. iu ny cng l rừ khi kớch thc chng trỡnh tng. Cỏc kiu d
liu ủc x lý nhiu trong cỏc th tc ca mt chng trỡnh cú cu trỳc. Do ủú khi
thay ủi ci ủt ca mt kiu d liu s dn ủn nhiu thay ủi trong cỏc th tc s
dng nú.
Mt nhc ủim na l khi cn dựng nhiu nhúm lm vic ủ xõy dng mt
chng trỡnh chung. Trong lp trỡnh cú cu trỳc mi ngi s ủc giao xõy dng
mt s th tc v kiu d liu. Nhng lp trỡnh viờn x lý cỏc th tc khỏc nhau
nhng li cú liờn quan ti cỏc kiu d liu dựng chung nờn nu mt ngi thay ủi
Lp trỡnh module. Chng trỡnh chớnh l s kt hp
gia cỏc li gi ti cỏc th tc trong cỏc module riờng
bit vi cỏc d liu thớch hp
Bµi gi¶ng LËp tr×nh h−íng ®èi t−îng và

các kiểu ñó.
Các ưu ñiểm của lập trình hướng ñối tượng:
• Lập trình hướng ñối tượng ra ñời ñã giải quyết ñược nhiều nhược ñiểm tồn tại
trong lập trình có cấu trúc. Trong lập trình OOP có ít lỗi hơn và việc gỡ lỗi cũng
ñơn giản hơn, ñồng thời lập trình theo nhóm có thể thực hiện rất hiệu quả. Ít lỗi là
một trong các ưu ñiểm chính của OOP vì theo thống kê thì việc bảo trì hệ thống
phần mềm sau khi giao cho người dùng chiếm tới 70% giá thành phần mềm.
• Việc thay ñổi các cài ñặt chi tiết bên dưới trong lập trình OOP không làm ảnh
hương tới các phần khác của chương trình do ñó việc mở rộng qui mô của một
chương trình dễ dàng hơn, ñồng thời làm giảm thời gian cần thiết ñể phát triển
phần mềm.
Lập trình hướng ñối tượng. Các ñối tượng tương tác
với nhau bằng cách gửi các thông ñiệp.
Bµi gi¶ng LËp tr×nh h−íng ®èi t−îng và
C
++
i¶: u Tu

5

• Với khái niệm kế thừa các lập trình viên có thể xây dựng các chương trình từ
các phần mềm sẵn có.
• OOP có tính khả chuyển cao. Một chương trình viết trên một hệ thống nền
(chẳng hạn Windows) có thể chạy trên nhiều hệ thống nền khác nhau (chẳng hạn
Linux, Unix…).
• OOP có hiệu quả cao. Thực tế cho thấy các hệ thống ñược xây dựng bằng OOP
có hiệu năng cao.

1.2 Đối tượng (Objects) và lớp (Classes)
Trong một chương trình hướng ñối tượng chúng ta có các ñối tượng. Các ñối tượng
này là ñại diện cho các ñối tượng thực trong thực tế. Có thể coi khái niệm ñối tượng
trong OOP chính là các kiểu dữ liệu trong các ngôn ngữ lập trình có cấu trúc. Mỗi một
ñối tượng có các dữ liệu riêng của nó và ñược gọi là các member variable hoặc là các
data member. Các toán tử thao tác trên các dữ liệu này ñược gọi là các member
function.
Mỗi một ñối tượng là thể hiện (instance) của một lớp. Như vậy lớp là ñại diện cho
các ñối tượng có các member function giống nhau và các data member cùng kiểu. Lớp
Bµi gi¶ng LËp tr×nh h−íng ®èi t−îng và
C
++
i¶: u Tu

6

là một sự trừu tượng hóa của khái niệm ñối tượng. Tuy nhiên lớp không phải là một
ADT, nó là một cài ñặt của một ñặc tả ADT. Các ñối tượng của cùng một lớp có thể
chia sẻ các dữ liệu dùng chung, dữ liệu kiểu này ñược gọi là class variable.

1.3 Kế thừa (Inheritance)
Khái niệm kế thừa này sinh từ nhu cầu sử dụng lại các thành phần phần mềm ñể
phát triển các phần mềm mới hoặc mở rộng chức năng của phần mềm hiện tại. Kế thừa
là một cơ chế cho phép các ñối tượng của một lớp có thể truy cập tới các member
variable và function của một lớp ñã ñược xây dựng trước ñó mà không cần xây dựng
lại các thành phần ñó. Điều này cho phép chúng ta có thể tạo ra các lớp mới là một mở
rộng hoặc cá biệt hóa của một lớp sẵn có. Lớp mới (gọi là derived class) kế thừa từ lớp

}
}
Khi biên dịch chương trình này thành mã thực hiện (file .exe) trình biên dịch không
thể xác ñịnh ñược trong mảng shape_list thì phần tử nào là Circle phần tử nào là
Rectange và do ñó không thể xác ñịnh ñược phiên bản nào của hàm draw sẽ ñược gọi
Bài giảng Lập trình hớng đối tợng v
C
++
iả: u Tu

7

thc hin. Vic gi ti phiờn bn no ca hm draw ủ thc hin s ủc quyt ủnh
ti thi ủim thc hin chng trỡnh, sau khi ủó biờn dch v ủiu ny ủc gi l
dynamic binding hoc late binding. Ngc li nu vic xỏc ủnh phiờn bn no s ủc
gi thc hin tng ng vi d liu gn vi nú ủc quyt ủnh ngay trong khi biờn
dch thỡ ngi ta gi ủú l static binding.
Vớ d ny cng cung cp cho chỳng ta mt minh ha v kh nng ủa th
(polymorphism). Khỏi nim ủa th ủc dựng ủ ch kh nng ca mt thụng ủip cú
th ủc gi ti cho cỏc ủi tng ca nhiu lp khỏc nhau ti thi ủim thc hin
chng trỡnh. Chỳng ta thy rừ li gi ti hm draw s ủc gi ti cho cỏc ủi tng
ca hai lp Circle v Rectange ti thi ủim chng trỡnh ủc thc hin.
Ngoi cỏc khỏi nim c bn trờn OOP cũn cú thờm mt s khỏi nim khỏc chng
hn nh name space v exception handling nhng khụng phi l cỏc khỏi nim bn
cht.

3. Ngụn ng lp trỡnh C++ v OOP.

i¶: u Tu

8

1983 to 1989 Language books with OO concepts
1989 to 1992 Object-oriented design books
1992 to present Object-oriented methodology books
Other Languages
Java
Self
Python
Perl
Prograph
Modula 3
Oberon
Smalltalk Venders
ParcPlace, Digitalk, Quasar
Prolog++
Ada 9X
Object Pascal (Delphi)
Object X, X = fortran, cobal, etc.
C#.
Như vậy là có rất nhiều ngôn ngữ lập trình hướng ñối tượng ñã ra ñời và chiếm ưu
thế trong số chúng là C++ và Java. Mỗi ngôn ngữ ñều có ñặc ñiểm riêng của nó và
thích hợp với các lĩnh vực khác nhau nhưng có lẽ C++ là ngôn ngữ cài ñặt nhiều ñặc
ñiểm của OOP nhất.



9

trình thực hiện cả một chương trình chậm vì bộ thông dịch phải tiến hành dịch lại các
ñoạn mã trùng lặp. BASIC ngày nay ñã thêm vào qúa trình biên dịch ñể cải thiện tốc
ñộ của chương trình. Các bộ thông dịch hiện ñại chẳng hạn như Python, tiến hành dịch
toàn bộ chương trình qua một ngôn ngữ trung gian sau ñó thực hiện bằng một bộ thông
dịch nhanh hơn rất nhiều.
Các ngôn ngữ làm việc theo kiểu thông dịch thường có một số hạn chế nhất ñịnh
khi xây dựng các dự án lớn (Có lẽ chỉ duy nhất Python là một ngoại lệ). Bộ thông dịch
cần phải luôn ñược lưu trong bộ nhớ ñể thực hiện các mã chương trình, và thậm chí
ngay cả bộ thông dịch có tốc ñộ nhanh nhất cũng không thể cải thiện ñược hoàn toàn
các hạn chế tốc ñộ.Hầu hết các bộ thông dịch ñều yêu cầu toàn bộ mã nguồn cần phải
ñược thông dịch một lần duy nhất. Điều này không những dẫn ñến các hạn chế về kích
thước của chương trình mà còn tạo ra các lỗi rất khó gỡ rối nếu như ngôn ngữ không
cung cấp các công cụ hiệu quả ñể xác ñịnh hiệu ứng của các ñoạn mã khác nhau.
Trình biên dịch: Một trình biên dịch dịch mã nguồn trực tiếp thành ngôn ngữ
assembly hoặc các lệnh máy. Kết quả cuối cùng là một file duy nhất hoặc các file chứa
các mã máy. Đây là một quá trình phức tạp và ñòi hỏi một vài bước. Quá trình chuyển
ñổi từ mã chương trình ban ñầu thành mã thực hiện là tương ñối dài ñối với một trình
biên dịch.
Tùy thuộc vào sự nhạy cảm của người viết trình biên dịch, các chương trình sinh ra
bởi một trình biên dịch có xu hướng ñòi hỏi ít bộ nhớ hơn khi thực hiện, và chúng
chạy nhanh hơn rất nhiều. Mặc dù kích thước và tốc ñộ thường là các lý do hàng ñầu
cho việc sử dụng một trình biên dịch, trong rất nhiều trường hợp ñây không phải là các
lý do quan trọng nhất. Một vài ngôn ngữ (chẳng hạn như C) ñược thiết kế ñể các phần
tách biệt của một chương trình có thể ñược biên dịch ñộc lập hoàn toàn với nhau. Các
phần này sau ñó thậm chí có thể kết hợp thành một chương trình thực hiện cuối cùng
duy nhất bởi một công cụ có tên là trình liên kết. Quá trình này gọi là separate
compilation (biên dịch ñộc lập).

lp trỡnh bng C v C++ chỳng ta cn phi hiu cỏc bc v cỏc cụng c trong
quỏ trỡnh biờn dch. Mt vi ngụn ng (ủc bit l C v C++) bt ủu thc hin quỏ
trỡnh biờn dch bng cỏch chy mt b tin x lý ủi vi mó ngun. B tin x lý l
mt chng trỡnh ủn gin thay th cỏc mu trong mó ngun bng cỏc mu khỏc m
cỏc lp trỡnh viờn ủó ủnh ngha (s dng cỏc ch th tin x lý: preprocessor
directives). Cỏc ch th tin x lý ủc s dng ủ tit kim vic gừ cỏc ủon chng
trỡnh thng xuyờn s dng v tng kh nng d ủc cho mó ngun. Tuy nhiờn cỏc ch
th tin x lý ny ủụi khi cng gõy ra nhng li rt tinh vi v khú phỏt hin. Mó sinh ra
bi b tin x lý ny thng ủc ghi lờn mt file tm.
Cỏc trỡnh biờn dch thng thc hin cụng vic ca nú theo hai pha. u tiờn l
phõn tớch mó tin x lý. B biờn dch chia mó tin x lý thnh cỏc ủn v nh v t
chc chỳng thnh mt cu trỳc gi l cõy. Vớ d nh trong biu thc: A+B cỏc phn
t A, +, B s ủc lu trờn nỳt ca cõy phõn tớch.
Mt b ti u húa ton cc (global optimizer) ủụi khi cng ủc s dng ủ to ra
mó chng trỡnh nh hn, nhanh hn.
Trong pha th hai, b sinh mó duyt qua cõy phõn tớch v sinh ra hoc l mó
assemble hoc mó mỏy cho cỏc nỳt ca cõy. Nu nh b sinh mó to ra mó assembly,
thỡ sau ủú chng trỡnh dch mó assembler s thc hin cụng vic tip theo. Kt qu
ca hai trng hp trờn ủu l mt module object (mt file thng cú ủuụi l .o hoc
.obj). Sau ủú mt b ti u hoỏ nh (peep-hole) s ủc s dng ủ loi b cỏc ủon
cha cỏc cõu lnh assembly tha.
Vic s dng t object ủ mụ t cỏc ủon mó mỏy l mt thc t khụng ủỳng
lm. T ny ủó ủc dựng trc c khi lp trỡnh hng ủi tng ra ủi. T object
ủc s dng cú ý ngha nh l t goal khi núi v vic biờn dch, trong khi ủú trong
lp trỡnh hng ủi tng nú li cú ngha l a thing with boundaries.
Trỡnh liờn kt kt hp mt danh sỏch cỏc module object thnh mt chng trỡnh
thc hin cú th np vo b nh v thc hin bi h ủiu hnh. Khi mt hm trong mt
module object to ra mt tham chiu ti mt hm hoc mt bin trong mt module
object khỏc, trỡnh liờn kt s sp xp li cỏc tham chiu ny; ủiu ny ủm bo rng tt
c cỏc hm v d liu external ủc s dng trong quỏ trỡnh biờn dch l ủu tn ti.

ñặc ñiểm mà ñã làm cho ngôn ngữ C trở nên nổi tiếng.
Chúng ta có thể không dùng tùy chọn kiểm tra kiểu tĩnh của C++ hoặc cũng có thể
thực hiện việc kiểm tra kiểu ñộng - chỉ cần viết thêm mã.

Các công cụ cho việc biên dịch ñộc lập
Việc biên dịch ñộc lập rất cần thiết nhất là ñối với các dự án lớn. Trong ngôn ngữ
C và C++, một lập trình viên có thể tạo ra các ñoạn chương trình nhỏ dễ quản lý và
ñược kiểm thử ñộc lập. Công cụ cơ bản ñể chia một chương trình thành các phần nhỏ
là khả năng tạo ra các thay thế ñược ñặt tên hay là các chương trình con. Trong C và
C++ một chương trình con ñược gọi là một hàm, và các hàm là các ñoạn mã có thể
ñược thay thế trong các file khác nhau, cho phép thực hiện quá trình biên dịch ñộc lập.
Nói một cách khác các hàm là các ñơn vị nguyên tử của mã nguồn, vì chúng ta không
thể ñặt các phần khác nhau của hàm trong các file khác nhau nên nội dung của một
hàm cần phải ñược ñặt hoàn toàn trong một file (mặc dù các file có thể chứa nhiều hơn
1 hàm).
Khi chúng ta gọi ñến một hàm, chúng ta thường truyền cho nó một vài tham số, ñó
là các giá trị mà chúng ta muốn hàm làm việc với khi nó thực hiện. Khi hàm thực hiện
xong chúng ta thường nhận ñược một giá trị trả về, một gía trị mà hàm trả lại như là
một kết quả. Cũng có thể viết các hàm không nhận các tham số và không trả về bất kỳ
giá trị nào.
Để tạo ra một chương trình với nhiều file, các hàm trong một file phải truy cập tới
các hàm và dữ liệu trong các file khác. Khi biên dịch một file, trình biên dịch C hoặc
C++ phải biết về các hàm và dữ liệu trong các file khác ñặc biệt là tên và cách dùng
chúng. Trình biên dịch ñảm bảo các hàm và dữ liệu ñược sử dụng ñúng ñắn. Qúa trình
báo cho trình biên dịch tên và nguyên mẫu của các hàm và dữ liệu bên ngoài ñược gọi
là khai báo (declaration). Khi chúng ta ñã khai báo một hàm hoặc biến trình biên dịch
sẽ biết cách thức kiểm tra ñể ñảm bảo các hàm và dữ liệu này ñược sử dụng ñúng ñắn.

Including các file Header
Hầu hết các thư viện ñều chứa một số lượng ñáng kể các hàm và biến. Để tiết kiệm

Nói chung thì ñối với các file include chuẩn hoặc ñược sử dụng nhiều chúng ta nên
ñặc nó trong thư mục mặc ñịnh là include dưới thư mục cài ñặt trình biên dịch và dùng
chỉ thị theo kiểu <>, còn ñối với các file ñặc thù với ứng dụng cụ thể thì dùng kiểu tên
file ñặt giữa hai dấu “”.
Trong quá trình phát triển của C++ các nhà cung cấp các trình biên dịch có các qui
ước ñặt tên khác nhau và các hệ ñiều hành lại có các hạn chế tên khác nhau ñặc biệt là
ñộ dài của tên file. Các vấn ñề này gây ra các vấn ñề về tính khả chuyển của chương
trình. Để khắc phục vấn ñề này người ta ñã sử dụng một ñịnh dạng chuẩn cho phép các
tên file header có thể dài hơn 8 ký tự và bỏ ñi phần tên mở rộng.
Để phân biệt một chương trình C và C++ ñôi khi người ta còn dùng cách thêm một
ký tự “c” vào trước tên của các file header, chi tiết này cũng ñược chấp nhận ñối với C
và C++.

Quá trình liên kết
Trình liên kết tập hợp các module object (thường là các file có phần mở rộng là .o
hoặc .obj), ñược sinh ra bởi trình biên dịch, thành một chương trình có thể thực hiện
ñược và hệ ñiều hành có thể nạp vào bộ nhớ và chạy. Đây là pha cuối cùng trong quá
trình biên dịch.
Các ñặc ñiểm của các trình liên kết thay ñổi phụ thuộc vào các hệ thống khác nhau.
Nói chung chúng ta chỉ cần chỉ rõ cho trình liên kết biết tên của các module object và
các thư viện mà chúng ta muốn liên kết, và tên của chương trình khả chạy cuối cùng.
Một vài hệ thống ñòi hỏi chúng ta cần phải tự gọi tới các trình liên kết. Tuy nhiên hầu
hết các trình biên dịch hoàn chỉnh ñều thực hiện hộ chúng ta công việc này.

Sử dụng các thư viện
Giờ ñây chúng ta ñã biết các thuật ngữ cơ bản, chúng ta có thể hiểu cách thức sử
dụng một thư viện. Để sử dụng một thư viện cần phải:
• Include file header của thư viện
• Sử dụng các hàm và các biến trong thư viện
• Liên kết thư viện vào chương trình khả chạy cuối cùng

Vỡ trỡnh liờn kt tỡm kim cỏc file theo th t chỳng ta cú th che ủi s tn ti ca
mt hm th vin bng cỏch dựng hm ca chỳng ta vi phn ủnh ngha v prototype
y ht nh hm th vin. Tuy nhiờn ủiu ny cng cú th gõy ra cỏc li m chỳng ta
khụng th kim soỏt ủc.
Khi mt chng trỡnh kh chy ủc vit bng C hoc C++ ủc to ra, mt s cỏc
thnh phn nht ủnh s ủc liờn kt vi nú mt cỏch bớ mt. Mt trong cỏc thnh
phn ny chớnh l module khi ủng (startup), module ny cha cỏc th tc khi to
cn phi ủc thc hin bt c khi no mt chng trỡnh C hay C++ bt ủu chy. Cỏc
th tc ny thit lp stack v cỏc bin khi to nht ủnh trong chng trỡnh.
Trỡnh biờn dch luụn thc hin vic tỡm kim trong cỏc th vin chun ủ thc hin
liờn kt cỏc hm chun m chỳng ta dựng trong chng trỡnh nờn ủ dựng cỏc hm
trong cỏc th vin chun chỳng ta ủn gin ch cn include file header ca th vin ủú.
Cũn ủi vi cỏc th vin riờng do chỳng ta to ra chỳng ta cn ch rừ tờn th vin cho
trỡnh liờn kt (chng hn th vin graphics khụng phi l mt th vin chun).

1.2 Chng trỡnh ủu tiờn.
Cỏch tt nht ủ hc lp trỡnh l xem cỏc chng trỡnh ca ngi khỏc vit v
hc tp cỏc k thut lp trỡnh ca h. Sau ủõy l chng trỡnh HelloWorld ủc
vit bng C++, mt chng trỡnh m hu ht cỏc sỏch lp trỡnh ủu ly lm vớ d
m ủu.
// Chng trỡnh HelloWorld
// File hello.cpp
// In ra mn hỡnh xõu Hello, World!

#include <iostream.h> // Khai bỏo lung cout ủ s dng

int main() {
cout << "Hello, World! I am "
<< 20 << today. endl;
return 0;

header chỳng ta nờn cú kốm mt vi chỳ thớch ngn gn v mc ủớch ca file ủú, chng
hn ủõy chỳng ta include file header iostream l vỡ cn s dng ủi tng cout trong
th vin iostream.
Tip theo l hm main() cú kiu tr v l int v khụng nhn tham s no. Ging
nh C tt c cỏc chng trỡnh C++ ủu cú mt v duy nht mt hm main() v nu
chỳng ta khụng núi gỡ cú ngha l hm main s tr v mt giỏ tr cú kiu int nờn ủ
trỏnh mt vi rc ri chỳng ta nờn xỏc ủnh kiu ca hm main l int v tr v 0 trc
khi kt thỳc hm. Prototype ca hm main l: int main() cú ngha l hm ny cú th
nhn bt bao nhiờu tham s tu ý.
Trong cõu lnh tip theo chỳng ta s dng ủi tng cout (console output) ủ in ra
mt lot cỏc tham s thụng qua cỏc toỏn t <<. Chỳng ta ủó bit trong ngụn ng C
toỏn t << l toỏn t dch bit trỏi nhng trong C++ ngoi ý ngha l mt toỏn t dch
bit trỏi nú cũn l mt toỏn t ca ủi tng cout, ủú chớnh l mt minh ha cho kh
nng overload cỏc toỏn t ca C++ m chỳng ta s hc sau ny. Cng cn chỳ ý l cõu
lnh ny ủc vit trờn nhiu dũng, C++ cho phộp mt cõu lnh cú th vit trờn nhiu
dũng. Trỡnh biờn dch nhn bit s kt thỳc mt cõu lnh trong C++ bng cỏch nhn
bit s cú mt ca cỏc du ;.
endl l mt hm ủc bit thuc th vin cỏc lung vo ra chun nú kt thỳc dũng
hin ti ca cout l nhy xung dũng tip theo.
i tng cout cú kh nng x lý nhiu tham s tng ng vi cỏc toỏn t <<.
Nú xem cỏc tham s ủú nh l mt dóy cỏc ký t, nu l cỏc kiu d liu khỏc (ngoi
kiu xõu: cỏc ký t gia hai du v ) cout s cú hai cỏch thc x lý. Th nht nu ủú
l cỏc kiu c bn chỳng s ủc chuyn thnh mt dóy cỏc ký t gia hai du , cũn
nu l mt kiu t ủnh ngha (lp hoc struct) thỡ cú th s gi ti hm overload toỏn
t ca kiu ủú <<.
Dũng lnh cui cựng l cõu lnh return 0 ủ phự hp vi prototype ca hm main
ủc khai bỏo ban ủu.
Bµi gi¶ng LËp tr×nh h−íng ®èi t−îng và
C
++

extern int a;
Khai báo này sẽ báo cho trình biên dịch biết rằng biến có tên là a là tồn tại và nó ñã
hoặc sẽ ñược ñịnh nghĩa ñâu ñó trong chương trình.
Ví dụ:
// file: Declare.cpp
// Ví d
khai báo và ñịnh nghĩa biến
extern int i; // khai báo và không ñịnh nghĩa
float b; // khai báo và ñịnh nghĩa
int i; // ñịnh nghĩa biến i

int main() {
b = 1.0;
i = 2;
}
Các biến có thể ñược khai báo ở bất kỳ một vị trí nào trong chương trình, ñiều này
có ñôi chút khác biệt so với các chương trình C.

2.2 Tầm hoạt ñộng của các biến
Khái niệm tầm hoạt ñộng của các biến cho chúng ta biết khu vực (phần chương
trình) mà một biến nào ñó có thể ñược sử dụng hợp lệ và khu vực nào thì việc truy cập
tới một biến là không hợp lệ. Tầm hoạt ñộng của một biến bắt ñầu từ vị trí mà nó ñược
khai báo cho tới dấu “}” ñầu tiên khớp với dấu “{“ ngay trước khai báo của biến ñó.
Có nghĩa là tầm hoạt ñộng của một biến ñược xác ñịnh là trong cặp “{“ và “}” gần
nhất bao nó. Tất nhiên tầm hoạt ñộng của các biến có thể chồng lên nhau.

Bài giảng Lập trình hớng đối tợng v
C
++
iả: u Tu

}
Mc dự vy vic khai bỏo nh trờn ch thng ủc dựng vi cỏc vũng lp for vỡ
ủụi khi nú gõy ra mt s li. Vớ d cõu lnh:
while( (char c = cin.get()) !=q ){
}
s lm chỳng ta ngc nhiờn vi kt qu nhn ủc. Vỡ toỏn t != cú ủ u tiờn cao
hn toỏn t gỏn = nờn c s nhn mt giỏ tr cú kiu Bool v sau ủú mi ủc convert
sang kiu char.

2.4 Cỏc kiu bin
Bin ton cc (global variable)
Cỏc bin ton cc ủc ủnh ngha bờn ngoi tt c cỏc hm v cú th ủc s
dng trong tt c cỏc phn ca chng trỡnh (thm chớ ngay c phn chng trỡnh nm
trong mt file mó ngun khỏc). Cỏc bin ton cc khụng b nh hng bi cỏc tm
hot ủng (chỳng tn ti cho ti khi chng trỡnh kt thỳc).
Khi cn tham chiu ti cỏc bin ton cc trong mt file m nú cha ủc khai bỏo
(bin ny ủc khai bỏo trong mt file khỏc) chỳng ta s dng t khúa extern ủ ch ra
rng bin ủú l mt bin ton cc ủc khai bỏo trong file khỏc.

Bin cc b (hay ủa phng, local)
Cỏc bin ủa phng thng ủc khai bỏo trong mt phm vi hay tm hot ủng
nht ủnh, thng l trong mt hm. Cỏc bin ủa phng ny cũn ủc gi l cỏc bin
Bµi gi¶ng LËp tr×nh h−íng ®èi t−îng và
C
++
i¶: u Tu


Ngoài ý nghĩa trên từ khóa static thường có một ý nghĩa khác ñó là “không thể sử
dụng ngoài một phạm vi nhất ñịnh”. Khi từ khóa static ñược dùng ñể khai báo một tên
hàm hoặc một biến nằm ngoài tất cả các hàm trong một file mã nguồn thì có nghĩa là
biến ñó chỉ có tầm hoạt ñộng trong file ñó mà thôi. Khi ñó chúng ta nói là biến ñó có
tầm hoạt ñộng file.

2.5 Liên kết biến khi biên dịch
Để hiểu cách thức hoạt ñộng của các chương trình C và C++ chúng ta cần phải hiểu
quá trình liên kết diễn ra như thế nào. Có hình thức liên kết các biến khi biên dịch: liên
kết trong và liên kết ngoài.
Liên kết trong có nghĩa là bộ nhớ (vùng lưu trữ) ñược tạo ra ñể biểu diễn ñịnh danh
chỉ cho file ñang ñược biên dịch. Các file khác có thể sử dụng ñịnh danh ñó ñối với
liên kết trong, hoặc với một biến toàn cục. Liên kết trong thường ñược thực hiện với
các biến static.
Liên kết ngoài có nghĩa là mỗi vùng nhớ ñược tạo ra ñể biểu diễn ñịnh danh cho tất
cả các file ñang ñược biên dịch. Các vùng nhớ này chỉ ñược tạo ra một lần và trình liên
kết phải sắp xếp lại tất cả các tham chiếu tới vùng nhớ ñó. Các tên hàm và các biến
toàn cục có các liên kết ngoài và chúng có thể ñược truy cập trong các file khác bằng
Bµi gi¶ng LËp tr×nh h−íng ®èi t−îng và
C
++
i¶: u Tu

18

cách khai báo bằng từ khóa extern. Các biến ñịnh nghĩa ngoài các hàm (trừ các const)
và các ñịnh nghĩa hàm là mặc ñịnh ñối với liên kết ngoài. Chúng ta có thể buộc chúng


Biến kiểu volatile
Trong khi từ khóa const có nghĩa là biến không thay ñổi giá trị thì khai báo biến
với từ khóa volatile có nghĩa là chúng ta không biết biến này sẽ thay ñổi lúc nào và do
ñó trình biên dịch sẽ không thực hiện các tối ưu hóa dựa trên giả thiết về sự ổn ñịnh
của biến này. Một biến volatile sẽ ñược ñọc vào khi mà giá trị của nó ñược cần ñến.
Một trường hợp ñặc biệt của các biến volatile là khi chúng ta viết các chương trình
ña luồng. Ví dụ khi chúng ta ñang chờ ñợi một cờ nào ñó ñang ñược xử lý bởi một
luồng khác thì biến cờ ñó bắt buộc phải là volatile.
Các biến volatile không có ảnh hưởng gì tới chương trình nếu chúng ta không thực
hiện tối ưu hóa nó nhưng sẽ có thể có các lỗi rất tinh vi khi chúng ta tiến hành tối ưu
hóa chương trình.

3. Hàm trong C++
Bµi gi¶ng LËp tr×nh h−íng ®èi t−îng và
C
++
i¶: u Tu

19

Trong ngôn ngữ C cổ (không phải là ngôn ngữ C chuẩn mà chúng ta dùng hiện
nay) chúng ta có thể thực hiện việc gọi hàm với số lượng tham số cũng như kiểu tham
số tùy ý mà trình biên dịch sẽ không phàn nàn gì cả. Tất cả dường như ñều tốt cho tới
khi chúng ta chạy chương trình. Có thể chúng ta sẽ nhận ñược các kết quả rất khó hiểu
mà không có bất cứ một dấu hiệu hay gợi ý nào về chúng. Đây có lẽ là một trong các
lý do làm cho C trở thành một ngôn ngữ ñược ñánh giá là ngôn ngữ Assembly cấp cao.

Các giá trị trả về của hàm
Trong nguyên mẫu hàm chúng ta buộc phải chỉ rõ kiểu của hàm, nếu một hàm
không có kiểu trả về thì kiểu của nó là void. Trong mỗi một thân hàm có kiểu bao giờ
cũng có ít nhất một câu lệnh return. Khi gặp lệnh này trong quá trình thực hiện, hàm sẽ
kết thúc.Trong các hàm không kiểu cũng có thể dùng return ñể thoát khỏi hàm.
Một trong các ñiểm mạnh của ngôn ngữ C và C++ là một thư viện hàm rất phong
phú và linh hoạt. Để sử dụng chúng, lập trình viên chỉ cần thực hiện include các file
header chứa các prototype của chúng trong chương trình, phần còn lại sẽ tự do trình
biên dịch và trình liên kết thực hiện.
Bµi gi¶ng LËp tr×nh h−íng ®èi t−îng và
C
++
i¶: u Tu

20

Chúng ta có thể tạo ra các thư viện hàm riêng cho mình ñể sử dụng. Tuy nhiên hãy
xem kỹ phần manual của trình biên dịch trước khi thực hiện.

4. Các cấu trúc ñiều khiển
Các câu lệnh ñiều khiển là ñiều mà mọi lập trình viên cần phải biết trước khi viết
bất cứ một chương trình nào. Chúng ta có các câu lệnh ñiều khiển: if-else, while, do,
do-while, for và câu lệnh lựa chọn switch.
Các câu lệnh ñiều kiện dựa trên kết quả ñúng hoặc sai của một biểu thức ñiều kiện
ñể xác ñịnh ñường ñi của chương trình. Trong C++ hai từ khóa true và false ñã ñược
ñưa vào ñể biểu thị cho kết quả ñúng hoặc sai của một biểu thức ñiều kiện, tuy nhiên
các qui ước cũ vẫn có thể ñược dùng: một gía trị bất kỳ khác 0 sẽ ñược coi là ñúng và

Sự khác biệt của vòng lặp do – while so với vòng lặp while là vòng lặp do – while
thực hiện ít nhất một lần ngay cả khi biểu thức ñiều kiện cho giá trị false trong lần tính
toán ñầu tiên. Cú pháp của vòng lặp do – while:
do
Statement
Bµi gi¶ng LËp tr×nh h−íng ®èi t−îng và
C
++
i¶: u Tu

21

while(expression);
Vì một vài lý do các lập trình viên thường ít sử dụng vòng lặp do – while hơn so
với vòng lặp while.

4.4 Vòng lặp xác ñịnh for
Vòng lặp for thực hiện một thao tác khởi tạo trước khi thực hiện lần lặp ñầu tiên.
Sau ñó thực hiện quá trình kiểm tra ñiều kiện thực hiện của vòng lặp, và tại cuối mỗi
lần thực hiện của vòng lặp thực hiện một thao tác nhảy qua một số giá trị nào ñó của
biến ñiều khiển. Cú pháp:
for(initialization; conditional; step)
statement
Bất kỳ biểu thức nào trong các biểu thức initialization, conditional và step ñều có
thể là các biểu thức rỗng tuy nhiên trong trường hợp ñó cần giữ lại các dấu chấm phẩy.
Biểu thức khởi tạo chỉ ñược thực hiện lần ñầu tiên trước khi vòng lặp ñược thực hiện.
Biểu thức conditional sẽ ñược kiểm tra mỗi khi vòng lặp thực hiện và nếu nó nhận giá

for(i = 0, j = strlen(s) – 1; i < j; i++, j ){
Bài giảng Lập trình hớng đối tợng v
C
++
iả: u Tu

22

c = s[i];
s[i] = s[j];
s[j] = c;
}
}

4.5 Cỏc t khúa break v continue
Chỳng ta cú th thc hin ủiu khin vic thc hin trong thõn cỏc vũng lp bng
cỏc cõu lnh break v continue. Cõu lnh break s thoỏt khi thõn vũng lp v khụng
thc hin phn cũn li, cõu lnh continue quay tr li thc hin bc lp tip theo (b
qua phn cỏc cõu lnh nm sau nú trong vũng lp). Lnh break l cn thit ủ thoỏt
khi cỏc vũng lp m ủiu kin thc hin luụn luụn ủỳng chng hn nh while(true).

4.6 Cõu lnh la chn switch
Cõu lnh switch la chn thc hin cỏc cõu lnh trong mt nhúm cỏc cõu lnh da
trờn giỏ tr ca mt biu thc nguyờn. Cỳ phỏp ca nú nh sau:
switch(bin la chn){
case integral_value1: statement; break;
case integral_value2: statement; break; 23

Đặc tả của ngôn ngữ C chuẩn cho các kiểu dữ liệu built – in không chỉ rõ cụ thể
các kiểu dữ liệu này cần bao nhiêu bit. Thay vào ñó nó qui ñịnh các giá trị max và min
các bit mà mỗi kiểu dữ liệu có thể chứa. Khi ñó tuỳ thuộc vào hệ thống nền mà chúng
ta sử dụng các biến của cùng một chương trình sẽ có kích thước khác nhau khi biên
dịch trên các hệ thống khác nhau. Ví dụ với các chương trình chạy trên DOS các biến
kiểu int sẽ có kích thước là 2 byte tức 16 bit nhưng trên Linux kiểu int sẽ là 32 bit tức
4 byte. Các giá trị giới hạn này ñược ñịnh nghĩa trong hai file header hệ thống là
limit.h và float.h.
Về cơ bản cả C và C++ ñều có 4 kiểu dữ liệu built-in là char, int, float và double.
Kiểu char có kích thước nhỏ nhất là 8 bit mặc dù thực tế có thể lớn hơn. Kiểu int có
kích thước nhỏ nhất là 2 byte còn kiểu float và double là hai kiểu số thực có ñộ chính
xác ñơn và kép, chúng có format tuân theo chuẩn IEEE.
Như ñã ñề cập ở trên kiểu bool là một kiểu chuẩn của ngôn ngữ C++ với hai giá trị
là true và false. Tuy nhiên rất nhiều chương trình vẫn dùng các giá trị kiểu int thay cho
các giá trị kiểu bool nên trong các trường hợp cần ñến một giá trị bool trình biên dịch
thường thực hiện chuyển kiểu từ int sang bool hoặc có cảnh báo cho chúng ta ñể chính
xác hóa các trường hợp này.
Ngoài 4 kiểu trên ra chúng ta có thể sử dụng các từ khóa bổ trợ sau ñể mở rộng khả
năng lưu trữ của chúng. C++ cung cấp 4 từ khóa bổ trợ là: long, short, signed và
unsigned.
long và short ñược dùng ñể chỉ ñịnh các giá trị max và min mà một kiểu dữ liệu sẽ
lưu giữ. Một biến kiểu int sẽ có kích thước bằng kích thước nhỏ nhất của một biến
kiểu short int. Các kiểu dữ liệu số nguyên có thể là: short int và long int.
Với các kiểu thực ta có long float và long double, không có các kiểu số thực với từ

24

}
output nhn ủc khi chy chng trỡnh trờn l:

0x1491ffc0
9
0x1491ffbe
0x1491ffc0
Giỏ tr ca pn ủỳng bng ủa ch ca bin n v *pn bng giỏ tr ca n. Toỏn t *
ủc gi l toỏn t tham chiu li (dereference), nú cú th ủc dựng ủ khai bỏo bin
con tr, tham chiu ti giỏ tr ca bin m mt bin con tr tr ti.
Hai ng dng c bn ca con tr l:
- thay ủi giỏ tr ca cỏc ủi tng bờn ngoi mt hm s. õy l ng
dng c bn nht ca cỏc bin con tr.
- cỏc k thut lp trỡnh tinh vi khỏc m chỳng ta s hc sau.
Tham chiu (reference)
n tng ban ủu ca chỳng ta v cỏc tham chiu l chỳng khụng cn thit. Chỳng
ta cú th vit cỏc chng trỡnh m khụng cn ti cỏc tham chiu. iu ny núi chung l
ủỳng tr mt s trung hp m chỳng ta s hc sau ny. Thc ra khỏi nim truyn bin
qua tham chiu (pass by reference) khụng phi l mt khỏi nim ch cú C++, nú cng
l mt phn c bn trong mt s ngụn ng khỏc.
Khỏi nim v tham chiu cng cú s tng ủng vi khỏi nim con tr: chỳng ta cú
th truyn ủa ch ca mt tham bin (trong mt hm) qua mt tham chiu. Tuy nhiờn
s khỏc nhau gia con tr v tham chiu l truyn bng tham chiu cú v sch s hn
(cleaner) so vi con tr. Tham chiu cho phộp cỏc hm cú th thay ủi giỏ tr ca cỏc
ủi tng ngoi nh con tr tuy nhiờn trong cỳ phỏp cú s khỏc nhau chỳt ớt:
Trong danh sỏch tham s ca hm chỳng ta dựng khai bỏo int & n ủ bỏo rng
chỳng ta mun truyn bng tham chiu v truy cp bỡnh thng nh mt bin khỏc
(con tr cn dựng du * ủ truy cp ti giỏ tr bin). Khi gi hm cỳ phỏp ủi vi vic

div, phép lấy phần dư không thực hiện ñược với các số dấu phẩy ñộng.
Cả C và C++ ñều có một cơ chế viết các câu lệnh tắt cho phép thực hiện ñồng thời
một phép gán và một toán tử toán học. Điều này ñược thực hiện bằng cách viết một
toán tử trước một dấu =. Ví dụ: x += 4;

6.3 Các toán tử quan hệ
Các toán tử quan hệ thiết lập một quan hệ giữa các giá trị của toán hạng. Chúng
sinh ra một giá trị có kiểu Boolean, là true nếu quan hệ ñó là ñúng và false nếu như
quan hệ ñó là sai. Các toán tử quan hệ gồm có: nhỏ hơn (<), lớn hơn (>), nhỏ hơn hoặc
bằng (<=), lớn hơn hoặc bằng và bằng. Các toán tử này ñều có thể sử dụng với các
kiểu dữ liệu built-in của C và C++.

6.4 Các toán tử logic
Các toán tử logic and (&&) và hoặc (||) cho ta kết quả là true hoặc false dựa trên
mới quan hệ logic giữa các tham số của chúng. Chú ý rằng trong C và C++ true có
nghĩa là một giá trị khác 0 và false có nghĩa là một giá trị bằng 0. Khi in ra màn hình
true sẽ là 1 và false sẽ là 0.
Việc sử dụng các toán tử logic này cũng không có gì ñặc biệt chỉ cần chú ý ñối với
các số dấu phẩy ñộng, ví dụ:
float t = 1.22222e12123123, f = 1.22223e12123123;
cout << (t == f);
Sẽ cho ta một kết quả true.

6.5 Các toán tử bitwise
Các toán tử bitwise ñược sử dụng khi chúng ta muốn thao tác với các bit cụ thể của
các biến có kiểu số (do các số thực dấu phẩy ñộng có ñịnh dạng riêng nên các toán tử
này chỉ làm việc với các biến kiểu char, int, và long). Các toán tử bitwise thực hiện
các phép tính ñại số Boolean trên các bit tương ứng của các tham số của nó.
Các toán tử bitwise gồm có toán tử and, or, not và xor ñược ñịnh nghĩa như trong
ñại số bool.


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status