1. Trang chủ
  2. » LUYỆN THI QUỐC GIA PEN-C

Bài Giảng Lập Trình Hướng Đối Tượng

381 5 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 381
Dung lượng 751,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

• 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 1

HỌ 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 2

Bà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 3

Tậ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 4

V 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 5

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

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

Sá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 8

Addison-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 9

Chươ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 11

I/ 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 13

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

Khi 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 16

Dữ 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 17

Tí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 18

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

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

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

Chươ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 26

I/ 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 27

func_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 28

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

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

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;

}

@ 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 31

Mỗ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 33

phó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 35

cout << "Stack is empty\n";

return 0; // return null on empty stack

Trang 36

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

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

Chươ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 40

1/ 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ố

Ngày đăng: 19/01/2021, 04:42

w