• Chæ ñònh truy caäp protected, töông ñöông vôùi chæ ñònh private vôùi moät ngoaïi leä duy nhaát laø caùc thaønh vieân ñöôïc baûo veä (protected members) cuûa lôùp cô sôû coù theå ñöô[r]
Trang 1HỌ C VIỆ N CÔ NG NGHỆ BƯU CHÍ NH VIỄ N THÔ NG
CƠ SỞ TẠ I TP HỒ CHÍ MINH
LẬP TRÌNH
HƯỚ NG ĐỐ I TƯỢ NG
Tà i liệ u dù ng cho hệ Đạ i họ c ngà nh Cô ng nghệ thô ng tin & Điệ n tử – Viễ n thô ng
đã đượ c Hộ i đồ ng khoa họ c Khoa Cô ng nghệ thô ng tin 2
thô ng qua ngà y 16/1/2002
(Tập 1)
Biên soạn: Th.S NGUYỄ N VIỆ T CƯỜ NG
LƯU HÀ NH NỘ I BỘ
Tp Hồ Chí Minh – Nă m 2002
Trang 2Bài giảng được biên soạn dựa trên các tài liệu của Herbert Schildt và Bjarne Stroustrup do có tính sư phạm cao và dựa trên một số tài liệu khác
Nội dung bài giảng có 12 chương, giới thiệu các khái niệm căn bản, các nền tảng của lập trình hướng đối tượng (Object-Oriented Programming) bao gồm :
• tính đóng gói (Encapsulation)
• tính kế thừa (Inheritance)
• tính đa hình (Polymorphism)
• quá tải hàm và toán tử (Function & Operator Overloading)
• template và điều khiển ngoại lệ (Exception Handling)
• vấn đề phát triển hệ thống hướng đối tượng
• minh họa một số ứng dụng của lập trình hướng đối tượng với C++ trong môi trường DOS và Windows
Ngôn ngữ lập trình C++ được sử dụng trong bài giảng nhằm minh họa các ý tưởng của lập trình hướng đối tượng, do đó các kiến thức về C++ được trình bày đan xen trong một số chương giúp sinh viên dễ dàng lĩnh hội các khái niệm khá trừu tượng của lập trình hướng đối tượng
Bài giảng không có tham vọng đi sâu mọi khía cạnh của lập trình hướng đối tượng, chỉ trình bày các kiến thức căn bản và qua các ví dụ minh họa hy vọng sẽ giúp ích cho sinh viên ngành công nghệ thông tin và điện tử viễn thông bước đầu tìm hiểu thế giới lập trình
Các ví dụ minh họa đã chạy tốt trên các trình biên dịch Borland C++ 4.5 hoặc Visual C++ 6.0
Bài giảng được phân làm hai tập, tập 1 từ chương 1 đến chương 8, tập 2 từ chương 9 đến chương 12
Rất mong các đồng nghiệp và các sinh viên đóng góp ý kiến xây dựng để bài giảng được hoàn thiện hơn trong các lần soạn thảo về sau
Tháng 8 năm 2001
Th S Nguyễn Việt Cường E-mail: nvc@ptithcm.edu.vn
Trang 3Tập 1
Chương 1 Tổng quan về Lập trình hướng đối tượng
I Vài nét về sự phát triển của các ngôn ngữ lập trình 1
II Các khái niệm cơ bản của lập trình hướng đối tượng 4
1 Lớp và Đối tượng (Class & Object) 4
2 Thông báo (Message) 5
3 Tính đóng gói (Encapsulation) 5
4 Tính kế thừa (Inheritance) 6
5 Tính đa hình (Polymorphism) 7
III Tổng quan về ngôn ngữ lập trình hướng đối tượng C++ 7
1 Xuất/Nhập (Console I/O) 7
2 Chú thích (Comment) 10
3 Khái niệm về quá tải hàm (Function Overloading) 11
4 Các từ khoá (Keywords) trong C++ 14
Chương 2 Lớp, Đối tượng và Tính đóng gói 15
I Lớp 17
II Hàm tạo, hàm hủy 22
III Tham số của hàm tạo 30
IV Nội tuyến tự động .37
V Gán đối tượng 39
VI Truyền các đối tượng sang hàm 45
VII Trả đối tượng từ hàm 53
VIII Hàm friend 56
IX Bài tập chương 2 62
Chương 3 Mảng , Con trỏ và Tham chiếu 67
I Mảng các đối tượng 69
II Con trỏ đối tượng 72
Trang 4V Tham chiếu (reference) 86
VI Truyền tham chiếu cho đối tượng 91
VII Trả về các tham chiếu 95
VIII Các tham chiếu độc lập và các hạn chế 98
IX Bài tập chương 3 100
Chương 4 Quá tải hàm 103
I Quá tải hàm tạo 105
II Hàm tạo bản sao 109
III Sử dụng các đối số mặc định (default argument) 119
IV Sự quá tại và tính không xác định (ambiguity) 126
V Điạ chỉ của hàm quá tải 130
VI Bài tập chương 4 132
Chương 5 Quá tải toán tử 135
I Quá tải toán tử .137
II Quá tải toán tử nhị nguyên 138
III Quá tải toán tử quan hệ & luận lý 144
IV Quá tải toán tử đơn nguyên 146
V Hàm toán tử friend 149
VI Toán tử gán 155
VII Bài tập chương 5 158
Chương 6 Tính kế thừa 163
I Giới thiệu tính kế thừa 165
II Điều khiển truy cập lớp cơ sở 171
III Sử dụng các thành viên được bảo vệ 176
IV Hàm tạo, hàm hủy và tính kế thừa 181
V Tính đa kế thừa 189
VI Lớp cơ sở ảo 196
VII Bài tập chương 6 201
Trang 5I Cơ sở Nhập/Xuất C++ 209
II Nhập/Xuất có định dạng 210
III Sử dụng width(), precision() và fill() 218
IV Sử dụng bộ thao tác Nhập/Xuất 220
V Tạo bộ chèn 223
VI Tạo bộ chiết 230
VII Bài tập chương 7 234
Chương 8 Nhập/Xuất C++ nâng cao 237
I Tạo Bộ thao tác Nhập/Xuất 239
II Nhập/Xuất File 243
III Nhập/Xuất File nhị phân không định dạng 251
IV Các hàm Nhập/Xuất nhị phân 258
V Truy cập ngẫu nhiên 261
VI Kiểm tra trạng thái Nhập/Xuất 265
VII Nhập/Xuất theo đơn đặt hàng và các File 269
VIII Nhập/Xuất theo mảng 272
IX Bài tập chương 8 277
Tập 2 Chương 9 Tính đa hình 281
I Con trỏ và Lớp dẫn xuất 283
II Dẫn nhập các hàm ảo 285
III Các hàm ảo thuần túy 295
IV Áp dụng đa hình 299
V Bài tập chương 9 309
Chương 10 Template và điều khiển ngoại lệ 311
I Hàm template 313
II Lớp template 319
Trang 6V Từ khoá extern và asm 344
VI Hàm chuyển kiểu 346
VII Những khác biệt giữa C và C++ 349
VIII Bài tập chương 10 350
Chương 11 Phát triển các hệ thống hướng đối tượng 351
I Giới thiệu 353
II Các mô hình hướng-thủ tục 354
III Các công cụ phát triển hướng-thủ tục 357
IV Mô hình hướng đối tượng 359
V Các ký hiệu và đồ thị hướng đối tượng 361
VI Các bước phân tích hướng đối tượng 365
VII Các bước thiết kế hướng đối tượng 371
VIII Cài đặt 378
IX Mô hình nguyên mẫu 379
X Tóm tắt 380
XI Bài tập chương 11 381
Chương 12 Một số ứng dụng OOP 383
I Ứùng dụng trên môi trường DOS 385
1 Sorted container example source file 385
2 Text cross referencing example .389
3 Updates and displays the contents of a mailing list 398
II Ứùng dụng trên môi trường WINDOWS 411
1 Instructions for the IDE example MULTITRG.IDE 411
2 Common Dialogs example in C 419
3 Demo True Type fonts 427
4 Demo sound APIs .447
5 Creating a window application (TODO) 456
III Đồ án môn học 479
Trang 7Sách giáo khoa
[1] Bjarne Stroustrup,
What is “Object-Oriented Programming” ?
AT&T Bell Lab., 1991 (revised version), p1-21
[4] H M Deitel & P J Deitel
C++ How to Program, 2nd edition,
Trang 8Addison-Wesley, 1997
[9] Bjarne Stroustrup,
Why C++ is not just an Object-Oriented Programming Language,
AT&T Bell Lab., Murray Hill, New Jersay, 1995 , 13 pages
[10] Bjarne Stroustrup,
An Overview of the C++ Programming Language
The Handbook of Object Technology, CRC Press LLC,
Boca Raton, 1999, 23 pages
[11] Bjarne Stroustrup,
Learning Standard C++ as a New Language,
AT&T Bell Lab., 1999, 11 pages
Trang 9Chương 1
Tổng quan về lập trình hướng đối tượng
Vài nét về sự phát triển của các ngôn ngữ lập trình
Các khái niệm cơ bản của lập trình hướng đối tượng
• Lớp và Đối tượng (Class & Object)
• Tính đóng gói (Encapsulation)
• Tính kế thừa (Inheritance)
Tổng quan về ngôn ngữ lập trình hướng đối tượng C++
• Khái niệm về quá tải hàm (Function Overloading)
• Các từ khoá (Keywords)
Trang 11I/ Vài nét về sự phát triển của các ngôn ngữ lập trình
Ngôn ngữ lập trình phát triển qua hai lý do :
(1) để thích ứng với sự phát triển của môi trường (các hệ máy tính, các mạng)
(2) bổ sung tốt hơn cho các phương pháp lập trình
• Vào thập niên 1940, chiếc máy tính điện tử đầu tiên ENIAC I (Electronic
Numerical Integrator and Calculator) được chế tạo tại ĐH Pennsylvania, USA,
bởi nhóm John W Mauchly và J Presper Eckert Các chương trình (program)
lúc đó được lập ra bằng các quá trình đóng mở các công tắc trên một bảng đặt
trước máy tính Ngôn ngữ máy (Machine language) với những chuổi nhị phân
0,1, có độ dài qui ước chỉ thích hợp với các chương trình nhỏ nhất
• Sau đó John von Neumann (ĐH Princeton, USA) đã đề xuất khái niệm chương
trình lưu trữ trong bộ nhớ máy tính, ý tưởng này không những cải tiến tốc độ tính toán của máy tính lúc đó mà còn gợi ra những phương pháp linh hoạt để viết các
chương trình trong tương lai Hợp ngữ (Assembly language) được tạo ra cho phép
viết các chương trình dài hơn
• Cuối thập niên 1950 và đầu thập niên 1960, các ngôn ngữ cấp cao đã ra đời như
FORTRAN (FORmula TRANslator) dùng cho các tính toán về toán học và COBOL (COmmon Business Oriented Language) dùng trong lĩnh vực thương mại Ngôn ngữ BASIC (Beginners All-purpose Symbolic Instructional Code)
được phát triển lần đầu tiên trên các máy vi tính (micro-computer) nhằm giúp các sinh viên dễ học và tiếp cận với các chương trình máy tính
Các ngôn ngữ lập trình có cấu trúc như ALGOL và PASCAL ra đời giúp loại bỏ
các nhược điểm như rối loạn mã khó quản lý khi số lệnh trong chương trình dài hàng ngàn dòng
• Đầu thập niên 1970 ngôn ngữ C (do Denis Ritchie) được ra đời tại AT&T Bell Labs, USA Ngôn ngữ C tổng hợp các sức mạnh của các ngôn ngữ lập trình cấu trúc khác, dể hiểu, dể học và trở nên phổ biến với mọi người Tháng 12/1989, ngôn ngữ C được ANSI (American National Standards Insitute) chuẩn hoá và thông qua
Trang 12• Lập trình có cấu trúc (hay còn gọi là lập trình thủ tục) dựa vào các cấu trúc điều khiển (for, while, do, if, ) đã được định nghiã, các khối mã lệnh, ít dùng lệnh GOTO, các chương trình con hỗ trợ phép đệ qui và các biến cục bộ
Main program
Hình 1.1 Các chương trình hướng-thủ tục (lập trình cấu trúc)
Một chương trình lớn được chia thành nhiều chương trình con cho nhiều nhóm lập trình khác nhau cùng làm việc, với số dòng lệnh đến vài chục ngàn dòng, giúp dễ dàng bảo trì và phát triển phần mềm
Hình 1.2 Quan hệ giữa dữ liệu và hàm trong lập trình hướng-thủ tục
• Đầu thập niên 1980, ngôn ngữ C++ (dựa trên ngôn ngữ C, Bjarne Stroustrup
giới thiệu ) và ngôn ngữ Smalltalk (Xerox PARK) được phát triển nhằm hổ trợ cho phương pháp lập trình hướng đối tượng (Object Oriented Programming),
phương pháp này đã được đề xuất từ cuối thập niên 1960 với ngôn ngữ Simula C++ được chuẩn hoá vào tháng 11/1997 và một chuẩn ANSI/ISO đã công bố
Trang 13Lập trình hướng đối tượng sử dụng C++ tạo nên sự biến đổi sâu sắc, giúp lập trình viên có thể quản lý những chương trình lớn và phức tạp (hơn 100.000 dòng lệnh)
• Thập niên 1990, với sự phát triển mạnh mẽ của mạng World Wide Web, một cuộc cách mạng mới trong kỹ thuật lập trình đã xảy ra Ngôn ngữ JAVA do James Gosling, Patrick Naughton, Christ Warth, và Mike Sheridan phát triển tại hãng Sun Microsystem Tên chính thức được công bố vào năm 1995
• JAVA là ngôn ngữ lập trình hướng đối tượng không phụ thuộc vào thiết bị (các bộ vi xử lý, hệ điều hành, mạng, ) JAVA được thiết kế không phải để thay thế C++, mà để giải quyết những vấn đề đang đặt ra cho nền công nghệ tin học
• Phương pháp lập trình hướng đối tượng cho phép phân chia một bài toán thành
các nhóm nhỏ có quan hệ với nhau Mỗi nhóm là một đối tượng chứa các lệnh và
dữ liệu riêng của nó có quan hệ với đối tượng đó
Nhờ đó, tính phức tạp của chương trình được giảm xuống, người lập trình có thể quản lý những chương trình rất lớn, chẳng hạn hệ điều hành Windows và những chương trình ứng dụng trên đó là những minh chứng cho phương pháp này
Hình 1.3 Tổ chức của dữ liệu và các phương thức trong lập trình hướng-đối tượng
Các đặc tính quan trọng trong lập trình hướng đối tượng :
Trang 14• Tính đóng gói (Encapsulation)
• Tính kế thừa (Inheritance)
• Tính đa hình (Polymorphism)
II/ Các khái niệm cơ bản của lập trình hướng đối tượng
1/ Lớp (Class) và Đối tượng (Object)
Các đối tượng là các thực thể (entities) cơ sở khi chạy chương trình (run-time) trong một hệ thống hướng đối tượng
Chúng có thể biểu diễn một con người, một vị trí, một tài khoản ngân hàng, một bảng dữ liệu hoặc bất kỳ một đề mục (item) nào mà chương trình cần dùng để thực hiện các tác vụ (tasks)
Hình 1.4 Hai cách biểu diễn một đối tượng
Bên trong một chương trình có thể viết các dòng lệnh (instructions) để tạo ra các đối tượng Để máy tính có thể tạo ra đối tượng, chúng ta cần phải cung cấp một định nghiã, gọi là lớp
Lớp là một dạng khuôn (mould , template) qua đó chương trình máy tính dùng để tạo
ra các đối tượng.
Một đối tượng được gọi là một thể hiện (instance) của một lớp Một đối tượng là một
thể hiện chính xác của một lớp
Khi định nghiã một lớp, còn được xem là tạo ra một kiểu dữ liệu mới từ người dùng
Trang 15Khi khai báo một đối tượng, có nghiã là tạo ra một biến có kiểu dữ liệu là một lớp
Các thành viên (members) của một lớp bao gồm dữ liệu (data) và các hàm hay
phương thức (function, method)
Nguyên
SINHVIEN
Hanh
Hình 1.5 Lớp SINHVIEN và 2 đối tượng Nguyên & Hanh
2/ Thông báo (Message)
Để yêu cầu một đối tượng thực thi một tác vụ, cần gởi một thông báo đến nó
Chẳng hạn, chúng ta gởi một thông báo new đến lớp SINHVIEN để tạo ra một thể hiện (một đối tượng SINHVIEN), sau đó gởi một thông báo Nhập() đến đối tượng
của lớp SINHVIEN để nhập các dữ liệu về sinh viên
3/ Tính đóng gói (Encapsulation)
Việc tổ chức dữ liệu (data) và các hàm (function) hay phương thức (method) trong
một đơn vị duy nhất (gọi là lớp) được xem là tính chất đóng gói
Đóng gói dữ liệu (Data Encapsulation) là một trong những đặc tính nổi bật của một lớp Dữ liệu không thể truy xuất được ở bên ngoài lớp và chỉ những phương thức bên trong lớp đó mới có thể truy xuất được chúng
Trong một đối tượng, dữ liệu và hàm hoặc cả hai có thể là riêng của đối tượng đó hoặc chung
SINHVIEN SINHVIEN
Trang 16Dữ liệu và hàm riêng là thuộc về đối tượng đó và chỉ được truy cập bởi các thành phần bên trong của đối tượng
Với dữ liệu và hàm chung, các bộ phận khác của chương trình có thể truy cập đến chúng
Những chức năng này cung cấp một giao tiếp giữa dữ liệu của đối tượng và chương trình Sự cách ly này của dữ liệu từ việc truy xuất trực tiếp bởi chương trình được gọi
là sự che dấu dữ liệu (data hiding)
4/ Tính kế thừa (Inheritance)
Tính kế thừa là quá trình một đối tượng có thể có được các tính chất của một đối tượng khác Nghiã là, một đối tượng có thể kế thừa các tính chất tổng quát để bổ sung thêm các đặc điểm của nó
Tính kế thừa hổ trợ khái niệm phân loại theo thứ bậc (hierarchical classification) , đóng vai trò quan trọng trong lập trình hướng đối tượng
Hình 1.6 Hệ thống thứ bậc kế thừa (đơn giản) trong Học viện
Lớp cơ sở (base class) : “Học Viện Công nghệ Bưu Chính –Viễn Thông” Lớp dẫn xuất (derived class) : “Khối Sinh viên” ,
5/ Tính đa hình (Polymorphism)
Học Viện Công nghệ Bưu Chính –Viễn Thông
Khối Sinh viên Khối Giáo viên Khối Nhân viên
Trang 17Tính đa hình là tính chất cho phép một tên (đối tượng, hàm, toán tử) được dùng cho hai hay nhiều mục đích khác nhau có quan hệ về phương diện kỹ thuật
Tính đa hình cho phép thực hiện quá tải hàm (function overloading) hay quá tải toán
tử (operator overloading)
Tính đa hình thể hiện ý tưởng "một giao diện cho nhiều phương thức"
III/ Tổng quan về ngôn ngữ lập trình hướng đối tượng C++
Do C++ được xây dựng từ ngôn ngữ C với lớp, nên mọi phần tử của C đều được chứa trong C++
Các hàm căn bản của C++ đều chứa trong thư viện iostream.h
1/ Xuất/Nhập trong C++ (Console I/O)
Từ khoá cout, cin là các stream được định nghiã trước trong iostream.h, tự động liên
kết với console khi chương trình C++ bắt đầu chạy
cout tương đương với stdout, và cin tương đương với stdin trong ngôn ngữ C
Cú pháp
cout << expression ; // xuất nội dung của biểu thức ra màn hình
cin >> variable ; // nhập một giá trị từ bàn phím vào biến variable
với << toán tử xuất
>> toán tử nhập
expression biểu thức C++ bất kỳ
variable biến
Ví dụ 1.1
Trang 18Ví dụ 1.3 Khi nhập, các mục riêng lẻ phải cách nhau khoảng trắng
Với chuổi, toán tử nhập sẽ ngừng khi gặp ký tự khoảng trắng đầu tiên
#include <iostream.h>
Trang 19int main()
{
int i; float f; char s[80];
cout << "Enter an integer, float, and string: ";
2/ Chú thích (comment) trong C++
• Chú thích một dòng lệnh //
Ví dụ 1.5 Xác định một số nguyên là số chẵn hay lẻ
Trang 20#include <iostream.h>
int main()
{
int num; // this is a C++, single-line comment
// read the number
cout << "Enter number to be tested: ";
cin >> num;
// see if even or odd
if((num%2)==0) cout << "Number is even\n";
else cout << "Number is odd\n";
3/ Khái niệm về quá tải hàm (Function Overloading)
Hai hoặc nhiều hàm dùng chung một tên Có 3 loại :
• Cùng số đối số
• Khác số đối số
• Khác số đối số và khác kiểu dữ liệu
Mục đích :
• giúp giảm bớt tính phức tạp của chương trình bằng cách cho phép các phép toán có liên hệ được tham chiếu cùng một tên
Trang 21• đạt được tính đa dạng thời gian biên dịch
Ví dụ 1.7 Cùng số đối số
Trình biên dịch sẽ chọn phiên bản thích hợp của hàm để gọi
cout << "Absolute value of -10: " << abs(-10) << "\n\n";
cout << "Absolute value of -10L: " << abs(-10L) << "\n\n";
cout << "Absolute value of -10.01: " << abs(-10.01) << "\n\n";
Trang 22void date(int month, int day, int year); // date as numbers
cout << "Date: " << month << "/";
cout << day << "/" << year << "\n";
}
Ví dụ 1.9 Hai hàm chỉ khác nhau ở kiểu dữ liệu trả về làm cho trình biên dịch
không thể lựa chọn kiểu đúng để gọi
Trang 23// This is incorrect and will not compile
int f1(int a);
double f1(int a);
4/ Các từ khoá (keywords) trong C++
Ngoài các từ khoádùng trong ngôn ngữ C, ANSI C++ sử dụng các từ khoá thường dùng như sau :
Ý nghiã của chúng sẽ được lần lượt giải thích và minh hoạ trong các chương sau của bài giảng
Trang 24Chương 2
Lớp, đối tượng và tính đóng gói
• Lớp
• Hàm tạo, hàm hủy
• Tham số của hàm tạo
• Nội tuyến tự động
• Gán đối tượng
• Truyền các đối tượng sang hàm
• Trả đối tượng từ hàm
• Hàm friend
Trang 26I/ Lớp (class)
• Cú pháp khai báo lớp
class class_name {
private :
// khai báo các biến ;
// khai báo các hàm;
public :
// khai báo các biến ;
// khai báo các hàm;
} objects_list ;
class_name tên của lớp do người dùng định nghiã
objects_list danh sách các đối tượng, có thể tùy chọn
Các biến, các hàm khai báo bên trong một lớp gọi là các thành viên của lớp đó
Từ khoá Ý nghiã
class khai báo một lớp
private : qui định các biến, các hàm là các thành viên riêng của lớp, bên
ngoài lớp không thể truy cập được
public : qui định các biến, các hàm là các thành viên chung của lớp, có
thể truy cập chúng từ các thành viên khác của lớp và bởi các thành phần khác của chương trình có chứa lớp đó
• Cú pháp định nghiã hàm thành viên
data_type class_name :: func_name (arg_list)
{
// body of function
}
data_type kiểu dữ liệu của phương thức trả về
class_name tên lớp chứa hàm
:: toán tử phân giải phạm vi (scope resolution operator)
Trang 27func_name tên hàm
arg_list danh sách các đối số
Ví dụ 1.1 Khai báo lớp có tên "myclass"
myclass ob1, ob2; // khai báo 2 đối tượng có tên ob1, ob2
ob1.set_a(10); // thiết lập giá trị 10 cho bản sao cuả biến a của ob1
ob2.set_a(99); // thiết lập giá trị 99 cho bản sao cuả biến a của ob2
cout << ob1.get_a() << "\n";
cout << ob2.get_a() << "\n";
return 0;
}
Trang 28Ví dụ 1.2 Lỗi biên dịch khi truy cập đến biến riêng a từ bên ngoài lớp myclass
int main()
{
myclass ob1, ob2;
ob1.a = 10; // ERROR! cannot access private member
ob2.a = 99; // by non-member functions
myclass ob1, ob2;
// here, a is accessed directly
Trang 29Ví dụ 1.4 Tạo lớp stack dùng để chứa các ký tự
#include <iostream.h>
#define SIZE 10
// Declare a stack class for characters
class stack {
char stck[SIZE]; // holds the stack
int tos; // index of top-of-stack
public:
void init(); // initialize stack
void push(char ch); // push character on stack
char pop(); // pop character from stack
cout << "Stack is empty";
return 0; // return null on empty stack
Trang 30for(i=0; i<3; i++) cout << "Pop s1: " << s1.pop() << "\n";
for(i=0; i<3; i++) cout << "Pop s2: " << s2.pop() << "\n";
return 0;
}
@ Kết quả xuất dữ liệu của chương trình ?
• Lưu ý
Khai báo lớp là một trừu tượng logic để định nghiã một kiểu dữ liệu mới
Khai báo một đối tượng dựa vào lớp, tạo ra một thực thể vật lý (có điạ chỉ trong bộ nhớ) có kiểu dữ liệu đó
Trang 31Mỗi đối tượng của một lớp có bản sao riêng của các biến được khai báo trong lớp
Bài tập I
1 Hãy tạo lớp card để giữ các mục nhập catalog thẻ thư viện, chưá tựa đề sách (kiểu chuỗi), tên tác giả (kiểu chuỗi) và số bản (kiểu nguyên) Dùng hàm thành viên chung store() để lưu trữ thông tin về sách và hàm thành viên chung show() để hiển thị thông tin Viết chương trình thực hiện yêu cầu trên
2 Tạo lớp hàng đợi (queue) để giữ hàng các số nguyên Tạo một kích thước hàng dài 100 số nguyên Viết chương trình thực hiện yêu cầu trên
II/ Hàm tạo & hàm hủy
1/ Khái niệm
Hàm tạo (constructor) có cùng tên với lớp, là hàm thành phần của một lớp,
không có kiểu trả về
Mục đích của hàm tạo nhằm tạo ra các khởi đầu cho một đối tượng
Hàm tạo được gọi tự động mỗi khi đối tượng của lớp đó được tạo ra
2/ Khai báo
class class_name {
// khai báo các biến và hàm ;
public :
// khai báo các biến và hàm ;
class_name() ; // khai báo hàm tạo
} objects_list ;
Ví dụ 2.1 Lớp myclass có hàm tạo myclass() và hàm show()
#include <iostream.h>
Trang 32Đối với các đối tượng chung, một hàm tạo của đối tượng được gọi một lần khi
chương trình bắt đầu thi hành lần đầu
Đối với các đối tượng riêng, hàm tạo của đối tượng được gọi mỗi khi lệnh khai báo
được thi hành
3/ Khái niệm hàm hủy (destructor)
Hàm hủy có cùng tên với lớp, có kèm theo dấu ~ đứng trước, là hàm thành phần của
một lớp, không có kiểu trả về
Mục đích của hàm hủy nhằm thi hành một số tác động khi đối tượng bị hủy bỏ, chẳng hạn một đối tượng yêu cầu cấp phát bộ nhớ khi đối tượng được tạo ra và giải
Trang 33phóng bộ nhớ khi đối tượng bị hủy bỏ
Hàm hủy được gọi tự động mỗi khi đối tượng của lớp đó bị hủy bỏ
4/ Khai báo
class class_name {
// khai báo các biến và hàm ;
public :
// khai báo các biến và hàm ;
~class_name(); // khai báo hàm hủy
Trang 34• Lưu ý : Không thể biết được địa chỉ của hàm tạo hoặc hàm hủy
Ví dụ 2.3 Dùng hàm tạo stack() để tự động khởi đầu ngăn xếp khi đối tượng được tạo
#include <iostream.h>
#define SIZE 10
// Declare a stack class for characters
class stack {
char stck[SIZE]; // holds the stack
int tos; // index of top-of-stack
public:
stack(); // constructor
void push(char ch); // push character on stack
char pop(); // pop character from stack
};
// Initialize the stack
Trang 35cout << "Stack is empty\n";
return 0; // return null on empty stack
Trang 36s2.push('y');
s1.push('c');
s2.push('z');
for(i=0; i<3; i++) cout << "Pop s1: " << s1.pop() << "\n";
for(i=0; i<3; i++) cout << "Pop s2: " << s2.pop() << "\n";
return 0;
}
Ví dụ 2.4 Dùng hàm tạo strtype() và hàm hủy ~strtype() để tự động cấp phát
bộ nhớ cho chuổi *p và giải phóng bộ nhớ khi đối tượng bị hủy
Trang 38s2.show();
return 0;
}
Ví dụ 2.5 Dùng đối tượng của lớp timer để xác định khoảng thời gian
khi một đối tượng kiểu timer được tạo và cho đến khi bị hủy
Trang 39Chương trình này dùng hàm thư viện chuẩn clock() để trả về số chu kỳ đồng hồ xảy
ra từ khi chương trình bắt đầu chạy Chia giá trị này cho hằng số CLK-TCK để chuyển thành giá trị giây (CLK-TCK định nghiã số tic-tắc của đồng hồ trong một giây)
- Lớp stopwatch có 2 biến riêng start và end lưu số giây
- Viết hàm tạo để đạt thời gian trôi qua lúc đầu về zero
- Hai hàm thành viên start() và stop() để lần lượt mở và tắt chế độ định giờ
- Hàm thành viên show() để hiển thị thời gian trôi qua
- Viết hàm hủy để tự động hiển thị thời gian trôi qua khi đối tượng stopwatch bị hủy
3 Sửa lỗi trong đoạn chương trình sau :
Trang 401/ Khái niệm
Hàm tạo có thể có các tham số, chỉ cần bổ sung các tham số thích hợp trong khai báo lớp và trong định nghĩa hàm tạo
Khi khai báo một đối tượng, cần chỉ rõ các tham số này làm đối số
Ví dụ 3.1 Hàm tạo myclass(int x) có một tham số