Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 28

Bài 3: Chương 2:

LỚP VÀ ĐỐI
TƯỢNG(tiếp)
2.7 CÁC HÀM TRỰC TUYẾN(INLINE)
2.8 HÀM BẠN (FRIEND FUNCTION)
2.7 Các hàm trực tuyến(Inline)
Việc tổ chức chương trình thành các hàm có ưu điểm là chia
chương trình thành các đơn vị độc lập, làm cho chương trình
được tổ chức một cách khoa học dễ kiểm soát, dễ phát hiện lỗi,
dễ phát triển, dễ mở rộng và giảm kích thước chương trình.
Tuy nhiên hàm có nhược điểm là làm giảm tốc độ chạy chương
trình do phải thực hiện một số thao tác có tính thủ tục mỗi khi
gọi hàm như cấp phát vùng nhớ cho các đối và các biến cục bộ,
truyền dữ liệu của các tham số cho các đối, giải phóng vùng nhớ
trước khi thoát khỏi hàm.
2.7 Các hàm trực tuyến(Inline)
Giải pháp khắc phục các nhược điểm trên của hàm là biến hàm
thành hàm trực tuyến (inline). Để biến một hàm thành trực tuyến
ta viết thêm từ khóa inline vào trước khai báo nguyên mẫu hàm
như sau:
inline float f(….);
float f(….)
{
//…
}
2.7 Các hàm trực tuyến(Inline)
Nếu không dùng nguyên mẫu thì viết từ khóa này trước
dòng đầu tiên của định nghĩa hàm:
inline float f(….)
{
//…
}
2.7 Các hàm trực tuyến(Inline)
Hàm inline trong C++ là khái niệm mạnh được sử dụng phổ
biến với các lớp. Nếu một hàm là inline, thì trình biên dịch
(compiler) đặt một bản sao code của hàm đó tại mỗi vị trí
mà hàm đó được gọi tại thời điểm biên dịch.
Một định nghĩa hàm trong một định nghĩa lớp là một định
nghĩa hàm inline, ngay cả khi không sử dụng định danh
inline. Như vậy mọi hàm thành phần được định nghĩa trong
lớp đều được trình biên dịch xử lý theo kiểu inline.
2.8 Hàm bạn (friend function)
a. Hàm: (function)
Hàm có các tính chất sau:
Phạm vi của hàm là toàn bộ chương trình, vì vậy hàm có thể được
gọi từ bất kỳ chỗ nào. Như vậy trong các phương thức cũng có thể sử
dụng hàm.
Đối của hàm có thể là các đối tượng, tuy nhiên có một hạn chế là
trong thân hàm không cho phép truy nhập tới các thuộc tính của các
đối này.
Trong thân hàm có thể gọi tới các phương thức (public) của lớp.
2.8 Hàm bạn (friend function)
b. Hàm bạn:
Một hàm bình thường không thể truy nhập tới các
thuộc tính private của lớp. Nhưng nếu trong lớp có
khai báo hàm đó là hàm bạn của lớp thì hàm đó có
quyền truy xuất tới các thuộc tính private giống như
các phương thức của lớp đó.
Các kiểu bạn bè:
2.8 Hàm bạn (friend function)
b. Hàm bạn:
Các kiểu bạn bè:
1. Hàm tự do là bạn của một lớp
2. Hàm thành phần của một lớp là bạn của một lớp khác
3. Tất cả các hàm thành phần của một lớp là bạn của một lớp
khác
4. Hàm bạn của nhiều lớp.
1. Hàm tự do là bạn của một lớp
Trong lớp phải đưa ra khai báo hàm bạn của
mình:
friend <kiểu_trả_về> Tên_hàm(Ds đối số);
 Việc định nghĩa hàm bạn bên ngoài lớp giống
như một hàm thông thường
 Lưu ý: Trong hàm bạn không còn tham số
ngầm định this như trong hàm thành phần.
Ví dụ 2.12: Hàm tự do là bạn của một lớp
#include<iostream.h> float tinhdientich(HCN h)
class HCN{ {
private:
return h.d*h.r ;
float d,r;
public: }
HCN (float d,float r) int main()
{ {
this->d=d; HCN h(20,15);
this->r=r; cout<<"In thong tin hinh chu nhat: ";
}
float tinhchuvi();
h.inthongtin();//……
friend float tinhdientich(HCN h); cout<<" co dien tich la: "
void inthongtin(); <<tinhdientich(h);
}; }
2. Hàm thành phần của một lớp là bạn
của một lớp khác
Giả thiết có 2 lớp A và B, trong B có một hàm thành
phần f khai báo như sau:
int f(char, A);
Nếu f có nhu cầu truy xuất vào các thành phần riêng
của A thì f cần phải được khai báo là bạn của lớp A ở
trong lớp A bằng câu lệnh
friend int B::f(char , A);
Lưu ý
Để biên dịch được các khai báo của lớp A có chứa các khai
báo bạn bè với lớp B, chương trình dịch cần phải biết trước
nội dung lớp B, nghĩa là khai báo của B phải được khai báo
trước biên dịch của A
Ngược lại, khi biên dịch khai báo int f(char, A) trong lớp
B, chương trình dịch không nhất thiết phải biết chi tiết nội
dung của A, nó chỉ cần biết rằng A là một lớp bằng khai báo:
class A;
Vậy sơ đồ khai báo và định nghĩa phải như
sau:

class A;
class B
{ ...
int f(char, A); …
...
};
Vậy sơ đồ khai báo và định nghĩa phải như sau:

class A
{ ...
friend int B::f(char,A);
.. .
};
int B::f(char, A)
{
….. .
}
BÀI TOÁN NHÂN MA TRẬN
BÀI TOÁN NHÂN MA TRẬN
Ví dụ 2.13:Hàm thành phần của một
lớp là bạn của một lớp khác
Hàm tính tích là hàm thành viên của lớp ma trận và
là hàm bạn của lớp vec tơ
3. Tất cả các hàm thành phần của một
lớp là bạn của một lớp khác
Để tất cả các hàm thành phần của lớp B là bạn của lớp A, trong khai
báo của lớp A phải có chỉ thị:
class A
{ .. .
friend class B;
.. .
}
3. Tất cả các hàm thành phần của một
lớp là bạn của một lớp khác
 Lưu ý: Để biên dịch khai báo của lớp A,
phải đặt khai báo
class B;
trước khai báo lớp A.
Ví dụ 2.14: Tất cả các hàm thành phần của
một lớp là bạn của một lớp khác
Trong chương trình sau, lớp ma trận mt và lớp vec tơ vt là bạn bè
của nhau.
Khi đó tất cả các phương thức của lớp này đều là bạn của lớp kia và
ngược lại
4. Hàm bạn của nhiều lớp
Về nguyên tắc, mọi hàm đều có thể là bạn của
nhiều lớp khác nhau.
 Lưu ý: Khi khai báo các hàm phải đảm bảo các
lớp được sử dụng trong hàm đã được khai báo
trước đó (không cần định nghĩa trước)
Sơ đồ:
class B;
class A
{ ...
friend void f(A,B); …
...
};
class B
{ ...
friend void f(A,B);
.. .
};
Sơ đồ:
void f(A,B)
{
….. .
}
Ví dụ 2.15 Hàm bạn của nhiều lớp
Chương trình dưới đây thực hiện phép nhân 1 ma trận vuông cấp
3x3 với 1 véc tơ 3 chiều.
Trong chương trình xây dựng hàm tính tích là một hàm tự do và là
bạn của 2 lớp ma trận và lớp vec tơ
Các nội dung chính
 Các hàm trực tuyến
 Hàm bạn, tính chất của hàm bạn

25/20
Câu hỏi về nhà
Hàm trực tuyến là gì? Cách sử dụng hàm trực tuyến?
Hàm bạn là gì? Trong C++ có những kiểu bạn bè nào ?

26/20
Bài tập về nhà
Bài 1:
Xây dựng lớp PhanSo gồm các thuộc tính tử số t và mẫu số m (t và m nguyên) là
các thuộc tính riêng. Các phương thức trong lớp bao gồm:
Khởi tạo PS với các tham số có giá trị ngầm định bằng 1.
Hàm huỷ một đối tượng phân số.
Hàm hiển thị phân số ra màn hình ở dạng (a/b).
Hàm tính tổng, hiệu, tích, thương 2 phân số.
Viết chương trình tạo 2 phân số và in ra màn hình tổng, hiệu, tích, thương 2
phân số đó (Bằng cách sử dụng hàm bạn).
Bài tập về nhà
Bài 2:
Xây dựng lớp hóa đơn gồm các thành phần: 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; các phương thức gồm nhập, in,
kiểm tra phiếu nhập hay xuất
Viết chương trình thực hiện các chức năng sau:
- 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
Bài 3: Viết chương trình trình tính tích của ma trận vuông cấp n và vector n
chiều (n nguyên dương nhập từ bàn phím) theo nhiều cách.

You might also like