Skip to content

Tự học C++ - Module 6: Hàm (Functions) chuyên sâu

TuanNDA
Published date:
Edit this post

Table of contents

Open Table of contents

1. Hàm (Function) là gì?

Hàm là một khối mã chỉ chạy khi nó được gọi. Bạn có thể truyền dữ liệu (gọi là tham số) vào hàm. Các hàm được dùng để thực hiện các hành động cụ thể và cực kỳ hữu ích để tái sử dụng mã: Định nghĩa một lần, và sử dụng nhiều lần.

Tạo một hàm:

C++ cung cấp sẵn các hàm như main(), nhưng bạn cũng có thể tự tạo hàm của riêng mình.

Cú pháp:

void myFunction() {
  // Khối mã sẽ được thực thi
}

2. Gọi một hàm (Calling a Function)

Hàm đã khai báo sẽ không chạy ngay lập tức. Nó được “lưu lại để dùng sau” và chỉ chạy khi được bạn gọi tên trong hàm main().

void myFunction() {
  cout << "Tôi vừa được thực thi!";
}

int main() {
  myFunction(); // Gọi hàm
  return 0;
}

3. Khai báo (Declaration) và Định nghĩa (Definition)

Một hàm C++ gồm hai phần:

Lưu ý: Nếu bạn định nghĩa hàm phía dưới main(), chương trình sẽ báo lỗi. Để giải quyết, bạn nên khai báo hàm phía trên main()định nghĩa nó ở phía dưới.

void myFunction(); // Khai báo (Prototype)

int main() {
  myFunction();
  return 0;
}

void myFunction() { // Định nghĩa
  cout << "Mã nguồn sạch sẽ hơn!";
}

4. Tham số và Đối số (Parameters & Arguments)

Tham số đóng vai trò như các biến bên trong hàm. Dữ liệu được truyền vào hàm khi gọi hàm được gọi là đối số.

Giá trị mặc định:

Bạn có thể đặt giá trị mặc định cho tham số. Nếu khi gọi hàm bạn không truyền đối số, hàm sẽ tự dùng giá trị mặc định này.

void myFunction(string country = "Việt Nam") {
  cout << country << "\n";
}

main() {
  myFunction("USA");    // In USA
  myFunction();         // In Việt Nam
}

Truyền tham chiếu (Pass By Reference):

Ở Module 5 chúng ta đã học về tham chiếu. Khi truyền tham chiếu vào hàm, mọi thay đổi bên trong hàm sẽ tác động trực tiếp lên biến gốc bên ngoài.

void swapNums(int &x, int &y) {
  int z = x; x = y; y = z;
}

5. Nạp chồng hàm (Function Overloading)

C++ cho phép nhiều hàm có cùng tên, miễn là danh sách tham số của chúng khác nhau về kiểu dữ liệu hoặc số lượng.

int plusFunc(int x, int y) { return x + y; }
double plusFunc(double x, double y) { return x + y; }

Việc này giúp bạn không cần phải đặt những tên hàm khô khan như plusFuncInt, plusFuncDouble.


6. Đệ quy (Recursion)

Đệ quy là kỹ thuật một hàm tự gọi lại chính nó. Đây là cách tuyệt vời để chia nhỏ các vấn đề phức tạp thành các bài toán đơn giản hơn.

Ví dụ tính tổng từ 1 đến K:

int sum(int k) {
  if (k > 0) {
    return k + sum(k - 1); // Đệ quy ở đây
  } else {
    return 0;
  }
}

int main() {
  int result = sum(10);
  cout << result; // Kết quả: 55
}

Cảnh báo: Hãy cực kỳ cẩn thận với đệ quy. Nếu không có “điểm dừng” (điều kiện thoát), hàm sẽ gọi nhau vô tận, gây tràn bộ nhớ và treo máy.


Lời kết Module 6

Hàm giúp mã nguồn của bạn trở nên chuyên nghiệp, gọn gàng và dễ bảo trì hơn rất nhiều. Hãy tập thói quen chia nhỏ các logic phức tạp vào các hàm riêng biệt.

Trong Module 7, chúng ta sẽ chính thức bước vào thế giới Lập trình hướng đối tượng (OOP) - trái tim của C++ hiện đại với Classes và Objects.

Hẹn gặp lại các bạn!

Previous
Tự học C++ - Module 7: Lập trình hướng đối tượng (OOP) cơ bản
Next
Tự học C++ - Module 5: Cấu trúc dữ liệu, Tham chiếu và Con trỏ