Hàm trong C++

Trong bài này, bạn sẽ được học mọi thứ về hàm trong C++; có những loại hàm nào, cách sử dụng chúng kèm theo ví dụ.

Trong lập trình, hàm được dùng để chỉ một đoạn mã nguồn được nhóm lại nhằm thực hiện một tác vụ nhất định.

Dựa trên việc một hàm được định nghĩa trước từ trước hay được viết bởi lập trình viên, sẽ có hai loại hàm:

  1. Hàm thư viện
  2. Hàm người dùng định nghĩa

Hàm thư viện

Các hàm thư viện là các hàm được dựng sẵn trong lập trình C++.

Lập trình viên có thể sử dụng hàm thư viện bằng lời gọi hàm trực tiếp; họ không cần phải tự viết lại chúng.

Ví dụ 1: Hàm thư viện

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    double number, squareRoot;
    cout << "Enter a number: ";
    cin >> number;

    // sqrt() là một hàm thư viện giúp tính giá trị căn bậc hai
    squareRoot = sqrt(number);
    cout << "Square root of " << number << " = " << squareRoot;
    return 0;
}

Đầu ra

Enter a number: 26

Square root of 26 = 5.09902

Trong ví dụ trên, hàm thư viện sqrt() được gọi để tính căn bậc hai của một số.

Chú ý dòng #include <cmath> trong chương trình trên. Ở đây, cmath là tệp header. Định nghĩa hàm sqrt() (thân của hàm đó) được đưa ra trong tệp header cmath.

Bạn có thể sử dụng toàn bộ hàm định nghĩa trong cmath khi bạn thêm nội dung của tệp cmath trong chương trình này bằng cách sử dụng #include <cmath>.

Mỗi chương trình C++ hợp cách sẽ có ít nhất một hàm, đó là hàm main().

Hàm người dùng định nghĩa

C++ cho phép người dùng tự định nghĩa hàm của mình.

Hàm do người dùng định nghĩa sẽ nhóm một đoạn mã nhằm thực hiện một tác vụ nhất định và đoạn mã nguồn đó sẽ được đặt tên (định danh).

Khi một hàm được gọi từ bất kỳ phần nào của chương trình, nó sẽ thực thi đoạn mã được định nghĩa trong thân hàm.

Hàm người dùng định nghĩa hoạt động thế nào trong lập trình C?

Khi một chương trình bắt đầu chạy, hệ thống sẽ gọi hàm main(), nghĩa là hệ thống bắt đầu thực thi mã nguồn từ hàm main().

Khi chương trình thực thi tới function_name() bên trong main(), nó sẽ di chuyển tới void function_name() và toàn bộ mã nguồn bên trong void function_name() sẽ được thực thi.

Sau đó, quá trình thực thi của chương trình sẽ trở lại với hàm main và tiếp tục thực thi mã nguồn sau khi kết thúc hàm function_name() như thể hiện trên hình.

Ví dụ 2: Hàm người dùng định nghĩa

Chương trình C++ giúp cộng hai số. Tạo một hàm add() để cộng hai số nguyên và hiển thị tổng trong hàm main().

#include <iostream>
using namespace std;

// nguyên mẫu hàm (khai báo)
int add(int, int);

int main()
{
    int num1, num2, sum;
    cout<<"Enters two numbers to add: ";
    cin >> num1 >> num2;

    // lời gọi hàm
    sum = add(num1, num2);
    cout << "Sum = " << sum;
    return 0;
}

// Định nghĩa hàm
int add(int a, int b)
{
    int add;
    add = a + b;

    // Câu lệnh trả về
    return add;
}

Đầu ra

Enters two integers: 8

-4

Sum = 4

Nguyên mẫu hàm (khai báo)

Nếu một hàm người dùng định nghĩa được định nghĩa sau hàm main(), trình biên dịch sẽ báo lỗi. Đó là vì trình biên dịch sẽ không hiểu được hàm do người dùng định nghĩa, kiểu đối số truyền vào hàm và kiểu trả về.

Trong C++, nguyên mẫu hàm là một khai báo hàm mà không cần phần thân của nó nhằm cung cấp thông tin cho trình biên dịch về hàm do người dùng định nghĩa. Nguyên mẫu hàm trong ví dụ trên là:

int add(int, int);

Bạn có thể thấy rằng, không có thân hàm trong nguyên mẫu. Ngoài ra, chỉ có kiểu trả về của đối số mà không có đối số. Bạn cũng có thể khai báo nguyên mẫu hàm như dưới đây nhưng không nhất thiết phải viết các đối số.

int add(int a, int b);

Chú ý: Không cần thiết phải định nghĩa nguyên mẫu hàm nếu hàm người dùng định nghĩa nằm ở trước hàm main().

Lời gọi hàm

Để thực thi mã nguồn trong thân hàm, hàm người dùng định nghĩa cần được gọi.

Trong ví dụ trên, add(num1, num2); trong hàm main() sẽ gọi tới hàm người dùng định nghĩa.

Hàm đó sẽ trả về một số nguyên được lưu tại biến add.

Định nghĩa hàm

Bản thân hàm đã được xem là một định nghĩa hàm. Định nghĩa hàm trong chương trình trên là:

// Định nghĩa hàm
int add(int a,int b)
{
    int add;
    add = a + b;
    return add;
}

Khi hàm được gọi, trình điều khiển được chuyển tới câu lệnh đầu tiên của thân hàm.

Sau đó, các câu lệnh tiếp theo trong thân hàm lần lượt được thực thi.

Khi toàn bộ mã nguồn bên trong định nghĩa hàm được thực thi, trình điều khiển của chương trình sẽ trở lại với nơi đã thực hiện lời gọi hàm.

Truyền đối số vào hàm

Trong lập trình, đối số (tham số) ám chỉ dữ liệu được truyền vào một hàm (định nghĩa hàm) khi hàm được gọi.

Trong ví dụ trên, hai biến, num1num2 được truyền vào hàm trong khi hàm được gọi. Các đối số này được xem là các đối số thực.

Giá trị của num1num2 được khởi tạo lần lượt cho biến ab. Các đối số ab được gọi là đối số hình thức.

Nó được thể hiện trong hình vẽ dưới đây:

Chú ý về việc truyền đối số

  • Số lượng đối số thực và đối số hình thức cần giống nhau. (Ngoại lệ: Nạp chồng hàm)
  • Kiểu của đối số thực đầu tiên cần giống với kiểu của đối số hình thức đầu tiên. Tương tự như vậy, kiểu của đối số thực thứ 2 cần giống với kiểu của đối số hình thức thứ 2 và cứ như vậy.
  • Bạn có thể gọi hàm mà không cần truyền vào bất kỳ đối số nào. Số lượng đối số truyền vào một hàm phụ thuộc vào cách lập trình viên muốn giải quyết vấn đề.
  • Bạn có thể gán giá trị mặc định cho các đối số. Các đối số khi đó được gọi là đối số mặc định.
  • Trong chương trình trên, cả hai đối số đều có kiểu int. Nhưng việc cả hai đối số phải có cùng kiểu là không cần thiết.

Câu lệnh trả về

Một hàm cần trả về một giá trị duy nhất cho chương trình gọi nó thông qua câu lệnh trả về.

Trong chương trình trê, giá trị của add được trả về từ hàm người dùng định nghĩa tới chương trình gọi nó thông qua câu lệnh sau:

return add;

Hình vẽ dưới đây thể hiện quá trình hoạt động của câu lệnh trả về

Trong chương trình trên, giá trị của add bên trong hàm người dùng định nghĩa sẽ được trả về hàm gọi nó. Giá trị được lưu vào biến sum.

Lưu ý rằng biến trả về, nghĩa là add có kiểu intsum cũng có kiểu int.

Ngoài ra, chú ý rằng kiểu trả về của hàm được định nghĩa trong phần khai báo hàm là int add(int a, int b). Chữ int trước add(int a, int b) có nghĩa là hàm nên trả về một giá trị kiểu int.

Nếu không có giá trị nào trả về chương trình đã gọi hàm, nên sử dụng void.

** Nếu bạn muốn viết các nội dung đặt biệt thì hãy làm theo hướng dẫn sau

Xem thêm 10 bình luận
Viết blog mới của bạn
Báo lỗi trang
Đang tải