🧮 Hàm trong C++ – Cách viết và gọi hàm hiệu quả

Trong bất kỳ ngôn ngữ lập trình nào, hàm (function) là nền tảng cốt lõi giúp chia nhỏ chương trình, tái sử dụng mã nguồn và tổ chức tư duy giải quyết bài toán một cách khoa học. Với C++, ngôn ngữ nổi bật nhờ hiệu suất cao và tính linh hoạt, việc sử dụng hàm đúng cách không chỉ giúp mã ngắn gọn mà còn tăng khả năng bảo trì, kiểm thử và mở rộng về sau.

📌 Hàm là gì và tại sao lại quan trọng?

Một hàm là một đoạn mã độc lập được đặt tên, có thể nhận tham số đầu vào và trả về giá trị đầu ra.

🔁 Lợi ích khi dùng hàm:

  • 🧩 Giảm lặp lại mã nguồn (DRY – Don’t Repeat Yourself)
  • 🔄 Tăng tính tái sử dụng
  • 📐 Tách biệt logic, dễ đọc và dễ kiểm soát
  • 🧪 Hỗ trợ kiểm thử đơn vị (unit testing)

📌 Ví dụ đơn giản:

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

Sau đó có thể gọi ở bất kỳ đâu trong chương trình:

int main() {
    int kq = tong(5, 3);
    cout << "Tổng là: " << kq;
}

🧱 Cách khai báo và định nghĩa hàm trong C++

Cú pháp chuẩn:

<kiểu_trả_về> <tên_hàm>(<danh_sách_tham_số>) {
    // phần thân hàm
    return <giá_trị>;
}

📌 Ví dụ:

int giaithua(int n); // khai báo

🔁 Truyền tham số: Theo giá trị vs. Tham chiếu

🚩 Mặc định trong C++ là truyền theo giá trị (pass by value):

void tang(int x) {
    x++;
}

📉 Khi chạy tang(a); thì a không đổi, vì chỉ là bản sao.

🛠️ Truyền theo tham chiếu (pass by reference) sẽ thay đổi giá trị gốc:

void tang(int &x) {
    x++;
}

🧯 Hàm không trả giá trị (void) và không có tham số

Bạn có thể viết hàm không trả về gì:

void inChao() {
    cout << "Xin chào bạn!";
}

🎯 Khi bạn cần chỉ thực hiện một hành động mà không cần kết quả trả lại.

🔁 Đệ quy – khi hàm tự gọi chính nó

📦 Đệ quy rất hữu ích khi giải quyết bài toán có cấu trúc lặp theo từng cấp:

int giaiThua(int n) {
    if (n == 0) return 1;
    return n * giaiThua(n - 1);
}

⚠️ Chú ý điều kiện dừng để tránh vòng lặp vô hạn.

🧠 Mẹo viết hàm hiệu quả

Đặt tên rõ ràng, đúng hành động: ví dụ kiemTraSoNguyenTo, inMenu
Tách nhỏ các khối xử lý lớn thành hàm riêng
Truyền tham số qua tham chiếu khi cần thay đổi
Dùng const để bảo vệ dữ liệu truyền vào không bị sửa
Tránh sử dụng biến toàn cục tràn lan

🛡️ Viết hàm như một module riêng biệt – nguyên tắc giúp bạn phát triển chương trình lớn một cách chuyên nghiệp.

🧾 Kết luận

Trong thế giới lập trình C++, việc viết và sử dụng hàm hiệu quả là kỹ năng nền tảng nhưng mang giá trị lâu dài. Nó giúp chương trình:

  • Gọn gàng hơn
  • Dễ mở rộng
  • Có thể tái sử dụng và kiểm thử từng phần

💡 Viết hàm không chỉ là kỹ thuật – đó là tư duy tổ chức và giải quyết vấn đề có hệ thống.