Trong chương cuối, chúng ta đã định nghĩa một hàm là một tập hợp các câu lệnh thực thi tuần tự. Định nghĩa đó không cung cấp nhiều kiến ​​thức về lý do tại sao các hàm lại hữu ích. Hãy để chúng ta cập nhật thêm định nghĩa đó: Hàm là một chuỗi các câu lệnh có thể được sử dụng lại để thực hiện một công việc cụ thể.

Bạn đã biết rằng mọi chương trình phải có một hàm tên là hàm main() (đó là nơi chương trình bắt đầu thực thi khi nó được chạy). Tuy nhiên, khi các chương trình bắt đầu ngày càng dài hơn, việc đặt tất cả code bên trong một hàm main này sẽ ngày càng khó quản lý hơn. Hàm sẽ cung cấp một cách để giúp chúng ta chia các chương trình của chúng ta thành các phần nhỏ, mô đun, dễ tổ chức, kiểm tra và sử dụng hơn. Hầu hết các chương trình sử dụng nhiều hàm khá nhau. Thư viện chuẩn C ++ đi kèm với rất nhiều hàm đã được viết sẵn để bạn sử dụng – tuy nhiên, nó cũng giống như việc bạn viết riêng cho mình hàm nào đó để dùng. Các hàm mà bạn tự viết được gọi là các hàm do người dùng định nghĩa.

Hãy xem xét một trường hợp có thể xảy ra trong cuộc sống: bạn đang đọc một cuốn sách, khi bạn nhớ bạn cần gọi điện thoại. Bạn đặt một dấu trang vào cuốn sách của bạn, thực hiện cuộc gọi điện thoại và khi bạn hoàn thành cuộc gọi điện thoại, bạn quay lại nơi bạn đã đánh dấu và tiếp tục cuốn sách của bạn chính xác nơi bạn rời đi.

Các hàm trong chương trình C ++ có thể hoạt động theo cùng một cách như trên. Một chương trình sẽ thực hiện các câu lệnh tuần tự bên trong một hàm khi nó gặp một lệnh gọi hàm. Gọi hàm là một biểu thức báo cho CPU ngắt hàm hiện tại và thực hiện hàm khác đang được gọi. CPU có thể đặt một đánh dấu tại điểm thực thi hiện tại và sau đó gọi (thực thi) hàm khác để thực thi. Khi hàm được gọi kết thúc, CPU sẽ quay trở lại điểm được đánh dấu và tiếp tục thực hiện.

Hàm khởi tạo là hàm được gọi để khởi tạo một thứ gì đó.

1. Một số ví dụ về hàm do người dùng định nghĩa

Đầu tiên, hãy bắt đầu với cú pháp cơ bản nhất để xác định một hàm do người dùng định nghĩa. Đối với bài học này, tất cả các hàm do người dùng định nghĩa (trừ hàm main()) sẽ có dạng sau:

return-type identifier() // identifier replaced with the name of your function
{
// Your code here
}

Chúng ta sẽ nói nhiều hơn về các phần khác nhau của cú pháp này trong vài bài học tiếp theo. Hiện tại, identifier sẽ được thay thế bằng tên của hàm do người dùng định nghĩa. Các dấu ngoặc nhọn và các câu lệnh ở giữa được gọi là thân hàm.

Đây là một chương trình mẫu cho thấy cách một hàm mới được định nghĩa và được gọi:

#include <iostream> // for std::cout
 
// Definition of user-defined function doPrint()
void doPrint() // doPrint() is the called function in this example
{
    std::cout << "In doPrint()\n";
}
 
// Definition of function main()
int main()
{
    std::cout << "Starting main()\n";
    doPrint(); // Interrupt main() by making a function call to doPrint().  main() is the caller.
    std::cout << "Ending main()\n"; // this statement is executed after doPrint() ends
 
    return 0;
}

Chương trình này tạo ra đầu ra sau:

Starting main()
In doPrint()
Ending main()

Chương trình này bắt đầu thực thi ở đầu hàm main và dòng đầu tiên được thực hiện in Starting main()

Dòng thứ hai trong main là một lời gọi hàm doPrint. Chúng ta gọi hàm doPrint bằng cách nối thêm một cặp dấu ngoặc đơn vào tên hàm như: doPrint (). Lưu ý rằng nếu bạn quên dấu ngoặc đơn, chương trình của bạn có thể không biên dịch (và nếu có, hàm sẽ không được gọi).

Cảnh báo

Đừng bao giờ quên dấu ngoặc đơn () sau tên Hàm khi thực hiện lệnh gọi hàm.

Bởi vì một lệnh gọi hàm đã được thực hiện, việc thực thi các câu lệnh trong main bị treo và thực thi sẽ nhảy lên đỉnh của hàm được gọi là doPrint. Dòng đầu tiên (và duy nhất) trong hàm là In doPrint(). Khi doPrint kết thúc, việc thực thi sẽ quay trở lại nơi gọi (ở đây: hàm main) và tiếp tục lại từ điểm mà nó rời đi. Do đó, câu lệnh tiếp theo được thực thi trong hàm main là in ra Ending main()

2. Gọi hàm nhiều lần

Một điều hữu ích về hàm là chúng có thể được gọi nhiều lần trong hàm khác. Ở đây, một ví dụ sau:

#include <iostream> // for std::cout
 
void doPrint()
{
    std::cout << "In doPrint()\n";
}
 
// Definition of function main()
int main()
{
    std::cout << "Starting main()\n";
    doPrint(); // doPrint() called for the first time
    doPrint(); // doPrint() called for the second time
    std::cout << "Ending main()\n";
 
    return 0;
}

Chương trình này tạo ra như sau:

Starting main()
In doPrint()
In doPrint()
Ending main()

Do doPrint được gọi hai lần bởi main, doPrint thực thi hai lần và In doPrint () được in hai lần.

3. Hàm gọi một hàm khác

Bạn đã thấy rằng hàm main có thể gọi một hàm khác (chẳng hạn như hàm doPrint trong ví dụ trên). Bất kỳ hàm nào cũng có thể gọi bất kỳ hàm khác. Trong chương trình sau, hàm main sẽ gọi doA và hàm doA sẽ gọi hàm doB:

#include <iostream> // for std::cout
 
void doB()
{
    std::cout << "In doB()\n";
}
 
 
void doA()
{
    std::cout << "Starting doA()\n";
 
    doB();
 
    std::cout << "Ending doA()\n";
}
 
// Definition of function main()
int main()
{
    std::cout << "Starting main()\n";
 
    doA();
 
    std::cout << "Ending main()\n";
 
    return 0;
}

Chương trình này tạo ra đầu ra sau:

Starting main()
Starting doA()
In doB()
Ending doA()
Ending main()

4. Không hỗ trợ Hàm lồng nhau

Không giống như một số ngôn ngữ lập trình khác, trong C ++, các hàm không thể được định nghĩa bên trong các hàm khác. Chương trình sau đây sẽ không chạy được:

#include <iostream>
 
int main()
{
    int foo() // Illegal: this function is nested inside function main()
    {
        std::cout << "foo!\n";
        return 0;
    }
 
    foo(); // function call to foo()
    return 0;
}

Cách thích hợp để viết chương trình trên là:

#include <iostream>
 
int foo() // no longer inside of main()
{
    std::cout << "foo!\n";
    return 0;
}
 
int main()
{
    foo();
    return 0;
}

Bài tập C++về Sử dụng Hàm

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!