Thứ Ba, 2 tháng 4, 2019

[Học C++] Bài8 - Inline Functions và Function Overloading trong C++

Inline function là gì?

Nó có tính chất khá tương tự như Preprocessors trong C.
Hàm Inline thực chất là 1 hàm,.nó là bản copy của hàm trong quá trình biên dịch...
Tất cả các members bên trong class được mặc định định nghĩa như 1 Inline.Do đó không cần khai báo
từ khóa Inline,nhưng để cho clear chúng ta có thể thêm...
inline void fun(int a)
{
    return a++;
}

1 . Forward References trong C++
Vì Inline function trong 1 class được đánh giá đến khi kết thúc class "};"
Ví dụ sau sẽ rõ:
class ForwardReference
{
    int i;
    public:
    // call to undeclared function
    int f() //f là 1 inline function
    {
        return g()+10;
    }
    int g() //g là 1 inline function
    {
        return i;
    }
};
int main()
{
    ForwardReference fr;
    fr.f();
}
Nhiều bạn nghĩ program sẽ lỗi...Nhưng không hề lỗi.
Hàm Inline trong class: Các hàm định nghĩa ở trên có thể gọi các hàm ở line dưới.
Vì class chỉ được định nghĩa khi nó kết thúc khỏi dấu "};" Do đó tất cả các hàm trong
class đều được định nghĩa.

Kinh nghiệm:

- Tạo hàm Inline nhỏ và có ít tham số sẽ tốt hơn.
- Inline function sẽ tăng tính hiệu quả,nhưng không nên tạo tất cả là hàm Inline.
Vì khi có quá nhiều hàm Inline nó dẫn đến code bloat,Cache missing và ảnh hưởng tới speed.
- Lời khuyên là: Nên định nghĩa các hàm lớn bên ngoài class,sử dụng "::" để gọi.
- Inline function không yêu cầu cấp bộ nhớ cho nó mà nó được giữ tại Symbol table..Do đó
khi ta thực hiện tác vụ là yêu cầu địa chỉ của Inline function,Compiler không thể thực hiện
quá trình inlining như 1 hàm binhg thường.Bởi vì,để cung cấp địa chỉ cho 1 hàm bất kì,Compiler sẽ phải
cấp phát bộ nhớ cho nó.


Nếu class có nhiều hàm và các hàm trùng tên nhau..
Chú ý,Overloading không phải đệ quy--- Đệ quy là 1 hàm và trong thân hàm gọi lại chính nó...
Còn Overloading là các hàm với các kiểu trả về,tham số khác nhau,hay đặc biệt là giống nhau nhưng cùng tên.



2. Có 2 cách tạo Overloading function
2.1 Khác số lượng tham số

// first definition có 2 tham số x,y
int sum (int x, int y)
{
    cout << x+y;
}
// second overloaded defintion có 3 tham số x,y,z
int sum(int x, int y, int z)
{
    cout << x+y+z;
}

int main()
{
    // sum() with 2 parameter will be called
    sum (10, 20); 
    //sum() with 3 parameter will be called
    sum(10, 20, 30); 
}


2.2 Khác kiểu trả về
int sum(int x, int y)
{
    cout<< x+y;
}
// second overloaded defintion
double sum(double x, double y)
{
    cout << x+y;
}
int main()
{
    sum (10,20);
    sum(10.5,20.5);
}
2.3 Hàm với tham số mặc định
sum(int x, int y=0)
{
    cout << x+y;
}
int main()
{
    sum(10);
    sum(10,0);
    sum(10,10);
}
OUTPUT 10 10 20

Một số rule:
- Chỉ tham số cuối cùng mới được làm default argument
sum (int x,int y);   
sum (int x,int y=0); 
sum (int x=0,int y);  // This is Incorrect
void f(int a,int b=0,int c) {}  //sai
Vậy muốn dùng nhiều default parameters???
void f(int a,int b=0,int c=0) {} // Để dùng default thì ra phải set value cho
tất cả các tham số sau tham số đầu tiên.

Ngoài ta,ta cũng có thể không cần khai báo tham số mà chỉ cần khai báo kiểu dữ liệu
void sum (int, int);
void sum (int, int=0);
void main() {
 sum(8,8); //ok
 sum(7.6,9); // vẫn ok. Nhưng hãy cẩn thận đến range của đối số,có thể kết quả sẽ sai
}


Không có nhận xét nào:

Đăng nhận xét