Tải bản đầy đủ (.docx) (5 trang)

CÁC HÀM TRỰC TUYẾN (INLINE)

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 (108.2 KB, 5 trang )

Chương 7. Lớp và đối tượng
I. CÁC HÀM TRỰC TUYẾN (INLINE)
Một số mở rộng của C++ đối với C đã được trình bày trong các chương trước
như biến tham chiếu, định nghĩa chồng hàm, hàm với đối mặc định … Phần này ta
xem một đặc trưng khác của C++ được gọi là hàm trực tuyến (inline).
1 Ưu nhược điểm của hàm
Việc tổ chức chương trình thành các hàm có 2 ưu điểm rõ rệt:
Thứ nhất 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 và mở
rộng.
Thứ hai là giảm được kích thước chương trình, vì mỗi đoạn chương trình thực
hiện nhiệm vụ của hàm được thay bằng một lời gọi hàm.
Tuy nhiên hàm cũng có nhược điểm là làm chậm tốc độ 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 đốivà 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.
Các hàm trực tuyến trong C++ có khả năng khắc phục được các nhược điểm nói
trên.
1. Các hàm trực tuyến
Để biến một hàm thành trực tuyến ta viết thêm từ khoá inline vào trước khai
báo nguyên mẫu hàm. Nếu không dùng nguyên mẫu thì viết từ khoá này trước dòng
đầu tiên của định nghĩa hàm.
Ví dụ 1 :
inline float f(int n, float x);
float f(int n, float x)
{
// Các câu lệnh trong thân hàm
}
hoặc
inline float f(int n, float x)
{


// Các câu lệnh trong thân hàm
}
Chú ý: Trong mọi trường họp, từ khoá inline phải xuất hiện trước các lời gọi
1
1
Chương 7. Lớp và đối tượng
hàm thì trình biên dịch mới biết cần xử lý hàm theo kiểu inline.
Ví dụ hàm f trong chương trình sau sẽ không phải là hàm trực tuyến vì từ khoá
inline viết sau lời gọi hàm:
#include <conio.h>
#include <iostream.h>
void main()
{
int s ;
s = f(5,6);
cout << s ;
getch();
}
inline int f(int a, int b)
{
return a*b;
}
Chú ý: Trong C
++
, nếu hàm được xây dựng sau lời gọi hàm thì bắt buộc phải
khai báo nguyên mẫu hàm trước lời gọi. Trong ví dụ trên, trình biên dịch C
++
sẽ bắt
lỗi vì thiếu khai báo nguyên ngẫu hàm f .
2. Cách biên dịch và dùng hàm trực tuyến

Chương trình dịch xử lý các hàm inline như các macro (được định nghĩa trong
lệnh #define), nghĩa là nó sẽ thay mỗi lời gọi hàm bằng một đoạn chương trình thực
hiện nhiệm vụ của hàm. Cách này làm cho chương trình dài ra, nhưng tốc độ chương
trình tăng lên do không phải thực hiện các thao tác có tính thủ tục khi gọi hàm.
Phương án dùng hàm trực tuyến rút ngắn được thời gian chạy máy nhưng lại
làm tăng khối lượng bộ nhớ chương trình (nhất là đối với các hàm trực tuyến có
nhiều câu lệnh). Vì vậy chỉ nên dùng phương án trực tuyến đối với các hàm nhỏ.
3. Sự hạn chế của trình biên dịch
Không phải khi gặp từ khoá inline là trình biên dịch nhất thiết phải xử lý hàm
theo kiểu trực tuyến.
Có một số hàm mà các trình biên dịch thường không xử lý theo cách inline như
các hàm chứa biến static, hàm chứa các lệnh chu trình hoặc lệnh goto hoặc lệnh
switch, hàm đệ quy. Trong trường hợp này từ khoá inline lẽ dĩ nhiên bị bỏ qua.
Thậm chí từ khoá inline vẫn bị bỏ qua ngay cả đối với các hàm không có những
2
2
Chương 7. Lớp và đối tượng
hạn chế nêu trên nếu như trình biên dịch thấy cần thiết (ví dụ đã có quá nhiều hàm
inline làm cho bộ nhớ chương trình quá lớn)
Ví dụ 2 : Chương trình sau sử dụng hàm inline tính chu vi và diện tích của hình chữ
nhật:
Cách 1 : Không khai báo nguyên mẫu. Khi đó hàm dtcvhcn phải đặt trước hàm
main.
#include <conio.h>
#include <iostream.h>
inline void dtcvhcn(int a, int b, int &dt, int &cv)
{
dt=a*b;
cv=2*(a+b);
}

void main()
{
int a[20],b[20],cv[20],dt[20],n;
cout << "\n So hinh chu nhat: '' ;
cin >> n;
for (int i=1; i<=n; ++i)
{
cout <<"\n Nhap 2 canh cua hinh chu nhat thu " << i << ": ";
cin >> a[i] >> b[i];
dtcvhcn(a[i],b[i],dt[i], cv[i]);
}
clrscr();
for (i=1; i<=n; ++i)
{
cout << "\n Hinh chu nhat thu "<< i << '' : '';
cout << "\n Do dai 2 canh= '' << a[i] << '' va '' << b[i] ;
cout <<"\n Dien tich= " << dt[i] ;
cout << "\n Chu vi= '' << cv[i] ;
}
getch();
}
3
3
Chương 7. Lớp và đối tượng
Cách 2:Sử dụng khai báo nguyên mẫu. Khi đó từ khoá inline đặt trước nguyên
mẫu.
Chú ý: Không được đặt inline trước định nghĩa hàm. Trong chương trình dưới đây
nếu đặt inline trước định nghĩa hàm thì hậu quả như sau: Chương trình vẫn dịch
thông, nhưng khi chạy thì chương trình bị quẩn và không thoát đi được.
#include <conio.h>

#include <iostream.h>
inline void dtcvhcn(int a, int b, int &dt, int &cv);
void main()
{
int a[20],b[20],cv[20],dt[20],n;
cout << "\n So hinh chu nhat: '' ;
cin >> n;
for (int i=1; i<=n; ++i)
{
cout <<"\n Nhap 2 canh cua hinh chu nhat thu " << i << ": ";
cin >> a[i] >> b[i];
dtcvhcn(a[i],b[i],dt[i], cv[i]);
}
clrscr();
for (i=1; i<=n; ++i)
{
cout << "\n Hinh chu nhat thu "<< i << '' : '';
cout << "\n Do dai 2 canh= '' << a[i] << '' va '' << b[i] ;
cout <<"\n Dien tich= " << dt[i] ;
cout << "\n Chu vi= '' << cv[i] ;
}
getch();
}
void dtcvhcn(int a, int b, int&dt, int &cv)
{
dt=a*b;
cv=2*(a+b);
}
4
4

Chương 7. Lớp và đối tượng
5
5

×