Thông tin tài liệu
Bài giảng Lập trình hớng đối tợng v
C
++
iả: u Tu
tuannhtn@yahoo.com
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ú
ngha l mt tp cỏc lnh hoc cõu lnh lm vic vi cỏc d liu ton cc trong c
chng trỡnh (cỏc bin dựng trong chng trỡnh l cỏc bin ton cc). Chỳng ta cú th
minh ho bng hỡnh v sau ủõy:
Mt s nhc ủim ca lp trỡnh khụng cú cu trỳc:
Lp trỡnh khụng cú cu trỳc khụng cú kh nng kim soỏt tớnh thy ủc ca d
liu. Mi d liu trong chng trỡnh ủu l bin ton cc do ủú cú th b thay ủi
bi bt k phn no ủú ca chng trỡnh.
Vic khụng kim soỏt ủc tớnh thy ủc ca d liu dn ủn cỏc khú khn
trong vic g li chng trỡnh, ủc bit l cỏc chng trỡnh ln.
K thut lp trỡnh khụng cú cu trỳc cú rt nhiu bt li ln khi chng trỡnh ủ
ln. Vớ d nu chỳng ta cn thc hin li mt ủon cõu lnh trờn mt tp d liu
khỏc thỡ buc phi copy ủon lnh ủú ti v trớ trong chng trỡnh m chỳng ta
mun thc hin. iu ny lm ny sinh ý tng trớch ra cỏc ủon lnh thng
xuyờn cn thc hin ủú, ủt tờn cho chỳng v ủa ra mt k thut cho phộp gi v
tr v cỏc giỏ tr t cỏc th tc ny.
Lp trỡnh khụng cú cu trỳc. Chng trỡnh chớnh
thao tỏc trc tip trờn cỏc d liu ton cc
Bµi gi¶ng LËp tr×nh h−íng ®èi t−îng và
C
++
i¶: u Tu
tuannhtn@yahoo.com
2
1.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:
Lập trình thủ tục. Sau khi chương trình con thực
hiện xong ñiều khiển ñược trả về ngay sau vị trí lời
gọi tới chương trình con
Lập trình hướng thủ tục. Chương trình chính
phối hợp các lời gọi tới các thủ tục với các dữ
liệu thích hợp là các tham số
Bài giảng Lập trình hớng đối tợng v
C
++
iả: u Tu
tuannhtn@yahoo.com
3
Lp trỡnh hng th tc l mt k thut lp trỡnh cú nhiu u ủim. Khỏi nim
chng trỡnh con l mt ý tng rt hay, nú cho phộp mt chng trỡnh ln cú th
ủc chia thnh nhiu chng trỡnh con nh hn, ủo ủú d vit hn v ớt li hn.
cú th s dng ủc cỏc th tc chung hoc mt nhúm cỏc th tc trong cỏc chng
trỡnh khỏc, ngi ta ủó phỏt minh ra mt k thut lp trỡnh mi, ủú l k thut lp trỡnh
theo kiu module.
1.3 Lp trỡnh module
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
++
i¶: u Tu
tuannhtn@yahoo.com
4
kiểu dữ liệu thì sẽ làm ảnh hưởng tới công việc của nhiều người khác, ñặc biệt là
khi có sai sót trong việc liên lạc giữa các thành viên của nhóm.
• Việc phát triển các phầm mềm mất nhiều thời gian tập trung xây dựng lại các
cấu trúc dữ liệu cơ bản. Khi xây dựng một chương trình mới trong lập trình có cấu
trúc lập trình viên thường phải xây dựng lại các cấu trúc dữ liệu cơ bản cho phù
hợp với bài toán và ñiều này ñôi khi rất mất thời gian.
1.4 Lập trình hướng ñối tượng
Trong lập trình hướng ñối tượng trong mỗi chương trình chúng ta có một số các ñối
tượng (object) có thể tương tác với nhau, thuộc các lớp (class) khác nhau, mỗi ñối
tượng tự quản lý lấy các dữ liệu của riêng chúng.
Chương trình chính sẽ bao gồm một số ñối tượng là thể hiện (instance) của các lớp,
các ñối tượng này tương tác với nhau thực hiện các chức năng của chương trình. Các
lớp trong lập trình hướng ñối tượng có thể xem như là một sự trừu tượng ở mức cao
hơn của các cấu trúc (struct hay record) hay kiểu dữ liệu do người dùng ñịnh nghĩa
trong các ngôn ngữ lập trình có cấu trúc với sự tích hợp cả các toán tử và dữ liệu trên
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
tuannhtn@yahoo.com
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.
2. Một số khái niệm cơ bản của lập trình hướng ñối tượng
1.1 Kiểu dữ liệu trừu tượng ADT(Astract Data Type)
Một số người ñịnh nghĩa OOP là lập trình với các kiểu dữ liệu trừu tượng và các
mối quan hệ giữa chúng. Trong phần này chúng ta sẽ xem xét các kiểu dữ liệu trừu
tượng như là một khái niệm cơ bản của OOP và sử dụng một số ví dụ ñể minh họa.
Định nghĩa về kiểu dữ liệu trừu tượng:
Một kiểu dữ liệu trừu tượng là một mô hình toán học của các ñối tượng dữ liệu tạo
thành một kiểu dữ liệu và các toán tử (phép toán) thao tác trên các ñối tượng ñó. Chú ý
là trong ñịnh nghĩa này các toán tử thao tác trên các ñối tượng dữ liệu gắn liền với các
ñối tượng tạo thành một kiểu dữ liệu trừu tượng. Đặc tả về một kiểu dữ liệu trừu tượng
không có bất kỳ một chi tiết cụ thể nào về cài ñặt bên trong của kiểu dữ liệu. Việc cài
ñặt một kiểu dữ liệu trừu tượng ñòi hỏi một quá trình chuyển ñổi từ ñặc tả của nó sang
một cài ñặt cụ thể trên một ngôn ngữ lập trình cụ thể. Điều này cho phép chúng ta
phân biệt các ADT với các thuật ngữ kiểu dữ liệu (data type) và cấu trúc dữ liệu (data
structure). Thuật ngữ kiểu dữ liệu ñề cập tới một cài ñặt cụ thể (có thể là kiểu built in
hoặc do người dùng ñịnh nghĩa) của một mô hình toán học ñược ñặc tả bởi một ADT.
Cấu trúc dữ liệu ñề cập tới một tập các biến có cùng kiểu ñược gắn kết với nhau theo
một cách thức xác ñịnh nào ñó.
Ví dụ về kiểu dữ liệu trừu tượng: Số nguyên.
Kiểu dữ liệu trừu tượng số nguyên: ADT Integer:
Dữ liệu: một tập các chữ số và một dấu tiền tố là + hoặc Chúng ta ký hiệu cả số
là N.
Các toán tử:
constructor: khởi tạo một số nguyên
sub(k): trả về hiệu N – k.
add(k): trả về tổng N + k.
……
End
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
tuannhtn@yahoo.com
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
cũ (gọi là lớp cơ sở base class). Các ngôn ngữ lập trình hướng ñối tượng có thể hỗ trợ
khái niệm ña kế thừa cho phép một lớp có thể kế thừa từ nhiều lớp cơ sở.
Lớp kế thừa derived class có thể có thêm các data member mới hoặc các member
function mới. Thêm vào ñó lớp kế thừa có thể tiến hành ñịnh nghĩa lại một hàm của
lớp cơ sở và trong trường hợp này người ta nói rằng lớp kế thừa ñã overload hàm
thành viên của lớp cơ sở.
1.4 Dynamic Binding (tạm dịch là ràng buộc ñộng) và Porlymorphism (ña xạ
hoặc ña thể)
Chúng ta lấy một ví dụ ñể minh hoạ cho hai khái niệm này. Giả sử chúng ta có một
lớp cơ sở là Shape, hai lớp kế thừa từ lớp Shape là Circle và Rectange. Lớp Shape là
một lớp trừu tượng có một member function trừu tượng là draw(). Hai lớp Circle và
Rectange thực hiện overload lại hàm draw của lớp Shape với các chi tiết cài ñặt khác
nhau chẳng hạn với lớp Circle hàm draw sẽ vẽ một vòng tròn còn với lớp Rectange thì
sẽ vẽ một hình chữ nhật. Và chúng ta có một ñoạn chương trình chính hợp lệ như sau:
int main(){
Shape shape_list[4];
int choose;
int i;
for(i=0;i<4;i++){
cout << “Ngay muon ve hinh tron(0) hay hinh chu nhat(1)”;
cin >> choose;
if(choose==0){
shape_list[i] = new Circle();
}else{
shape_list[i] = new Rectange();
}
}
for(i=0;i<4;i++){
shape_list[i]->draw();
}
}
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
tuannhtn@yahoo.com
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.
Ging nh bt k mt ngụn ng no ca con ngi, mt ngụn ng lp trỡnh l
phng tin ủ din t cỏc khỏi nim, ý tng. Vic phỏt trin cỏc chng trỡnh hay
phn mm l quỏ trỡnh mụ hỡnh húa cỏc trng thỏi t nhiờn ca th gii thc v xõy
dng cỏc chng trỡnh da trờn cỏc mụ hỡnh ủú.
Cỏc chng trỡnh thc hin chc nng mụ t phng phỏp ci ủt ca mụ hỡnh.
Cỏc th h ngụn ng lp trỡnh: Cú th phõn chia cỏc th h ngụn ng lp trỡnh
thnh 4 th h:
1: vo nm 1954 1958 (Fortran I) vi ủc ủim l cỏc biu thc toỏn hc
2: vo nm 1959 1961 (Fortran II, Cobol) vi cỏc th tc
3: vo nhng nm 1962 1970 (Pascal, Simula) vi ủc trng l cỏc khi, cỏc
lp
4: ủang phỏt trin cha cú dn chng thc t.
Cỏc ngụn ng ny ngy cng cỏch xa ngụn ng mỏy v cỏc trỡnh biờn dch ca
chỳng ngy cng phi lm vic nhiu hn.
1.1 S phỏt trin ca cỏc ngụn ng lp trỡnh hng ủi tng
1967 Simula
1970 to 1983 Smalltalk
1979 Common LISP Object System
1980 Stroustrup starts on C++
1981 Byte Smalltalk issue
1983 Objective C
1986 C++
1987 Actor, Eiffel
1991 C++ release 3.0
1995 Java
Bµi gi¶ng LËp tr×nh h−íng ®èi t−îng và
C
++
i¶: u Tu
tuannhtn@yahoo.com
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.
1.2 Ngôn ngữ lập trình C++.
C++ là một ngôn ngữ lập trình hướng ñối tượng ñược Bjarne Stroustrup (AT & T
Bell Lab) (giải thưởng ACM Grace Murray Hopper năm 1994) phát triển từ ngôn ngữ
C.
C++ kế thừa cú pháp và một số ñặc ñiểm ưu việt của C: ví dụ như xử lý con trỏ,
thư viện các hàm phong phú ña dạng, tính khả chuyển cao, chương trình chạy nhanh
…. Tuy nhiên về bản chất thì C++ khác hoàn toàn so với C, ñiều này là do C++ là một
ngôn ngữ lập trình hướng ñối tượng.
Phần B: Ngôn ngữ C++ và lập trình hướng ñối tượng
Chương 2: Những khái niệm mở ñầu. (6 tiết)
1. Chương trình ñầu tiên
1.1 Quá trình biên dịch một chương trình C++
Tất cả các ngôn ngữ trên máy tính ñều ñược dịch từ một dạng nào ñó mà con người
có thể hiểu ñược một cách dễ dàng (các file mã nguồn ñược viết bằng một ngôn ngữ
bậc cao) sang dạng có thể thực hiện ñược trên máy tính (các lệnh dưới dạng ngôn ngữ
máy). Các chương trình thực hiện quá trình này chia thành hai dạng ñược gọi tên là các
trình thông dịch (interpreter) và các trình biên dịch (compiler).
Trình thông dịch: Một trình thông dịch sẽ dịch mã nguồn thành các hành ñộng
(activity), các hành ñộng này có thể bao gồm một nhóm các lệnh máy và tiến hành
thực hiện ngay lập tức các hành ñộng này. Ví dụ như BASIC là một ngôn ngữ ñiển
hình cho các ngôn ngữ thông dịch. BASIC cổ ñiển thông dịch từng dòng lệnh thực
hiện và sau ñó quên ngay lập tức dòng lệnh vừa thông dịch. Điều này làm cho quá
Bµi gi¶ng LËp tr×nh h−íng ®èi t−îng và
C
++
i¶: u Tu
tuannhtn@yahoo.com
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).
Biên dịch ñộc lập có rất nhiều ñiểm lợi. Một chương trình nếu dịch ngay lập tức
toàn bộ sẽ vượt quá các giới hạn của trình biên dịch hay môi trường biên dịch có thể
ñược biên dịch theo từng phần. Các chương trình có thể ñược xây dựng và kiểm thử
từng phần một. Nếu mọt phần nào ñó ñã làm việc ñúng ñắn nó có thể ñược lưu lại như
là một khối ñã hoàn thành. Tập các phần ñã làm việc và ñược kiểm thử có thể kết hợp
lại với nhau tạo thành các thư viện ñể các lập trình viên khác có thể sử dụng. Các ñặc
ñiểm này hỗ trợ cho việc tạo ra các chương trình lớn.
Các ñặc ñiểm gỡ lỗi của trình biên dịch ñã cải tiến một cách ñáng kể qua thời gian.
Các trình biên dịch ñầu tiên chỉ sinh ra mã máy, và lập trình viên phải chèn các câu
lệnh in vào ñể xem thực sự chương trình ñang làm gì. Điều này không phải lúc nào
cũng hiệu quả. Các trình biên dịch hiện ñại có thể chèn các thông tin về mã nguồn vào
mã thực hiện của chương trình. Thông tin này sẽ ñược sử dụng bởi các bộ gỡ lỗi cấp
ñộ nguồn ñầy năng lực ñể chỉ ra chính xác ñiều gì ñang diễn ra trong một chương trình
bằng cách theo dấu (tracing) quá trình thực hiện của nó qua toàn bộ mã nguồn.
Một vài trình biên dịch giải quyết vấn ñề tốc ñộ biên dịch bằng cách thực hiện quá
trình biên dịch trong bộ nhớ (in-memory compilation). Các trình biên dịch theo kiểu
này lưu trình biên dịch trong bộ nhớ RAM. Đối với các chương trình nhỏ, quá trình
này có thể xem như là một trình thông dịch.
Bài giảng Lập trình hớng đối tợng v
C
++
iả: u Tu
tuannhtn@yahoo.com
10
Quỏ trỡnh biờn dch
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.
Trỡnh liờn kt cng thờm vo cỏc module object ủc bit ủ thc hin cỏc hnh ủng
khi ủng.
Trỡnh liờn kt cú th tỡm kim trờn cỏc file ủc bit gi l cỏc th vin ủ sp xp
li tt c cỏc tham chiu ti chỳng. Mi th vin cha mt tp cỏc module object trong
mt file. Mt th vin ủc to ra v bo trỡ bi mt lp trỡnh viờn cú tờn l librarian.
Kim tra kiu tnh
Trỡnh biờn dch thc hin kim tra kiu trong pha ủu tiờn ca quỏ trỡnh biờn dch.
Quỏ trỡnh kim tra ny thc hin kim th vic s dng cỏc tham s ca cỏc hm v
ngn chn rt nhiu li lp trỡnh khỏc nhau. Vỡ quỏ trỡnh kim tra kiu ủc thc hin
trong qỳa trỡnh biờn dch ch khụng phi trong quỏ trỡnh chng trỡnh thc hin nờn nú
ủc gi l kim tra kiu tnh.
Mt vi ngụn ng lp trỡnh hng ủi tng (Java chng hn) thc hin kim tra
kiu ti thi ủim chng trỡnh chy (dynamic type checking). Nu kt hp c vic
[...].. .Bài giảng Lập trình hớng đối tợng v C++ iả: u Tu ki m tra ki u tnh v ủ ng thỡ s hi u qu hn nhng ki m tra ki u ủ ng cng lm cho chng trỡnh th c hi n b nh h ng ủụi chỳt C++ s d ng ki m tra ki u tnh Ki m tra ki u tnh bỏo cho l p trỡnh viờn v cỏc l i v s d ng sai ki u d li u trong quỏ trỡnh biờn d ch, v do ủú t i u húa t c ủ th c hi n chng trỡnh Khi h c C++ chỳng ta s th y h u h... file header v liờn k t cỏc module object l cỏc b c c b n ủ th c hi n vi c biờn d ch ủ c l p trong C v C++ 12 tuannhtn@yahoo.com Bài giảng Lập trình hớng đối tợng v C++ iả: u Tu Trỡnh liờn k t lm th no ủ tỡm m t file th vi n Khi chỳng ta t o ra m t tham chi u ngoi t i m t hm s ho c m t bi n s trong C ho c C++, trỡnh liờn k t, khi b t g p tham chi u ny, cú th th c hi n m t trong hai vi c sau: n u nú cha... kớch th c b nh c n s d ng Cỏc bi toỏn ủ qui th ng ủ c gi i quy t theo chi n l c chia ủ tr 5 Cỏc ki u d li u c b n c a C++ Cỏc ki u d li u c b n c a C++ h u h t ủ u k th a c a C ngo i tr ki u bool v i hai h ng s true v false 22 tuannhtn@yahoo.com Bài giảng Lập trình hớng đối tợng v C++ iả: u Tu 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 ny c n bao nhiờu bit... 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 15 tuannhtn@yahoo.com Bài giảng Lập trình hớng đối tợng v C++ iả: u Tu 2.3 Khai bỏo bi n ngay trong cỳ phỏp c a cỏc cõu l nh ủi u khi n Nh chỳng ta ủó bi t trong cỏc chng trỡnh C++ vi c khai bỏo bi n l khỏ t do Cỏc bi n cú th ủ c khai bỏo b t k v trớ h p l no c a chng trỡnh mi n l chỳng ph i l xỏc ủ... volatile khụng cú nh h ng gỡ t i chng trỡnh n u chỳng ta khụng th c hi n t i u húa nú nhng s cú th cú cỏc l i r t tinh vi khi chỳng ta ti n hnh t i u húa chng trỡnh 3 Hm trong C++ 18 tuannhtn@yahoo.com Bài giảng Lập trình hớng đối tợng v C++ iả: u Tu 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 hm v i s l ng tham s cng nh ki u tham s tựy ý m trỡnh... return ủ thoỏt kh i hm M t trong cỏc ủi m m nh c a ngụn ng C v C++ l m t th vi n hm 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 chng 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 19 tuannhtn@yahoo.com Bài giảng Lập trình hớng đối tợng v C++ iả: u Tu Chỳng ta cú th t o ra cỏc th vi n hm riờng cho... trỡnh HelloWorld ủ c vi t b ng C++, m t chng trỡnh m h u h t cỏc sỏch l p trỡnh ủ u l y lm vớ d m ủ u // Chng trỡnh HelloWorld // File hello.cpp // In ra mn hỡnh xõu Hello, World! #include // Khai bỏo lu ng cout ủ s d ng int main() { cout . lập trình có cấu trúc với sự tích hợp cả các toán tử và dữ liệu trên
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. chất thì C++ khác hoàn toàn so với C, ñiều này là do C++ là một
ngôn ngữ lập trình hướng ñối tượng.
Phần B: Ngôn ngữ C++ và lập trình hướng ñối tượng
Ngày đăng: 26/02/2014, 21:20
Xem thêm: Tài liệu BÀI GIẢNG MÔN Lập trình hướng đối tượng và C++ docx, Tài liệu BÀI GIẢNG MÔN Lập trình hướng đối tượng và C++ docx