blog.dopana

Back

Bài thứ tư trong loạt C++ cơ bản. Hàm cho phép bạn đặt tên cho một khối code, cung cấp đầu vào, và gọi nó từ bất kỳ đâu — công cụ cốt lõi để tổ chức mọi chương trình.

Vì sao dùng hàm?#

Hàm giúp code tái sử dụng, dễ kiểm thử và dễ đọc. Thay vì sao chép cùng một logic, bạn viết một lần và gọi nhiều lần.

Hàm đầu tiên#

#include <iostream>

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

int main() {
    int result = add(3, 4);
    std::cout << result << '\n';  // in ra 7
}
cpp

add nhận hai tham số int và trả về int. Giá trị 34 là đối số.

Kiểu trả về và void#

Nếu hàm không trả về giá trị, kiểu trả về là void:

void greet(std::string name) {
    std::cout << "Hello, " << name << "!\n";
}
cpp

Khai báo trước#

Để gọi hàm trước định nghĩa — ví dụ khi tách code thành nhiều file — hãy khai báo trước:

int multiply(int x, int y);   // khai báo

int main() {
    std::cout << multiply(6, 7) << '\n';
}

int multiply(int x, int y) {  // định nghĩa
    return x * y;
}
cpp

Khai báo phải khớp chính xác với định nghĩa.

Tham số truyền theo giá trị#

Mặc định, C++ sao chép đối số vào tham số. Thay đổi bên trong hàm không ảnh hưởng người gọi:

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

int main() {
    int a = 5;
    increment(a);
    std::cout << a << '\n';  // vẫn là 5
}
cpp

Để sửa biến của người gọi, truyền tham chiếu — sẽ trình bày ở bài sau.

Đối số mặc định#

Tham số có thể có giá trị mặc định:

void print(std::string msg, int times = 1) {
    for (int i = 0; i < times; ++i) {
        std::cout << msg << '\n';
    }
}

print("hi");        // in một lần
print("hi", 3);     // in ba lần
cpp

Nạp chồng#

Hai hàm có thể trùng tên nếu danh sách tham số khác nhau:

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

Trình biên dịch chọn đúng hàm dựa trên kiểu đối số.

Kết luận#

Hàm là khối xây dựng của chương trình C++: khai báo, định nghĩa, gọi và tái sử dụng. Bài tiếp theo trong loạt: con trỏ và tham chiếu.

Tài liệu tham khảo#