Bỏ qua để đến nội dung

Giá trị trả về (return)

Câu lệnh return kết thúc việc thực thi hàm và trả về một giá trị cho nơi đã gọi hàm.

#include <iostream>
int square(int x) {
return x * x; // Trả về giá trị, kết thúc hàm ngay lập tức
}
int main() {
int result = square(5);
std::cout << result << std::endl; // 25
return 0;
}
int get_age() {
return 20; // OK
// return "20"; // LỖI BIÊN DỊCH - không thể trả về chuỗi cho hàm khai báo trả về int
}

Nếu giá trị trả về có kiểu khác nhưng chuyển đổi được, C++ sẽ tự động ép kiểu:

double get_price() {
return 100; // int 100 được tự động chuyển thành double 100.0
}

Code sau return (trong cùng nhánh thực thi) sẽ không bao giờ chạy:

int check_number(int n) {
if (n > 0) {
return 1; // Hàm kết thúc ngay tại đây nếu n > 0
}
if (n < 0) {
return -1;
}
return 0; // Chỉ chạy đến đây nếu n == 0
}

Hoàn toàn hợp lệ khi hàm có nhiều điểm return ở các nhánh khác nhau:

std::string classify_age(int age) {
if (age < 13) {
return "Thieu nhi";
} else if (age < 20) {
return "Thieu nien";
} else if (age < 60) {
return "Nguoi lon";
} else {
return "Nguoi cao tuoi";
}
}

Hàm khai báo kiểu void không bắt buộc phải có return - nếu có, chỉ dùng return; (không kèm giá trị) để thoát hàm sớm:

void print_positive(int n) {
if (n <= 0) {
std::cout << "So khong hop le" << std::endl;
return; // Thoát hàm sớm, không kèm giá trị
}
std::cout << "So duong: " << n << std::endl;
}

Một hàm C++ chỉ có thể trả về một giá trị. Để trả về nhiều giá trị cùng lúc, có thể dùng std::pair, std::tuple, hoặc struct:

#include <iostream>
#include <utility> // std::pair
std::pair<int, int> min_max(int a, int b, int c) {
int mn = std::min({a, b, c});
int mx = std::max({a, b, c});
return {mn, mx}; // Trả về cặp giá trị
}
int main() {
auto result = min_max(5, 2, 9);
std::cout << "Min: " << result.first << ", Max: " << result.second << std::endl;
return 0;
}
  • return giá_trị; kết thúc hàm ngay lập tức và trả về giá trị cho nơi gọi
  • Kiểu giá trị trả về phải khớp (hoặc chuyển đổi được) với kiểu khai báo của hàm
  • Hàm void không bắt buộc có return, nhưng có thể dùng return; để thoát sớm
  • Muốn trả về nhiều giá trị, dùng std::pair, std::tuple, hoặc struct