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.
2. 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ờ ọ 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 .ỗ ế ẫ
3. 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 .ự ế ố ớ ỏ
4. 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 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(); }
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); }