Tải bản đầy đủ (.pdf) (46 trang)

Giáo trình bài tập lập trình hướng đối tượng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (806.98 KB, 46 trang )

1


ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG CĐ CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ THÔNG TIN




BÀI TẬP LẬP TRÌNH
HƯỚNG ĐỐI TƯỢNG



Người soạn: Nguyễn Đức Hiển
Đặng Thị Thúy An
Hà Thi Minh Phương
Lê Đình Nguyên


Đà Nẵng, 2014




2

Bài 1: TỔNG QUAN VỀ C++ (4 tiết)
1.1 Cấu trúc một chương trình C++
Ví dụ 1:











Đây là một trong những chương trình đơn giản nhất có thể viết bằng C++
nhưng nó đã bao gồm những phần cơ bản mà mọi chương trình C++ có. Hãy
cùng xem xét từng dòng một :
// my first program in
C++
Đây là dòng chú thích. Tất cả các dòng bắt đầu
bằng hai dấu sổ (//) được coi là chút thích mà
chúng không có bất kì một ảnh hưởng nào đến hoạt
động của chương trình.
Trong C++ có hai cách để chú thích
// Chú thích theo dòng
/* Chú thích theo khối */
Chú thích theo dòng bắt đầu từ cặp dấu xổ (//) cho
đến cuối dòng. Chú thích theo khối bắt đầu bằng
/* và kết thúc bằng */ và có thể bao gồm nhiều
dòng.
#include
Khai báo thư viện cho chương trình. Dòng này báo
cho trình dịch biết cần phải "include" thư viện
1. Gọi trình soạn thảo để nhập câu lệnh cho chương trình C++
2. Tạo ra tập tin mới

3. Nhập vào đoạn mã sau:
// my first program in C++

#include <iostream.h>

int main ()
{
cout << "Hello World!";
return 0;
}
3

<iostream.h>
iostream. Đây là một thư viện vào ra cơ bản trong
C++.
int main ()
Dòng này tương ứng với phần bắt đầu khai báo
hàm main. Hàm main là điểm mà tất cả các chương
trình C++ bắt đầu thực hiện. Nó không phụ thuộc
vào vị trí của hàm này (ở đầu, cuối hay ở giữa của
mã nguồn) mà nội dung của nó luôn được thực
hiện đầu tiên khi chương trình bắt đầu. Thêm vào
đó, do nguyên nhân nói trên, mọi chương trình
C++ đều phải tồn tại một hàm main. Theo sau main
là một cặp ngoặc đơn () bởi vì nó là một hàm. Nội
dung của hàm main tiếp ngay sau phần khai báo
chính thức được bao trong các ngoặc nhọn ( { } )
cout << "Hello
World";
cout là một dòng (stream) output chuẩn trong C++

được định nghĩa trong thư viện iostream và những
gì mà dòng lệnh này làm là gửi chuỗi kí tự "Hello
World" ra màn hình.
Chú ý rằng dòng này kết thúc bằng dấu chấm phẩy
( ; ). Kí tự này được dùng để kết thúc một lệnh và
bắt buộc phải có sau mỗi lệnh trong chương trình
C++
return 0;
Lệnh return kết thúc hàm main và trả về mã đi sau
nó, trong trường hợp này là 0. Đây là một kết thúc
bình thường của một chương trình không có một
lỗi nào trong quá trình thực hiện.
Ví dụ 2:
#include <iostream>
#include <conio.h> // Khai báo thư viện

4

using namespace std;

int main() // Chương trình chính
{
int age; // Khai báo biến age

cout<<"Please input your age: ";
cin>> age;
cin.ignore(); // Throw away enter
if ( age < 100 ) {
cout<<"You are pretty young!\n";
}

else if ( age == 100 ) {
cout<<"You are old\n";
}
else {
cout<<"You are really old\n";
}
getch();
}

Bài tập
1. Viết chương trình tìm max, min của dãy số nguyên, dãy số thực.
2. Tính tổng S=1+1/2+…+1/n
1.2 Hàm
Cấu trúc hàm: Hàm là một khối lệnh được thực hiện khi nó được gọi từ một
điểm khác của chương trình. Dạng thức của nó như sau:
type function_name ( argument1, argument2, )
5

{
statement // body of the function
}
trong đó:
type là kiểu dữ liệu được trả về của hàm
function_name là tên gọi của hàm.
arguments là các tham số (có nhiều bao nhiêu cũng được tuỳ theo nhu cầu).
Một tham số bao gồm tên kiểu dữ liệu sau đó là tên của tham số giống như khi
khai báo biến (ví dụ int x) và đóng vai trò bên trong hàm như bất kì biến nào
khác. Chúng dùng để truyền tham số cho hàm khi nó được gọi. Các tham số
khác nhau được ngăn cách bởi các dấu phẩy.
statement là thân của hàm. Nó có thể là một lệnh đơn hay một khối lệnh.

Ví dụ 1:
#include <iostream> // Khai báo thư viện

using namespace std;

int addition ( int a, int b ); // Hàm cộng 2 số nguyên

int main() // Chương trình chính
{
int x;
int y;

cout<<"Please input two numbers: ";
cin>> x >> y;
cout<<"The addition of your two numbers is "<< addition(
x,y)<<"\n";
6

getch();
}

int addition ( int a, int b ) // Định nghĩa hàm
{
return a + b;
}

Để có thể hiểu được đoạn mã này, trước hết hãy nhớ lại những điều đã nói ở
bài đầu tiên: một chương trình C++ luôn bắt đầu thực hiện từ hàm main. Vì
vậy chúng ta bắt đầu từ đây.
Chúng ta có thể thấy hàm main bắt đầu bằng việc khai báo biến x,y kiểu int.

Ngay sau đó là nhập vào 2 số nguyên, tiếp theo một lời gọi tới hàm addition.
Nếu để ý chúng ta sẽ thấy sự tương tự giữa cấu trúc của lời gọi hàm với khai
báo của hàm:
Các tham số có vai trò thật rõ ràng. Bên trong hàm main chúng ta gọi hàm
addition và truyền hai giá trị: x và y tương ứng với hai tham số int a và int b
được khai báo cho hàm addition.
Vào thời điểm hàm được gọi từ main, quyền điều khiển được chuyển sang cho
hàm addition. Giá trị của hai tham số (x và y) được copy sang hai biến cục
bộ int a và int b bên trong hàm.
Dòng lệnh sau:
return ( a + b );
kết thúc hàm addition, và trả lại quyền điều khiển cho hàm nào đã gọi nó
(main) và tiếp tục chương trình ở cái điểm mà nó bị ngắt bởi lời gọi đến
addition. Nhưng thêm vào đó, giá trị được dùng với lệnh return ( a + b )
chính là giá trị được trả về của hàm.\
Giá trị trả về bởi một hàm chính là giá trị của hàm khi nó được tính toán. Ví
dụ nếu x= 5, y= 3, thì giá trị trả về là 8.
7

Nhắc lại: Để xây dựng một hàm cần chú ý những điều sau:
1. Chức năng, nhiệm vụ của hàm
2. Mỗi hàm chỉ làm một nhiệm vụ duy nhất
3. Đặt tên hàm sao cho gợi nhớ
4. Xác định giá trị trả về : có giá trị trả về và không có giá trị trả về
(void)
5. Xác định tham số: bao nhiêu tham số, kiểu của các tham số
6. Xác định phương pháp truyền tham số: truyền tham trị hay truyền
tham chiếu. Nếu có nhu cầu thay đổi giá trị của tham số thực truyền vào
thì sử dụng truyền tham chiếu ngược lại sử dụng truyền tham trị.
Bài tập

1. Viết chương trình định nghĩa cấu trúc dữ liệu để lưu trữ Phân số (Tử
số / Mẫu số). Định nghĩa các hàm tương ứng với các phép toán: Rút
gọn, cộng, trừ, nhân, chia phân số.
2. Sắp xếp dãy n số nguyên, thực bằng các phương pháp: Selection,
Insert, Bubble, Quick sort, Merge sort
3. Xây dựng chương trình thao tác với vec tơ: nhập, in, tính tổng và tích
2 vectơ.










8


Bài 2: TỔNG QUAN VỀ C++(tiếp theo -6 tiết)
2.1 Phương pháp truyền tham số: Truyền tham số theo tham số giá trị
hay tham số biến.
Cho đến nay, trong tất cả các hàm chúng ta đã biết, tất cả các tham số
truyền cho hàm đều được truyền theo giá trị. Điều này có nghĩa là khi chúng ta
gọi hàm với các tham số, những gì chúng ta truyền cho hàm là các giá trị chứ
không phải bản thân các biến. Ví dụ, giả sử chúng ta gọi hàm addition như
sau:
int x=5, y=3, z;
z = addition ( x , y );

Trong trường hợp này khi chúng ta gọi hàm addition thì các giá trị 5 and 3
được truyền cho hàm, không phải là bản thân các biến.
Như vậy thì sao, có ảnh hưởng gì? Điều đáng nói ở đây là khi thay đổi giá trị
của các biến x hay y bên trong hàm thì các biến x và y vẫn không thay đổi vì
chúng đâu có được truyền cho hàm chỉ có giá trị của chúng được truyền mà
thôi.
Hãy xét trường cần thao tác với một biến ngoài ở bên trong một hàm. Vì vậy
sẽ phải truyền tham số dưới dạng tham số biến như ở trong hàm duplicate
trong ví dụ dưới đây:







// passing parameters by reference
#include <iostream.h>

void duplicate (int& a, int& b, int& c)
{
a*=2;
b*=2;
c*=2;
}

int main ()
{
int x=1, y=3, z=7;
duplicate (x, y, z);

cout << "x=" << x << ", y=" << y << ", z=" << z;
return 0;
}
9


Điều đầu tiên làm chú ý là trong khai báo của duplicate theo sau tên kiểu của
mỗi tham số đều là dấu và (&), để báo hiệu rằng các tham số này được truyền
theo tham số biến chứ không phải tham số giá trị.
Khi truyền tham số dưới dạng tham số biến chúng ta đang truyền bản thân
biến đó và bất kì sự thay đổi nào mà chúng ta thực hiện với tham số đó bên
trong hàm sẽ ảnh hưởng trực tiếp đến biến đó.
Trong ví dụ trên, chúng ta đã liên kết a, b và c với các tham số khi gọi hàm (x,
y và z) và mọi sự thay đổi với a bên trong hàm sẽ ảnh hưởng đến giá trị của x
và hoàn toàn tương tự với b và y, c và z.
Kiểu khai báo tham số theo dạng tham số biến sử dụng dấu và (&) chỉ có trong
C++. Trong ngôn ngữ C chúng ta phải sử dụng con trỏ để làm việc tương tự
như thế.
Bài tập
1. Viết chương trình đưa ra 2 cách viết khác nhau của hàm hoán vị thực
hiện việc hoán đổi nội dung của 2 biến. (tham trị và tham chiếu).
2. Nhập vào một danh sách liên kết kiểu số nguyên và sắp xếp danh sách
theo thứ tự tăng dần.
3. Viết chương trình thực hiện yêu cầu sau đây:
- Nhập dữ liệu cho n sinh viên (dùng cấu trúc danh sách liên kết đơn),
các thông tin của sinh viên bao gồm: mã sinh viên, họ tên, lớp, điểm
trung bình.
- Chương trình có sử dụng toán tử new và delete
- In ra danh sách sinh viên giảm dần theo điểm trung bình.
2.2 Hàm đa năng

Hai hàm có thể có cùng tên nếu khai báo tham số của chúng khác nhau,
điều này có nghĩa là bạn có thể đặt cùng một tên cho nhiều hàm nếu chúng có
10

số tham số khác nhau hay kiểu dữ liệu của các tham số khác nhau (hay thậm
chí là kiểu dữ liệu trả về khác nhau).
Ví dụ 1:













Bài tập:
1. Định nghĩa hàm đa năng:
 Tìm số lớn nhất trong 2 số nguyên
 Tìm số lớn nhất trong 2 số thực
 Tìm số lớn nhất trong 3 số nguyên
 Tìm số lớn nhất trong n số nguyên
2. Định nghĩa hàm đa năng tính diện tích tam giác, diện tích hình chữ nhật,
diện tích hình tròn.
3. Định nghĩa chồng toán tử << ,>> dùng để nhập xuất.
ostream& operator << (int x);

ostream& operator << (float x);
// overloaded function
#include <iostream.h>

int divide (int a, int b)
{
return (a/b);
}

float divide (float a, float b)
{
return (a/b);
}

int main ()
{
int x=5,y=2;
float n=5.0,m=2.0;
cout << divide (x,y);
cout << "\n";
cout << divide (n,m);
return 0;
}
11

ostream& operator << (char x);
istream& operator >> (int& x)
istream& operator >> (float& x)
istream& operator >> (char& x)
2.3 Đa năng hóa toán tử

Trong ngôn ngữ C, khi chúng ta tạo ra một kiểu dữ liệu mới, chúng ta
thực hiện thao tác liên quan đến các kiểu dữ liệu đó thông qua các hàm. Trong
C++ cho phép chúng ta định nghĩa lại chức năng của các toán tử đã có. Điều
này gọi là đa năng hóa toán tử.
Cú pháp:
data_type operator operator_symbol ( parameters )
kiểu trả về ký hiệu của toán tử các tham số
Bài tập
1. Định nghĩa cấu trúc dữ liệu để lưu trữ Phân số (Tử số / Mẫu số).
- Định nghĩa các hàm: nhập một phân số, hiển thị một phân số,
- Đinh nghĩa các toán tử +, -, *, / để dùng cho các phân số thay cho các hàm
cộng , trừ, nhân, chia đã định nghĩa ở bài tập 1.2 (sử dụng đa năng hóa toán
tử).
Hướng dẫn








12






























#include <iostream.h> // Khai báo các thư viện
#include <math.h>
#include <conio.h>

// Khai báo struct
typedef struct {
int Tuso;
int Mauso;

}PhanSo;
// Khai báo hàm nguyên mẫu
PhanSo operator+ (PhanSo a, PhanSo b); // Cong 2 PS
PhanSo operator- (PhanSo a, PhanSo b);// Tru 2 PS
PhanSo operator* (PhanSo a, PhanSo b);// Nhan 2 PS
PhanSo operator/ (PhanSo a, PhanSo b); // Chia 2 PS
PhanSo NhapPhanso(int a, int b);// Nhập dữ liệu cho 1 PS
void HienThi(PhanSo a); // Hiển thị 1 PS
// Định nghĩa các hàm
PhanSo NhapPhanso(int a, int b)
{
PhanSo c;
c.Tuso = a;
c.Mauso = b;
return c;

}
void HienThi(PhanSo a)
{
cout<<a.Tuso<<"/"<<a.Mauso<<endl;
}
PhanSo operator+ (PhanSo a, PhanSo b) // Ham cong
{
PhanSo c;
c.Tuso = a.Tuso *b.Mauso + b.Tuso*a.Mauso;
c.Mauso = a.Mauso*b.Mauso;
return c;
}
// Định nghĩa đầy đủ cho các hàm còn lại ….
int main()

{
PhanSo x,y,kq;
x = NhapPhanso(4,5);
y = NhapPhanso(1,3);
kq=x+y;
cout<<"Tong 2 phan so:"<<endl;
HienThi(kq);
getch();
}
13



Bài 3: LỚP VẦ ĐỐI TƯỢNG (6 tiết)
3.1 Khai báo các thành phần của lớp
class <Tên lớp>{
private: <Khai báo các thành phần riêng>
protected: <Khai báo các thành phần được bảo vệ>
public: <Khai báo các thành phần chung>

}
Phạm vi truy cập
- private: các thành phần được khai báo với từ khóa này là riêng tư đối với
lớp và đối tượng. Các đối tượng của các lớp khác không truy nhập được các
thành phần này
- protected: các thành phần được khai báo với từ khóa này đều được bảo vệ,
các thành phần chỉ được truy cập trong phạm vi lớp
- public: các thành phần công cộng. Các đối tượng của lớp khác đều có thể
truy nhập đến các thành phần công cộng của một đối tượng bất kỳ.
3.2 Các thành phần

- Thuộc tính: thành phần chỉ dữ liệu của lớp, đặc trưng cho các tính chất của
lớp
<Kiểu dữ liệu> <Tên thuộc tính>;
- Phương thức: thành phần chỉ hành động của lớp
<Kiểu trả về> <Tên phương thức>([Các tham số]);
Ví dụ :


14











3.3 Định nghĩa phương thức:
 Bên trong phạm vi định nghĩa lớp:
<Kiểu trả về> <Tên phương thức>([Các tham số])
{
//Cài đặt chi tiết
}
 Bên ngoài phạm vi định nghĩa lớp:
<Kiểu trả về> <Tên lớp> ::<Tên phương thức>([Các tham số])
{
//Cài đặt chi tiết

}
3.4 Tạo lập đối tượng
Sau khi định nghĩa lớp ta có thể khai báo các biến thuộc kiểu lớp. Các biến
này được gọi là các đối tượng. Cú pháp khai báo biến đối tượng như sau:
Tên lớp Danh sách biến;
3.5. Truy nhập tới các thành phần của lớp
class Car{

private:
// danh sách các thuộc tính
int speed; // tốc độ của xe

public:
// danh sách các hàm
void show();// giới thiệu xe
}

15

Để truy nhập đến dữ liệu thành phần lớp, ta dùng cú pháp;
- Thuộc tính: <Tên đối tượng >.<Tên thuộc tính>;
- Phương thức: <Tên đối tượng>.<Tên phương thức> ([các đối số]);
3.6 Thực hành

























1. Gọi trình soạn thảo
2. Tạo ra một tập tin mới
3. Nhập vào đoạn mã sau
#include <iostream.h>
#include <conio.h>
#include <string.h>

/* Dinh nghia lop */

class Car {
private:
int speed ; // toc do
float price; // gia ca

public:
void setSpeed(int); // Gan toc do cho xe
int getSpeed(); // Doc toc do xe
void setPrice(float); // Gan gia ca cho xe
float getPrice(); // Lay gia ca cho xe
void init(int , float); // Khoi tao thong tin ve xe
void show (); // gioi thieu xe
};


// Dinh nghia phuong thuc ben ngoai lop

void Car:: setSpeed(int speedIn) // Gan toc do cho xe
{
speed = speedIn;

}

int Car:: getSpeed() //Doc toc do cua xe
{
return speed;
}

void Car:: setPrice(float priceIn) // Gan gia ca cho xe
{
price = priceIn;
}

float Car:: getPrice() //Doc gia ca cua xe
{

return price;
}

16






















Bài tập:
1. Định nghĩa một lớp có tên là Fraction để biểu diễn các phân số (tử
số/mẫu số). Đinh nghĩa các toán tử +, -, *, / để dùng cho các phân số
(sử dụng đa năng hóa toán tử).

2. Định nghĩa một lớp có tên là Complex để biểu diễn các số phức. Một số
phức có hình thức tổng quát là a + bi; trong đó a là phần thực, b là phần
ảo ( i thay cho ảo). Các quy luật toán học trên số phúc như sau:
// Khoi tao cac thong tin ve xe

void Car :: init (int speedIn, float priceIn)
{
speed = speedIn;
price = priceIn;
}

void Car:: show ()
{
cout<< "Xe nay co toc do " << speed<<"km/h va gia ca:
"<<price<<endl;
}

// Chuong trinh chinh
int main()
{
Car myCar; // Khai bao doi tuong cua lop

// Khoi tao xe thu nhat

cout<<"Xe thu nhat: "<<endl;
myCar.init(100, 3000);
cout<<"Toc do km/h: "<<myCar.getSpeed()<<endl;
cout<<"Gia ca $ : "<< myCar.getPrice()<<endl;

// Khoi tao xe thu hai , Thay doi thuoc tinh xe

cout<<"Xe thu hai: "<<endl;
myCar.setSpeed(150);
myCar.setPrice(5000);
myCar.show();
getch();
return 0;
}


17

(a + bi) + ( c+ di) = (a + c) + (b + d)i
(a + bi) - ( c+ di) = (a + c) - (b + d)i
(a + bi) * ( c+ di) = (ac - bd) + (bc + ad)i
Định nghĩa các thao tác này như là các hàm thành viên của lớp
Complex.
3. Xây dựng lớp vectơ gồm các thành phần: số phần tử, mảng các phần tử
- Phương thức: nhập, in, tổng 2 vectơ, tích vô hướng
Hàm main:
- Nhập 2 vectơ a và b
- Tính và in tổng a+b
4. Xây dựng lớp sinh viên gồm các thành phần:
- Thuộc tính : họ tên, ngày sinh, giới tính, lớp ,điểm toán, lý, hóa,
đtb
- Phương thức: nhập, in, tính điểm trung bình
Hàm main:
- Nhập danh sách sinh viên
- Sắp xếp theo điểm trung bình giảm dần
- In danh sách sau khi sắp xếp
5. Xây dựng lớp hóa đơn gồm các thành phần:

- Thuộc tính: mã vật tư, tên vật tư, loại phiếu, ngày lập, khối
lượng, đơn giá, thành tiền
- Phương thức: nhập, in, kiểm tra phiếu nhập hay xuất
Hàm main:
- Nhập danh sách hóa đơn
- Tính thành tiền cho các hóa đơn và in tổng thành tiền
- In danh sách sau khi xếp theo số tiền giảm dần
18



Bài 4: LỚP VÀ ĐỐI TƯỢNG (tiếp tục – 4 tiết)
4.1 Hàm khởi tạo - Constructor
Hàm khởi tạo được gọi mỗi khi khai báo một đối tượng lớp.
- Khai báo hàm khởi tạo:
class <Tên lớp>{
public:
<Tên lớp> ([<các tham số >]); // Khai báo hàm khởi
tạo
};
Chú ý:
- Hàm khởi tạo phải có tên trùng với tên lớp
- Hàm khởi tạo không có giá trị trả về
- Hàm khởi tạo có tính chất public
- Có thể có nhiều hàm khởi tạo của cùng một lớp
- Hàm tạo có thể có tham số hoặc không có tham số
Ví dụ 1:








// Khai báo thư viện

#include <iostream.h>
#include <conio.h>
#include <string.h>

// Khai báo lớp
class Car {
private:
int speed; // Toc do
float price; // gia ca
char mark[]; // nhan hieu

public:
Car(); // Ham khoi tao khong co tham so
Car(int, char[] , float) ; // Ham khoi tao co 3
tham so
void show(); // Gioi thieu xe

};
19



























// Dinh nghia phuong thuc ben ngoai lop

Car :: Car() // Ham khoi tao khong co tham so
{
speed = 0;
strcpy (mark, "");
price = 0;
}
// ham khoi tao co 3 tham so

Car :: Car (int speedIn , char markIn[], float priceIn )
{
speed = speedIn;
strcpy (mark, markIn);
price = priceIn;
}

void Car:: show() // Phuong thuc gioi thieu xe
{
cout<<"Xe nay la : "<< mark << "co toc do la: "<<speed<<
" km/h va co gia ca la: "<<price<<endl;
}



// Ham main, ham chinh cua chuong trinh
int main()
{
//Su dung ham khoi tao khong co tham so
Car myCar1;
//Su dung ham khoi tao co day du 3 tham so
Car myCar2( 150, "Ford", 4000);
//Gioi thieu xe thu nhat
cout<<"Xe thu nhat: "<<endl;
myCar1.show();
//Gioi thieu xe thu hai
cout<<"Xe thu hai: "<<endl;
myCar2.show();
getch();
return 0;

}

20



Ví dụ 2:













Trong ví dụ này, câu lệnh DIEM d2; trong hàm main() sẽ bị chương trình
dịch báo lỗi. Bởi vì lệnh này sẽ gọi tới hàm tạo không đối, mà hàm tạo này
chưa được xây dựng. Có thể khắc phục điều này bằng cách chọn một trong
hai giải pháp sau:
- Xây dựng thêm hàm tạo không đối.
- Gán giá trị mặc định cho tất cả các đối x1, y1 của hàm tạo đã xây dựng ở
trên.
Chú ý : Nếu trong lớp đã có ít nhất một hàm tạo, thì hàm tạo mặc
định sẽ không được phát sinh nữa. Khi đó mọi câu lệnh xây dựng đối tượng
mới đều sẽ gọi đến một hàm tạo của lớp. Nếu không tìm thấy hàm tạo cần

gọi thì chương trình dịch sẽ báo lỗi.
#include <conio.h>
#include <iostream.h>
class DIEM
{
private:
int x,y;
public:
DIEM(int x1, int y1)
{
x=x1; y=y1;
}
void in()
{
cout << “\n” << x << “ ” << y <<” ” << m;
}
};
void main()
{
DIEM d1(200,200); // Goi ham tao co doi
DIEM d2; // Loi, goi ham tao khong doi
d2= DIEM_DH (3,5); // Goi ham tao co doi
d1.in();
d2.in();
getch();
};
21




Chương trình trên sẽ được sửa lại như sau:















4.2 Hàm hủy – Destructor
Hàm hủy bỏ được gọi đến khi mà đối tượng được giải phóng khỏi bộ
nhớ. Nhiệm vụ của hàm hủy bỏ là dọn dẹp bộ nhớ trước khi đối tượng bị giải
phóng.
Khai báo hàm hủy bỏ:
class <Tên lớp> {
public:
~<Tên lớp>([Các tham số]); // Khai báo hàm hủy bỏ
};
#include <conio.h>
#include <iostream.h>
class DIEM
{
private:

int x,y;
public:
DIEM(int x1=0, int y1=0)
{
x = x1; y = y1;
}
void in()
{
cout << “\n” << x << “ ” << y <<” ” << m;
}
};
void main()
{
DIEM d1(2,3); //Goi ham tao,khong dung tham so mac dinh
DIEM d2; //Goi ham tao, dung tham so mac dinh
d2= DIEM(6,7);//Goi ham tao,khong dung tham so mac dinh
d1.in();
d2.in();
getch();
}
22


Ví dụ 1:









Chú ý
Xây dựng hàm hủy thì tuân theo quy tắc sau:
- Hàm hủy bỏ phải có tên bắt đầu bằng dấu "~", theo sau là tên của lớp
tương ứng
- Hàm hủy bỏ không có giá trị trả về
- Hàm hủy bỏ phải có tính chất public
- Mỗi lớp chỉ có nhiều nhất một hàm hủy bỏ. Trong trường hợp không
khai báo tường minh hàm hủy bỏ, C++ sẽ sử dụng hàm hủy bỏ ngầm
định.
- Khi có ít nhất một trong các thuộc tính của lớp là con trỏ, nên sử
dụng hàm hủy bỏ tường minh để giải phóng triệt để các vùng nhớ
của các thuộc tính, trước khi đối tượng bị giải phóng khỏi bộ nhớ.





class Car {
private:
int speed;
char *mark;
float price;
public:
~ Car (){
delete [] mark;
};
}


23



Ví dụ 2:


























#include <iostream.h>
class Count{
private:
static int counter;
int obj_id;
public:
Count();
static void display_total();
void display();
~Count();
};
int Count::counter;
Count::Count()
{
counter++;
obj_id = counter;
}
Count::~Count()
{
counter ;
cout<<"Doi tuong "<<obj_id<<" duoc huy bo\n";
}
void Count::display_total()
{
cout <<"So cac doi tuong duoc tao ra la = "<<
counter << endl;
}
void Count::display()
{
cout << "Object ID la "<<obj_id<<endl;

}
void main()
{
Count a1;
Count::display_total();
Count a2, a3;
Count::display_total();
a1.display();
a2.display();
a3.display();
}
24



4.3 Hàm bạn
Trong thực tế thường xãy ra trường hợp có một số lớp cần sử dụng
chung một hàm. C++ giải quyết vấn đề này bằng cách dùng hàm bạn. Để một
hàm trở thành bạn của một lớp, có 2 cách viết:
Cách 1: Dùng từ khóa friend để khai báo hàm trong lớp và xây dựng
hàm bên ngoài như các hàm thông thường (không dùng từ khóa friend). Mẫu
viết như sau :
class A
{
private :
// Khai báo các thuộc tính
public :

// Khai báo các hàm bạn của lớp A
friend void f1 ( ) ;

friend double f2 ( ) ;

} ;
// Xây dựng các hàm f1,f2,f3
void f1 ( )
{

}
double f2 ( )
25

{
}
Cách 2: Dùng từ khóa friend để xây dựng hàm trong định nghĩa lớp .
Mẫu viết như sau :
class A
{
private :
// Khai báo các thuộc tính
public :

// Khai báo các hàm bạn của lớp A
void f1 ( )
{

}
double f2 ( )
{

}

} ;
Hàm bạn có những tính chất sau:
- Hàm bạn không phải là hàm thành phần của lớp.
- Việc truy nhập tới hàm bạn được thực hiện như hàm thông thường.
- Trong thân hàm bạn của một lớp có thể truy nhập tới các thuộc tính
của đối tượng thuộc lớp này. Đây là sự khác nhau duy nhất giữa hàm
bạn và hàm thông thường.

×