🌱 C++ Functions - Tổng quan về Hàm trong C++

🌱 C++ Functions - Tổng quan về Hàm trong C++

Trong lập trình, để thực hiện một đoạn code nhiều lần, chúng ta khái niệm vòng lặp, nhưng để đoạn code thực hiện nhiều lần, ở nhiều vị trí khác nhau, chúng ta sẽ không thể dùng vòng lặp.

    Trường hợp những đoạn code được gọi đi gọi lại ở nhiều vị trí, các ngôn ngữ lập trình cung cấp khái niệm Function - Hàm, dùng để tổng hợp các đoạn code thực thi một nhiệm vụ cụ thể nào đó.

    👉 Khái niệm và công dụng của Function

    Function - Hàm là một khối lệnh dùng để thực thi những nhiệm vụ cụ thể.

    Việc tổ chức và sử dụng function có mục đích giúp chương trình dễ hiểu, có khả năng tái sử dụng, và giảm kích thước của code.

    ➤ C++ có 2 loại function:

  1. Standard Library Functions: Các hàm thư viện chuẩn được định nghĩa bởi C++
  2. User-defined Functions: Được định nghĩa bởi user/developer.

    Trong bài viết này sẽ tập trung vào User-defined Functions.

    👉 User-defined Functions

    C++ cho phép người lập trình định nghĩa ra các hàm. Về cơ bản, function là tập hợp các câu lệnh, mục tiêu thường dùng để làm một chức năng cụ thể, và mỗi function có một tên gọi riêng (identifier).

    Khi hàm được sử dụng (gọi hàm - call function), tất cả các câu lệnh trong function sẽ được thực thi.

    🔻 Khai báo hàm - Function Declaration

returnType functionName(parameter1, parameter2,...)
{
    // function body   
}

    Ví dụ khai báo một hàm,

// function declaration
void greet()
{
    cout << "Hello World";
}

    Ở đây tên hàm là greet, kiểu trả về là void, không có tham số truyền vào.

    🔻 Calling a Function - Gọi hàm

    Trong chương trình, việc sử dụng hàm gọi là Call Function - Gọi hàm, ví dụ, để gọi hàm greet ở trên,

int main()
{ 
    // calling a function   
    greet(); 
}

cpp-call-function-working
Hoạt động của Function trong C++

    Việc gọi hàm tức là chương trình sẽ nhảy đến địa chỉ của hàm greet() trên bộ nhớ. Để hiểu quá trình function call diễn ra như thế nào, các bạn đọc thêm bài viết sau.

🔻 Function Call 🔻

    🔻 Ví dụ sử dụng function

#include <iostream>
using namespace std;

// declaring a function
void greet()
{
    cout << "Hello World!";
}

int main()
{
    // calling the function
    greet();
    return 0;
}

    Run This Code    

    ➥ Các bạn có thể bấm "Run This Code", kết quả hiển thị trên màn hình console như sau.

Hello World!

    👉 Function Parameters and Return Value

    🔻 Function Parameters

    Như đã nói ở trên, một function có thể được khai báo bằng các tham số (parameter), hoặc gọi là đối số (argument). Tham số là một giá trị được truyền vào hàm khi khai báo và sử dụng. Ví dụ,

void printNum(int num)
{
    cout << num;
}

    Ở đây, num là tham số của hàm với kiểu dữ liệu int. Khi gọi hàm, chúng ta có thể truyền một giá trị int vào hàm.

int main()
{
    int n = 7;    

    // calling the function
    // n is passed to the function as argument
    printNum(n);
    
    return 0;
}

     ➥ Các đối số được truyền khi gọi hàm nên khớp kiểu dữ liệu với các tham số tương ứng được định nghĩa trong phần khai báo hàm. Nếu cố gắng truyền một giá trị khác kiểu dữ liệu của tham số, giá trị đó sẽ bị ép kiểu trước khi truyền vào.

    🔻 Function Return Value

    Trong các ví dụ trên, chúng ta đặt kiểu dữ liệu trả về của hàm là void, điều này có nghĩa là hàm không trả về bất kỳ giá trị nào.

    Khi khai báo hàm, chúng ta có thể trả về một giá trị từ hàm, bằng cách khai báo một kiểu dữ liệu ở phần returnType. Sau đó, bên trong hàm, câu lệnh return dùng để trả về một giá trị tương ứng. Ví dụ,

int add(int a, int b)
{
   return (a + b);
}

     ➥ Ở đây hàm add có kiểu dữ liệu trả về là int, việc dùng câu lệnh return (a + b); sẽ trả về một giá trị bằng a+b.

    Câu lệnh return cũng thông báo việc thoát khỏi hàm. Các câu lệnh sau lệnh return sẽ không được thực thi.

    🔻 Ví dụ sử dụng Return Type

#include <iostream>
using namespace std;

// declaring a function
int add(int a, int b)
{
    return (a + b);
}

int main()
{
    int sum;
   
    // calling the function and storing
    // the returned value in sum
    sum = add(100, 78);

    cout << "100 + 78 = " << sum << endl;
    return 0;
}

    Run This Code    

    ➥ Các bạn có thể bấm "Run This Code", kết quả hiển thị trên màn hình console như sau.

100 + 78 = 178

    Việc trả về giá trị từ một hàm nên đi kèm với việc gán vào một biến (ở đây là biến sum), để có thể sử dụng.

cpp-function-return-value-working
Hoạt động của hàm với câu lệnh return

    👉 Function Prototype - Nguyên mẫu hàm

    Trong C/C++, việc khai báo hàm cần được thực hiện trước quá trình gọi hàm - function call. Một số trường hợp, chúng ta cần định nghĩa hàm (definition - hay triển khai hàm) sau khi gọi hàm, hoặc cần gọi hàm định nghĩa ở một file source khác, chúng ta cần dùng một định nghĩa, đó là Function Prototype. Ví dụ,

// function prototype
void add(int, int);

int main()
{
    // calling the function before declaration.
    add(5, 3);
    return 0;
}

// function definition
void add(int a, int b)
{
    cout << (a + b);
}

    Trong đoạn code trên, nguyên mẫu hàm là,

void add(int, int);

    Nguyên mẫu hàm - Function protoype, cung cấp thông tin về tên hàm, kiểu trả về, kiểu dữ liệu của các tham số. Mục đích là để khi compiler thực hiện biên dịch, nó sẽ hiểu là hàm add này sẽ được định nghĩa (ở một vị trí nào đó trong chương trình), và khi biên dịch đến hàm main, compiler sẽ không báo lỗi khi gặp câu lệnh add(5, 3);.

    Trong C/C++, thông thường chúng ta dùng nguyên mẫu hàm:

  • Trong nội bộ file, nguyên mẫu hàm thường đặt lên đầu file, còn phần definition của hàm sẽ đặt ở cuối file (Giống với ví dụ kể trên). Mục đích để các hàm quan trọng (ở đây là hàm main) sẽ được xuất hiện ở đầu file.
  • Trong project có nhiều file, nguyên mẫu hàm thường xuất hiện trong các file header (.h), mục đích là để cung cấp nguyên mẫu hàm, hay declaration của hàm cho hàm ở file khác có thể sử dụng.

    👉 Lợi ích của User-defined Function

  • Khả năng tái sử dụng code. Khi khai báo các hàm, chúng ta có thể sử dụng nhiều lần trong một chương trình, hoặc có thể là nhiều project khác nhau.
  • Quản lý và tổ chức chương trình dễ dàng hơn.
  • Code dễ đọc hơn 😀

    👉 C Library Function - Các hàm của thư viện có sẵn

    C++ cung cấp một số thư viện với các hàm có sẵn để user sử dụng mà không cần viết lại. Một số hàm được sử dụng phổ biến như sqrt(), abs(), isdigit()...

    Để sử dụng các hàm thư viện, chúng ta cần #include đến header file chứa các hàm đó, các header file này cũng có sẵn khi chúng ta cài các compiler C++.

    Ví dụ, các hàm toán học như sqrt(), abs() sẽ có trong header file cmath.

    🔻 Ví dụ tính căn bậc hai của một số nguyên

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    double number, squareRoot;    
    number = 25.0;

    // sqrt() is a library function to calculate the square root
    squareRoot = sqrt(number);

    cout << "Square root of " << number << " = " << squareRoot;
    return 0;
}

    Run This Code    

    ➥ Các bạn có thể bấm "Run This Code", kết quả hiển thị trên màn hình console như sau.

Square root of 25 = 5

>>>= Follow ngay =<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊

Chúc các bạn học tập tốt 😊

                                        

Nguyễn Văn Nghĩa

Mình là một người thích học hỏi và chia sẻ các kiến thức về Nhúng IOT.

Đăng nhận xét

Mới hơn Cũ hơn